RU UO Topic search - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Поиск

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

Выбор области и фильтров поиска, обработка результата, списка найденного и исключений. Проверяйте значение «не найдено» по карточке команды: serial, количество и список — разные результаты.

Разделы

Тема Команды и пояснения
Поиск предметов UO.FindType · UO.FindTypeEx · UO.FindTypesArrayEx · UO.FindAnyType
Поиск мобильных телефонов UO.FindMobile · UO.FindType
Поиск игроков UO.FindMobile · UO.FindType
Поиск NPC UO.FindMobile · UO.FindType
Поиск монстров UO.FindMobile · UO.FindType
Поиск по серийному номеру UO.Exists · UO.GetSerial
Поиск по типу UO.FindType · UO.FindTypeEx · UO.FindTypesArrayEx
Поиск по Notoriety UO.FindByNotoriety · UO.FindNotoriety
Поиск по расстоянию UO.FindDistance · UO.FindType
Поиск по координатам UO.FindAtCoord
Поиск по Z UO.FindVertical · UO.FindType
Поиск Ground UO.FindType · UO.CountGround
Поиск контейнеров UO.FindTypeEx · UO.OpenContainer
FindList UO.AddFindList · UO.FindList · UO.GetFindedList · UO.GetFoundItems · UO.FindItem · UO.FindCount · UO.FindQuantity · UO.FindFullQuantity
Ignore Lists UO.Ignore · UO.IgnoreOff · UO.IgnoreReset · UO.AddIgnoreList · UO.SelectIgnoreList
Bad Objects UO.SetBadObject · UO.ClearBadObjectList
Bad Locations UO.SetBadLocation · UO.ClearBadLocationList

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

Поиск предметов

UO.FindType · UO.FindTypeEx · UO.FindTypesArrayEx · UO.FindAnyType · UO.FindAtCoord · UO.FindItem · UO.FindCount · UO.FindQuantity · UO.FindFullQuantity · UO.Count · UO.CountEx · UO.CountGround · UO.GetWorldItems · UO.GetFoundItems · UO.GetFindedList

Поиск мобильных телефонов

UO.FindMobile · UO.FindMan · UO.FindByNotoriety · UO.FindNotoriety

Поиск по расстоянию / Z

UO.FindDistance · UO.FindVertical

FindList

UO.AddFindList · UO.ClearFindList · UO.DeleteFindList · UO.FindList · UO.InfoFindList · UO.MFGI

Ignore Списки

UO.Ignore · UO.IgnoreOff · UO.IgnoreReset · UO.AddIgnoreList · UO.ClearIgnoreList · UO.DeleteIgnoreList · UO.SelectIgnoreList · UO.GetIgnoreList

Плохие объекты

UO.SetBadObject · UO.ClearBadObjectList

Плохие локации

UO.SetBadLocation · UO.ClearBadLocationList

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

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

UO.FindType

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

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;

UO.FindFullQuantity

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

var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindFullQuantity();
UO.Print(Convert.ToString(value));

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

1 · 2

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


UO.AddFindList

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

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

void UO.AddFindList(object? list, object? @type);
void UO.AddFindList(object? list, object? @type, object? color);

Добавляет правило type/hue в именованный набор для UO.FindList. Набор позволяет повторно искать несколько видов предметов или тел mobiles и задавать приоритет типов порядком добавления.

Параметры

  • list — Имя набора правил, например "loot". Передавайте строку без |: этот знак используется внутри записи как разделитель. Регистр имени не учитывается. Это не serial контейнера и не массив найденных предметов.
  • type — Graphic/type предмета либо body mobile, а не его serial. Обычно int 0..65535, включая 0x0EED; -1 или 0xFFFF означают любой type при поиске. Указывайте одно значение на запись. Несколько типов добавляются отдельными вызовами.
  • color — Hue предмета/тела, не RGB. int 0..65535; 0 — обычный hue 0, -1 или 0xFFFF — любой. В AddFindList пропуск color означает любой hue при поиске.

Возвращает

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

Поведение

  • Определения находятся в состоянии данного скриптового runtime. Самостоятельный другой runtime имеет свой набор; закрытие окна IDE не является очисткой этих правил. Это не файл настроек и не список глобальных объектов игры.
  • AddFindList дописывает запись в конец; повторения не удаляются. Для повторной подготовки своего набора сначала вызывайте ClearFindList("имя"). Изменение определений не очищает уже полученные FindItem/FindCount/GetFoundItems.
  • Запись хранит текстовые поля. Числовой литерал 0x0EED сохраняется как "3821", строка "0x0EED" — как "0x0EED". Поиск преобразует оба варианта в число, а DeleteFindList сравнивает именно сохранённый текст. Используйте одинаковую форму при добавлении и удалении.
  • Неизвестное имя в FindList не является пустым зарегистрированным набором: движок пытается разобрать его как список числовых типов. Нечисловое имя вызывает ошибку преобразования. После удаления последней записи создайте новый набор до поиска по этому имени.
  • Аргументы сохраняются сразу; проверка числового type/hue выполняется при FindList. AddFindList не ищет, не переносит предметы и не добавляет serial в Ignore.

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

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

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

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

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

UO.Print("Calling UO.AddFindList");
UO.AddFindList("simple_loot", 0x0EED);

1. Подготовить собственный набор добычи и получить результаты — прямой скрипт

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

  • 0x0EED — золото, 0x0F7A — второй graphic набора. При других данных сервера замените graphics. Полная процедура BuildLoot приведена выше.
  • FindCount(item) читает количество единиц конкретного стека; GetFoundItems содержит distinct serial. Никакого переноса этот пример не выполняет.
BuildLoot();
var first = UO.FindList("loot", "ground", 2, -1, false, 5, false);
if (Truth(first == ""))
{
    UO.Print("No matching loot nearby");
    return null;
}
var items = UO.GetFoundItems();
foreach (var item in items)
{
    UO.Print(UO.GetName(item) + " | stack: " + Convert.ToString(UO.FindCount(item)));
}

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

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

2. Искать только предмет нужной окраски в рюкзаке — функция сценария

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

  • 0x0044 фильтрует hue; это не serial. backpack ищет прямое содержимое рюкзака. AddObject сохраняет выбранный объект под именем в этом runtime.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearFindList("colored");
    UO.AddFindList("colored", 0x0EED, 0x0044);
    var first = UO.FindList("colored", "backpack");
    if (Truth(first != ""))
    {
        UO.AddObject("colored_item", first);
    }

    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. Типы тел и несколько значений notoriety — класс сценария

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

  • В каждой записи отсутствующий color означает любой hue. Строка "5|6" разрешает два кода notoriety; этот фильтр исключает обычные Item. Поиск не атакует и не запускает Follow.
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("watch");
        UO.AddFindList("watch", 0x0190);
        UO.AddFindList("watch", 0x0191);
        var nearby = UO.FindList("watch", "ground", 12, "5|6", true, 10);
        if (Truth(nearby != ""))
        {
            UO.AddObject("watched_mobile", nearby);
        }

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

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

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

При вызове:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddFindList(list, type, color) — UO.AddFindList(Any,Any,Any)

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

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

При вызове:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddIgnoreList

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

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

void UO.AddIgnoreList(object? list, object? @type);
void UO.AddIgnoreList(object? list, object? @type, object? color);

Готовит именованный набор вещей, которые следует пропускать при поиске: например, не подбирать золото либо не выбирать вещи определённого цвета. Правило задаётся по type и hue, поэтому распространяется на все подходящие объекты, включая появившиеся позднее. После настройки включите набор через SelectIgnoreList.

Параметры

  • list — Произвольное непустое имя, например "loot_skip". Имя не учитывает регистр. Это не имя предмета, не serial контейнера и не имя FindList.
  • type — Graphic/type предмета либо body mobile. Например 0x0EED — золото, 0x0191 — женское человеческое тело. Число или числовая строка ("0x0EED", "3821"); -1/другое отрицательное/0xFFFF — любой type. Значения больше 65535 недопустимы. Для нескольких type добавьте несколько правил.
  • color — Hue: 0 — только неокрашенные, 0x0044 — пример точного цвета; отрицательное или 0xFFFF — любой. Значения больше 65535 недопустимы. В Add по умолчанию -1. Type и hue внутри одного правила соединяются условием И; разные правила — ИЛИ.

Возвращает

void — значения нет. Используйте отдельной строкой без var result = и без проверки =true. Команда изменяет локальный фильтр; не возвращает число предметов и ничего не отправляет серверу.

Поведение

  • Добавляет в список, указанный ПЕРВЫМ аргументом, независимо от текущего выбранного списка. Повторная численно одинаковая пара не дублируется.
  • Именованный список содержит правила 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() без аргументов очищает оба вида.
  • Состояние принадлежит общему состоянию скриптов профиля клиента; изменение влияет на другие скрипты с этим состоянием. Настройки входят в сохраняемый снимок. После изменения правил другой скрипт может уже выполнять поиск со снятым ранее снимком — следующий поиск увидит обновление.

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

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

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

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

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

UO.Print("Calling UO.AddIgnoreList");
UO.AddIgnoreList("simple_skip", 0x0EED);

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

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

  • loot_skip — название набора. Пропущенный color означает любой hue. FindType возвращает hex-строку ID или пустую строку; здесь результат сохраняется под next_loot, а предмет не перемещается. Поиск земли может найти и mobile.
UO.AddIgnoreList("loot_skip", 0x0EED);
UO.SelectIgnoreList("loot_skip");
var item = UO.FindType(-1, -1, "ground");
if (Truth(item == ""))
{
    UO.Print("No unignored ground object found");
    return null;
}
UO.AddObject("next_loot", item);

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

2. Исключить только одну окраску робы — функция сценария

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

  • 0x1F03 — graphic робы; 0x0044 — пример защищаемой окраски. Робу другого hue поиск допускает. Это защита от выбора фильтрующим поиском, не от прямого MoveItem по известному ID.
return  RunScenario();
 object? RunScenario()
{
    UO.AddIgnoreList("keep_colored", 0x1F03, 0x0044);
    UO.SelectIgnoreList("keep_colored");
    var robe = UO.FindType(0x1F03, -1, "backpack");
    if (Truth(robe != ""))
    {
        UO.AddObject("candidate_robe", robe);
    }

    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. Создать два независимых набора и включить один — класс сценария

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

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

     public object? RunScenario()
    {
        UO.AddIgnoreList("skip_gold", 0x0EED);
        UO.AddIgnoreList("skip_robes", 0x1F03);
        UO.SelectIgnoreList("skip_gold");
        UO.SelectIgnoreList("skip_robes");
        return null;
    }
}

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

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

UO.AddIgnoreList(list, type) — UO.AddIgnoreList(Any,Any)

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

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

При вызове:

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

case "addignorelist":

                    state.IgnoreTypeLists.Add(Text(0), ResolveType(arguments[1]),

                        arguments.Length > 2 ? NumberConversions.ToInt(arguments[2]) : -1);

                    break;

UO.AddIgnoreList(list, type, color) — UO.AddIgnoreList(Any,Any,Any)

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

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

При вызове:

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

case "addignorelist":

                    state.IgnoreTypeLists.Add(Text(0), ResolveType(arguments[1]),

                        arguments.Length > 2 ? NumberConversions.ToInt(arguments[2]) : -1);

                    break;

UO.ClearBadLocationList

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

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

void UO.ClearBadLocationList();

Удаляет все пары, сохранённые SetBadLocation.

Параметры

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

Возвращает

void — возвращаемого значения нет. Вызывайте отдельной строкой; это не true/false и не число шагов.

Поведение

  • Не меняет карту, персонажей или препятствия на сервере. Очищается только прикладной список runtime.
  • Уже полученный массив пути и снимок запретов идущего маршрута не изменяются. Для нового результата повторите запрос пути или запустите движение заново. Список SetBadObject очищается отдельно.

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

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

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

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

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

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

1. Очистить список — прямой скрипт

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

  • Параметров нет.
  • Возвращаемого значения нет.
UO.ClearBadLocationList();

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

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

  • Сначала удаляются прежние пары, затем добавляется новая.
  • Это не физическое препятствие и не изменение клиентской карты.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadLocationList();
    UO.SetBadLocation(1445, 1690);
    return null;
}

3. Повторить расчёт после очистки — класс сценария

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

  • Цель — четыре клетки восточнее, Optimized=true, Accuracy=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()
    {
        UO.ClearBadLocationList();
        var path = UO.GetPathArray(UO.GetX() + 4, UO.GetY(), true, 0);
        if (Truth(ArrayLength(path) == 0))
        {
            UO.Print("No complete path under current constraints");
        }

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

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

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

При вызове:

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

case "clearbadlocationlist": state.BadLocations.Clear(); return InjectionValue.Unit;

UO.ClearBadObjectList

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

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

void UO.ClearBadObjectList();

Удаляет все правила type/hue/radius, добавленные SetBadObject в текущем runtime.

Параметры

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

Возвращает

void — возвращаемого значения нет. Вызывайте отдельной строкой; это не true/false и не число шагов.

Поведение

  • Параметров нет. Повторный вызов при пустом списке безопасен.
  • Не очищает SetBadLocation и не убирает естественные препятствия. Новое движение или запрос пути использует очищенный список; ранее запущенный маршрут сохраняет собственный снимок.

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

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

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

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

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

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

1. Сбросить правила предметов — прямой скрипт

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

  • Аргументов нет; вызов записывается отдельной строкой.
  • Нет результата true/false и нет количества удалённых правил.
UO.ClearBadObjectList();

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

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

  • После очистки добавляется только type=0x398C любого цвета.
  • Radius=2 исключает квадрат 5×5 вокруг подходящих предметов при следующем маршруте.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadObjectList();
    UO.SetBadObject(0x398C, -1, 2);
    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.ClearBadObjectList();
        UO.ClearBadLocationList();
        var path = UO.GetPathArray(UO.GetX() + 3, UO.GetY(), true, 0);
        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.ClearBadObjectList() — UO.ClearBadObjectList()

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

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

При вызове:

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

case "clearbadobjectlist": state.BadObjects.Clear(); return InjectionValue.Unit;

UO.ClearFindList

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

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

void UO.ClearFindList();
void UO.ClearFindList(object? list);

Удаляет определения одного именованного набора поиска или всех наборов AddFindList текущего runtime. Используется перед повторной настройкой фильтров, чтобы правила не накапливались.

Параметры

  • list — Имя набора правил, например "loot". Передавайте строку без |: этот знак используется внутри записи как разделитель. Регистр имени не учитывается. Это не serial контейнера и не массив найденных предметов. Если аргумент отсутствует, удаляются ВСЕ определения AddFindList в этом runtime.

Возвращает

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

Поведение

  • Определения находятся в состоянии данного скриптового runtime. Самостоятельный другой runtime имеет свой набор; закрытие окна IDE не является очисткой этих правил. Это не файл настроек и не список глобальных объектов игры.
  • AddFindList дописывает запись в конец; повторения не удаляются. Для повторной подготовки своего набора сначала вызывайте ClearFindList("имя"). Изменение определений не очищает уже полученные FindItem/FindCount/GetFoundItems.
  • Запись хранит текстовые поля. Числовой литерал 0x0EED сохраняется как "3821", строка "0x0EED" — как "0x0EED". Поиск преобразует оба варианта в число, а DeleteFindList сравнивает именно сохранённый текст. Используйте одинаковую форму при добавлении и удалении.
  • Неизвестное имя в FindList не является пустым зарегистрированным набором: движок пытается разобрать его как список числовых типов. Нечисловое имя вызывает ошибку преобразования. После удаления последней записи создайте новый набор до поиска по этому имени.
  • Несуществующее имя безопасно: ничего не удаляется. Команда не удаляет игровые предметы, не очищает Ignore и не отменяет движение.

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

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

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

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

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

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

1. Повторная настройка одного набора — прямой скрипт

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

  • Внутри BuildLoot очищается только loot. Другие именованные наборы этого скрипта сохраняются.
BuildLoot();
BuildLoot();
UO.InfoFindList();

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

2. Заменить сезонный набор, сохранить запасной — функция сценария

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

  • Регистр SEASON не важен. reserve остаётся; в season теперь только новый type/hue. После очистки сначала добавляется запись, затем разрешён поиск по имени.
return  RunScenario();
 object? RunScenario()
{
    UO.AddFindList("reserve", 0x0EED);
    UO.AddFindList("season", 0x0F7A);
    UO.ClearFindList("SEASON");
    UO.AddFindList("season", 0x0EED, 0x0044);
    UO.InfoFindList();
    return null;
}

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

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

  • ClearFindList() действует на все определения текущего runtime, поэтому для библиотечной процедуры обычно лучше форма с собственным именем.
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.AddFindList("old_loot", 0x0EED);
        UO.AddFindList("old_watch", 0x0190);
        UO.AddFindList("old_watch", 0x0191);
        UO.ClearFindList();
        UO.AddFindList("current", 0x0F7A, -1);
        var found = UO.FindList("current", "backpack");
        if (Truth(found != ""))
        {
            UO.AddObject("current_supply", 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.ClearFindList() — UO.ClearFindList()

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

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

При вызове:

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

case "clearfindlist":

                    if (arguments.Length == 0) LegacyList("AddFindList").Clear();

                    else LegacyList("AddFindList").RemoveAll(value => value.Split('|')[0]

                        .Equals(Text(0), StringComparison.OrdinalIgnoreCase));

                    break;

UO.ClearFindList(list) — UO.ClearFindList(Any)

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

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

При вызове:

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

case "clearfindlist":

                    if (arguments.Length == 0) LegacyList("AddFindList").Clear();

                    else LegacyList("AddFindList").RemoveAll(value => value.Split('|')[0]

                        .Equals(Text(0), StringComparison.OrdinalIgnoreCase));

                    break;

UO.ClearIgnoreList

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

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

void UO.ClearIgnoreList();
void UO.ClearIgnoreList(object? list);

Сбрасывает исключения поиска. С именем — только один набор type/hue. Без аргументов — все именованные наборы и все serial, добавленные через Ignore. Полезно начать новую сортировку с чистыми правилами.

Параметры

  • list — Произвольное непустое имя, например "loot_skip". Имя не учитывает регистр. Это не имя предмета, не serial контейнера и не имя FindList. Необязателен. Его отсутствие означает общий сброс, а не только активный список.

Возвращает

void — значения нет. Используйте отдельной строкой без var result = и без проверки =true. Команда изменяет локальный фильтр; не возвращает число предметов и ничего не отправляет серверу.

Поведение

  • ClearIgnoreList("name") по результату равнозначен DeleteIgnoreList("name"). Пустая строка здесь недопустима; для отключения без удаления используйте SelectIgnoreList("").
  • Именованный список содержит правила 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() без аргументов очищает оба вида.
  • Состояние принадлежит общему состоянию скриптов профиля клиента; изменение влияет на другие скрипты с этим состоянием. Настройки входят в сохраняемый снимок. После изменения правил другой скрипт может уже выполнять поиск со снятым ранее снимком — следующий поиск увидит обновление.

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

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

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

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

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

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

1. Очистить временный набор, сохранив остальные — прямой скрипт

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

  • Удалён temporary, keep продолжает исключать робы. Обычный список serial не очищается.
UO.AddIgnoreList("temporary", 0x0EED);
UO.AddIgnoreList("keep", 0x1F03);
UO.ClearIgnoreList("temporary");
UO.SelectIgnoreList("keep");

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

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

  • Без аргументов снимаются оба вида исключений. Старые переменные/массивы не очищаются. Новый FindType заново формирует результат.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearIgnoreList();
    var item = UO.FindType(0x0EED, -1, "ground");
    if (Truth(item != ""))
    {
        UO.AddObject("fresh_gold", item);
    }

    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. Заменить содержимое набора — класс сценария

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

  • Старые правила sorting удалены до добавления новых: всё золото и только окраска 0x0044 у робы. Между отдельными командами другой скрипт может увидеть промежуточное состояние.
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.ClearIgnoreList("sorting");
        UO.AddIgnoreList("sorting", 0x0EED);
        UO.AddIgnoreList("sorting", 0x1F03, 0x0044);
        UO.SelectIgnoreList("sorting");
        return null;
    }
}

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

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

UO.ClearIgnoreList() — UO.ClearIgnoreList()

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

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

При вызове:

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

case "clearignorelist":

                    if (arguments.Length == 0)

                    {

                        IgnoreReset();

                        state.IgnoreTypeLists.Clear();

                    }

                    else

                        state.IgnoreTypeLists.Remove(Text(0));

                    break;

UO.ClearIgnoreList(list) — UO.ClearIgnoreList(Any)

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

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

При вызове:

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

case "clearignorelist":

                    if (arguments.Length == 0)

                    {

                        IgnoreReset();

                        state.IgnoreTypeLists.Clear();

                    }

                    else

                        state.IgnoreTypeLists.Remove(Text(0));

                    break;

UO.Count

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

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

int UO.Count(object? @type);
int UO.Count(object? @type, object? color);
int UO.Count(object? @type, object? color, object? container);

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

Параметры

  • type — Graphic/type предмета (например 0x0EED), не serial. -1 или 0xFFFF — любой type.
  • color — Hue предмета; -1 или 0xFFFF — любой цвет. В Count(type) и CountGround(type) по умолчанию -1.
  • container — В Count(type,color,container): my или числовой -1 — все предметы, корневой владелец которых self (включая экипировку и вложенные сумки); backpack/serial — содержимое указанного контейнера рекурсивно; UO.Ground(), явные 0/"0", ground или 1 — предметы и Mobile на земле. В CountEx числовой -1 и 0xFFFFFFFF тоже означают землю, а конкретный serial — только прямое содержимое. CountEx принимает backpack и имена AddObject; неизвестное имя вызывает ошибку скрипта. Проверяйте полученный serial до вызова: явный ноль выбирает землю, а не отсутствующий контейнер.

Возвращает

int — сумма max(1, Amount) найденных предметов; каждый Mobile добавляет 1. 0 без совпадений. Это число единиц, не число стопок. Одновременно обновляются FindItem, FindCount, FindFullQuantity и GetFoundItems.

Поведение

  • Count с одним или двумя аргументами ищет принадлежащие self предметы, включая экипировку и вложенные сумки. CountGround всегда ищет землю, включая подходящие Mobile, но исключая self.
  • Count(type,color,serial) обходит вложенные сумки, CountEx(type,color,serial) — только прямое содержимое. Ограничения FindDistance/FindVertical применяются к земле; Ignore применяется к найденным объектам.
  • Результат зависит от уже полученного содержимого контейнеров. Автоматического открытия и серверного запроса полного инвентаря нет.

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

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

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

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

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

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

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

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

  • type=0x0EED, color=-1. Область — рюкзак; учитывайте различие рекурсивности Count/CountEx.
  • Одна стопка из 1000 даст units=1000, не 1.
var units = UO.Count(0x0EED, -1, "backpack");
UO.Print("Units: " + Convert.ToString(units));

2. Показать единицы и число объектов отдельно — функция сценария

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

  • FindCount читается сразу после Count, до другого поиска.
  • Две стопки по 50 дают 2 items и 100 units.
return  RunScenario();
 object? RunScenario()
{
    var units = UO.Count(0x0EED, -1, "backpack");
    var items = UO.FindCount();
    UO.Print(Convert.ToString(items) + " items, " + Convert.ToString(units) + " units");
    return null;
}

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

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

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

     public object? RunScenario()
    {
        var units = UO.Count(0x0EED, -1, "backpack");
        if (Truth(units >= 100))
        {
            UO.Print("Enough units known to the client");
        }
        else
        {
            UO.Print("Not enough known units");
        }

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

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

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

При вызове:

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

public int Count(InjectionValue type) 

            => Count(ResolveType(type), -1, -1);

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

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

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

При вызове:

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

public int Count(InjectionValue type, InjectionValue color) 

            => Count(ResolveType(type), NumberConversions.ToInt(color), 0);

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

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

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

При вызове:

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

public int Count(InjectionValue type, InjectionValue color, InjectionValue container)

            => Count(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container));

UO.CountEx

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

UO.CountEx

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

Возвращает количество единиц предметов непосредственно в контейнере; вложенные сумки не обходит. Для земли также учитывает подходящих персонажей/NPC, по единице на каждого. FindDistance, FindVertical и Ignore продолжают действовать. Не изменяет FindItem, FindCount, FindFullQuantity или GetFoundItems.

objType — графика/type, а не serial. color — оттенок. Значение -1 или 0xFFFF означает любой type/оттенок. container — ID контейнера, UO.Backpack() для рюкзака или UO.Ground() для земли. Результат int: сумма max(1, Amount), 0 — совпадений нет. Учитываются только уже полученные данные; автоматического открытия сумок нет.

Примеры

int goldUnits = UO.CountEx(0x0EED, -1, UO.Backpack());
UO.Print(goldUnits.ToString());
UO.FindTypeEx(0x0EED, -1, UO.Backpack(), false);
int previousFoundItem = UO.FindItem();
int bandages = UO.CountEx(0x0E21, -1, UO.Backpack());
bool searchPreserved = UO.FindItem() == previousFoundItem;
UO.Print($"{bandages}; {searchPreserved}");
int units = CountBackpackUnits(0x0EED);
UO.Print(units.ToString());

int CountBackpackUnits(int graphic)
{
    return UO.CountEx(graphic, -1, UO.Backpack());
}
var counter = new InventoryCounter(UO);
UO.Print(counter.CountGold().ToString());

class InventoryCounter(ClassicUO.CSharp.CSharpGameApi api)
{
    public int CountGold() => api.CountEx(0x0EED, -1, api.Backpack());
}

Внутренняя реализация

ClassicUOInjectionApiBridge.CountDirectItems → MatchesFindIdentity / MatchesFindContainer / MatchesFindMobile.

UO.CountGround

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

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

int UO.CountGround(object? @type);
int UO.CountGround(object? @type, object? color);

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

Параметры

  • type — Graphic/type предмета (например 0x0EED), не serial. -1 или 0xFFFF — любой type.
  • color — Hue предмета; -1 или 0xFFFF — любой цвет. В Count(type) и CountGround(type) по умолчанию -1.

Возвращает

int — сумма max(1, Amount) найденных предметов; каждый Mobile добавляет 1. 0 без совпадений. Это число единиц, не число стопок. Одновременно обновляются FindItem, FindCount, FindFullQuantity и GetFoundItems.

Поведение

  • Count с одним или двумя аргументами ищет принадлежащие self предметы, включая экипировку и вложенные сумки. CountGround всегда ищет землю, включая подходящие Mobile, но исключая self.
  • Count(type,color,serial) обходит вложенные сумки, CountEx(type,color,serial) — только прямое содержимое. Ограничения FindDistance/FindVertical применяются к земле; Ignore применяется к найденным объектам.
  • Результат зависит от уже полученного содержимого контейнеров. Автоматического открытия и серверного запроса полного инвентаря нет.

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

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

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

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

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

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

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

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

  • type=0x0EED, color=-1. Область — земля рядом с персонажем.
  • Одна стопка из 1000 даст units=1000, не 1.
var units = UO.CountGround(0x0EED, -1);
UO.Print("Units: " + Convert.ToString(units));

2. Показать единицы и число объектов отдельно — функция сценария

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

  • FindCount читается сразу после Count, до другого поиска.
  • Две стопки по 50 дают 2 items и 100 units.
return  RunScenario();
 object? RunScenario()
{
    var units = UO.CountGround(0x0EED, -1);
    var items = UO.FindCount();
    UO.Print(Convert.ToString(items) + " items, " + Convert.ToString(units) + " units");
    return null;
}

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

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

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

     public object? RunScenario()
    {
        var units = UO.CountGround(0x0EED, -1);
        if (Truth(units >= 100))
        {
            UO.Print("Enough units known to the client");
        }
        else
        {
            UO.Print("Not enough known units");
        }

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

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

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

При вызове:

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

public int CountGround(InjectionValue type)

            => CountGround(type, new InjectionValue(-1));

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

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

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

При вызове:

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

public int CountGround(InjectionValue type, InjectionValue color)

            => bridge.Count(ResolveType(type), NumberConversions.ToInt(color), 1);

UO.DeleteFindList

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

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

void UO.DeleteFindList(object? list);
void UO.DeleteFindList(object? list, object? @type);
void UO.DeleteFindList(object? list, object? @type, object? color);

Удаляет все определения, совпадающие с указанным префиксом list, list/type или list/type/color. Позволяет убрать один вид предметов или конкретный hue, сохранив остальные правила набора.

Параметры

  • list — Имя набора правил, например "loot". Передавайте строку без |: этот знак используется внутри записи как разделитель. Регистр имени не учитывается. Это не serial контейнера и не массив найденных предметов.
  • type — Graphic/type предмета либо body mobile, а не его serial. Обычно int 0..65535, включая 0x0EED; -1 или 0xFFFF означают любой type при поиске. Указывайте одно значение на запись. Несколько типов добавляются отдельными вызовами. Для удаления сравнивается текст поля; пропуск удаляет все записи имени.
  • color — Hue предмета/тела, не RGB. int 0..65535; 0 — обычный hue 0, -1 или 0xFFFF — любой. В AddFindList пропуск color означает любой hue при поиске. Для удаления это буквальное поле, не wildcard: -1 удаляет только записи с явно сохранённым -1. Пропуск color удаляет все записи list/type независимо от hue.

Возвращает

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

Поведение

  • Определения находятся в состоянии данного скриптового runtime. Самостоятельный другой runtime имеет свой набор; закрытие окна IDE не является очисткой этих правил. Это не файл настроек и не список глобальных объектов игры.
  • AddFindList дописывает запись в конец; повторения не удаляются. Для повторной подготовки своего набора сначала вызывайте ClearFindList("имя"). Изменение определений не очищает уже полученные FindItem/FindCount/GetFoundItems.
  • Запись хранит текстовые поля. Числовой литерал 0x0EED сохраняется как "3821", строка "0x0EED" — как "0x0EED". Поиск преобразует оба варианта в число, а DeleteFindList сравнивает именно сохранённый текст. Используйте одинаковую форму при добавлении и удалении.
  • Неизвестное имя в FindList не является пустым зарегистрированным набором: движок пытается разобрать его как список числовых типов. Нечисловое имя вызывает ошибку преобразования. После удаления последней записи создайте новый набор до поиска по этому имени.
  • DeleteFindList(list,type,-1) не удаляет двухпараметрическую запись AddFindList(list,type): у неё нет третьего поля. Совпавшие дубликаты удаляются все; несуществующее совпадение ничего не меняет.

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

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

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

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

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

UO.AddFindList("simple_loot", 0x0EED);
UO.Print("Calling UO.DeleteFindList");
UO.DeleteFindList("simple_loot");

1. Исключить все окраски одного типа — прямой скрипт

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

  • Два аргумента удаляют обе записи золота: и любой hue, и hue 0x0044.
UO.ClearFindList("loot");
UO.AddFindList("loot", 0x0EED, -1);
UO.AddFindList("loot", 0x0EED, 0x0044);
UO.AddFindList("loot", 0x0F7A);
UO.DeleteFindList("loot", 0x0EED);
var found = UO.FindList("loot", "backpack");
if (Truth(found != ""))
{
    UO.AddObject("remaining_supply", found);
}

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

2. Убрать только один hue — функция сценария

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

  • Три аргумента: colors, graphic золота, конкретный hue. Остаётся только hue 0. В других наборах такой graphic не удаляется.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearFindList("colors");
    UO.AddFindList("colors", 0x0EED, 0);
    UO.AddFindList("colors", 0x0EED, 0x0044);
    UO.DeleteFindList("colors", 0x0EED, 0x0044);
    UO.InfoFindList();
    return null;
}

3. Удалить набор целиком и создать замену — класс сценария

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

  • Один аргумент удаляет все записи old. Если правила задавались строкой "0x0190", удаляйте той же строкой либо удалите набор по имени.
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.AddFindList("old", 0x0190);
        UO.AddFindList("old", 0x0191);
        UO.DeleteFindList("OLD");
        UO.AddFindList("new_watch", 0x0190, -1);
        UO.AddFindList("new_watch", 0x0191, -1);
        UO.InfoFindList();
        return null;
    }
}

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

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

UO.DeleteFindList(list) — UO.DeleteFindList(Any)

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

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

При вызове:

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

case "deletefindlist":

                    LegacyList("AddFindList").RemoveAll(value => LegacyListEntryMatches(value,

                        arguments));

                    break;

UO.DeleteFindList(list, type) — UO.DeleteFindList(Any,Any)

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

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

При вызове:

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

case "deletefindlist":

                    LegacyList("AddFindList").RemoveAll(value => LegacyListEntryMatches(value,

                        arguments));

                    break;

UO.DeleteFindList(list, type, color) — UO.DeleteFindList(Any,Any,Any)

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

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

При вызове:

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

case "deletefindlist":

                    LegacyList("AddFindList").RemoveAll(value => LegacyListEntryMatches(value,

                        arguments));

                    break;

UO.DeleteIgnoreList

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

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

void UO.DeleteIgnoreList(object? list);
void UO.DeleteIgnoreList(object? list, object? @type);
void UO.DeleteIgnoreList(object? list, object? @type, object? color);

Удаляет весь именованный фильтр либо выбранные правила внутри него. Используйте, когда определённый type или hue снова нужно допускать к поиску, сохранив остальные исключения.

Параметры

  • list — Произвольное непустое имя, например "loot_skip". Имя не учитывает регистр. Это не имя предмета, не serial контейнера и не имя FindList.
  • type — Graphic/type предмета либо body mobile. Например 0x0EED — золото, 0x0191 — женское человеческое тело. Число или числовая строка ("0x0EED", "3821"); -1/другое отрицательное/0xFFFF — любой type. Значения больше 65535 недопустимы. Для нескольких type добавьте несколько правил. Если не передан — удалить весь список; если передан без color — все правила именно этого type.
  • color — Hue: 0 — только неокрашенные, 0x0044 — пример точного цвета; отрицательное или 0xFFFF — любой. Значения больше 65535 недопустимы. В Add по умолчанию -1. Type и hue внутри одного правила соединяются условием И; разные правила — ИЛИ. При удалении задаёт точную маску правила; -1 удаляет правило «любой цвет», а не все отдельные цвета.

Возвращает

void — значения нет. Используйте отдельной строкой без var result = и без проверки =true. Команда изменяет локальный фильтр; не возвращает число предметов и ничего не отправляет серверу.

Поведение

  • Число 3821 и строка "0x0EED" обозначают один type. Удаление несуществующего правила ничего не меняет. Имя выбранного списка сохраняется, даже если сам список удалён; он становится пустым.
  • Именованный список содержит правила 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() без аргументов очищает оба вида.
  • Состояние принадлежит общему состоянию скриптов профиля клиента; изменение влияет на другие скрипты с этим состоянием. Настройки входят в сохраняемый снимок. После изменения правил другой скрипт может уже выполнять поиск со снятым ранее снимком — следующий поиск увидит обновление.

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

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

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

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

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

UO.AddIgnoreList("simple_skip", 0x0EED);
UO.Print("Calling UO.DeleteIgnoreList");
UO.DeleteIgnoreList("simple_skip");

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

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

  • Удаляется только temporary. Другие списки и Ignore(serial) сохраняются.
UO.AddIgnoreList("temporary", 0x0EED);
UO.SelectIgnoreList("temporary");
UO.DeleteIgnoreList("temporary");
var gold = UO.FindType(0x0EED, -1, "ground");

2. Разрешить все окраски одного type — функция сценария

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

  • Удалены оба правила робы, правило золота осталось. Общее правило -1,type-any другого вида, если было добавлено, само не удаляется.
return  RunScenario();
 object? RunScenario()
{
    UO.AddIgnoreList("sort", 0x1F03, 0);
    UO.AddIgnoreList("sort", 0x1F03, 0x0044);
    UO.AddIgnoreList("sort", 0x0EED);
    UO.DeleteIgnoreList("sort", 0x1F03);
    UO.SelectIgnoreList("sort");
    return null;
}

3. Удалить только правило точного цвета — класс сценария

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

  • 68 = 0x0044: числовые формы совпадают. Неокрашенные робы остаются исключены. Если существует ещё правило этого type с hue=-1, оно продолжит исключать и цвет 68.
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.AddIgnoreList("robes", 0x1F03, 0);
        UO.AddIgnoreList("robes", 0x1F03, 0x0044);
        UO.DeleteIgnoreList("robes", "0x1F03", 68);
        UO.SelectIgnoreList("robes");
        var robe = UO.FindType(0x1F03, 0x0044, "backpack");
        return null;
    }
}

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

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

UO.DeleteIgnoreList(list) — UO.DeleteIgnoreList(Any)

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

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

При вызове:

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

case "deleteignorelist":

                    state.IgnoreTypeLists.Remove(Text(0), arguments.Length > 1 ? ResolveType(arguments[1]) : (int?)null,

                        arguments.Length > 2 ? NumberConversions.ToInt(arguments[2]) : (int?)null);

                    break;

UO.DeleteIgnoreList(list, type) — UO.DeleteIgnoreList(Any,Any)

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

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

При вызове:

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

case "deleteignorelist":

                    state.IgnoreTypeLists.Remove(Text(0), arguments.Length > 1 ? ResolveType(arguments[1]) : (int?)null,

                        arguments.Length > 2 ? NumberConversions.ToInt(arguments[2]) : (int?)null);

                    break;

UO.DeleteIgnoreList(list, type, color) — UO.DeleteIgnoreList(Any,Any,Any)

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

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

При вызове:

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

case "deleteignorelist":

                    state.IgnoreTypeLists.Remove(Text(0), arguments.Length > 1 ? ResolveType(arguments[1]) : (int?)null,

                        arguments.Length > 2 ? NumberConversions.ToInt(arguments[2]) : (int?)null);

                    break;

UO.FindAnyType

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

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

int UO.FindAnyType(object? distance, object? @type);
int UO.FindAnyType(object? distance, object? @type, object? type2);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26, object? type27);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26, object? type27, object? type28);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26, object? type27, object? type28, object? type29);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26, object? type27, object? type28, object? type29, object? type30);
int UO.FindAnyType(object? distance, object? @type, object? type2, object? type3, object? type4, object? type5, object? type6, object? type7, object? type8, object? type9, object? type10, object? type11, object? type12, object? type13, object? type14, object? type15, object? type16, object? type17, object? type18, object? type19, object? type20, object? type21, object? type22, object? type23, object? type24, object? type25, object? type26, object? type27, object? type28, object? type29, object? type30, object? type31);

Находит ближайшего загруженного mobile с одним из заданных graphic тела. Применяется для поиска определённого вида существа. Предметы в сундуке или на земле эта команда не ищет: для них нужны FindType/FindList.

Параметры

  • distance — Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются.
  • type — Graphic тела mobile, не serial и не graphic предмета. Число 0..65534 или hex-строка, например 0x003B. Несколько значений объединяются как OR: число 5, строка "5|6" либо плоский массив чисел/числовых строк. Можно смешать плоский массив и отдельные аргументы. Порядок значений приоритет не задаёт. Нечисловые токены исключаются; полностью ошибочная маска не находит ничего. Вложенные массивы не являются числами и игнорируются как ошибочные элементы; многомерные маски не поддерживаются.
  • type2 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type3 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type4 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type5 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type6 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type7 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type8 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type9 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type10 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type11 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type12 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type13 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type14 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type15 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type16 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type17 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type18 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type19 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type20 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type21 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type22 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type23 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type24 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type25 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type26 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type27 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type28 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type29 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type30 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type31 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.

Возвращает

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

Поведение

  • Поиск читает только mobiles, уже загруженные клиентом; уничтоженные записи и Ignore исключены. Сам вызов не открывает target, не атакует, не идёт к цели и не запрашивает у сервера удалённые объекты.
  • Расстояние — геометрическое max(abs(dx),abs(dy)), не длина маршрута. Близость не гарантирует отсутствие стены или доступность другого этажа. Состояние может измениться после возврата.
  • Жизнь, скрытность и линия обзора автоматически не проверяются. Если они важны, используйте GetMobiles с aliveOnly/visibleOnly либо свои проверки. Наличие у сервера статуса Enemy не делает любого NPC подходящим.
  • Не изменяет FindItem, FindCount или GetFoundItems. Эти поля могут содержать результаты предыдущей другой команды: используйте непосредственно возвращённый ID.
  • От 2 до 32 аргументов: distance и до 31 маски type. Плоский массив позволяет передать больше значений. Каждое следующее значение после type — ещё body/type, не hue или notoriety.
  • В этой команде нет фильтра Z, notoriety, расы игрока или класса по одежде. Self НЕ исключается: если собственный graphic входит в маску и self не в Ignore, можно получить свой serial на расстоянии 0.
  • Выбирает ближайшего; одинаковое расстояние разрешается меньшим serial. -1/any/0xFFFF/пустая маска без конкретных типов дают 0: команда требует хотя бы один явный type. Рядом с конкретными type wildcard игнорируется.

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

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

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

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

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

var result = UO.FindAnyType(10, 0x003B);
UO.Print("FindAnyType: " + Convert.ToString(result));

1. Сохранить ближайшее существо нужного вида — прямой скрипт

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

  • 0x003B — body, не ID. Возврат creature — ID конкретного найденного mobile. Команда не проверяет Z, здоровье или агрессивность.
var creature = UO.FindAnyType(10, 0x003B);
if (Truth(creature != 0))
{
    UO.AddObject("creature", creature);
    UO.Print("Distance: " + Convert.ToString(UO.GetDistance(creature)));
}

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

2. Массив видов и дополнительный вид — функция сценария

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

  • bodies и отдельный 0x000C объединены. Если найден self, этот пример просто пропустит действие; он не ищет следующего кандидата. Для исключения self в самом запросе используйте соответствующий фильтр GetMobiles.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] bodies = new dynamic[checked((int)(0) + 1)];
    bodies[0] = 0x003B;
    var creature = UO.FindAnyType(18, bodies, 0x000C);
    if (Truth(creature != 0) && Truth(creature != Asc(UO.GetSerial("self"), 0)))
    {
        UO.AddObject("observed_creature", creature);
    }

    return null;
}

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

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

3. Вернуть расстояние до ближайшего нужного вида — класс сценария

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

  • body — graphic, radius — предел поиска X/Y. Помощник возвращает расстояние или собственный код -1; сама UO.FindAnyType возвращает serial или 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 distance = DistanceToBody(0x003B, 8);
        if (Truth(distance >= 0) && Truth(distance <= 3))
        {
            UO.Print("Creature is within three cells");
        }

        return null;
    }

    dynamic DistanceToBody(dynamic body, dynamic radius)
    {
        var found = UO.FindAnyType(radius, body);
        if (Truth(found == 0))
        {
            return -1;
        }

        return UO.GetDistance(found);
    }

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

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

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2) — UO.FindAnyType(Any,Any,Any)

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

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3) — UO.FindAnyType(Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4) — UO.FindAnyType(Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5) — UO.FindAnyType(Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26, type27) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any), type27 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26, type27, type28) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any), type27 (Any), type28 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26, type27, type28, type29) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any), type27 (Any), type28 (Any), type29 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26, type27, type28, type29, type30) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any), type27 (Any), type28 (Any), type29 (Any), type30 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAnyType(distance, type, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17, type18, type19, type20, type21, type22, type23, type24, type25, type26, type27, type28, type29, type30, type31) — UO.FindAnyType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), type (Any), type2 (Any), type3 (Any), type4 (Any), type5 (Any), type6 (Any), type7 (Any), type8 (Any), type9 (Any), type10 (Any), type11 (Any), type12 (Any), type13 (Any), type14 (Any), type15 (Any), type16 (Any), type17 (Any), type18 (Any), type19 (Any), type20 (Any), type21 (Any), type22 (Any), type23 (Any), type24 (Any), type25 (Any), type26 (Any), type27 (Any), type28 (Any), type29 (Any), type30 (Any), type31 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindAnyType(values[0], CombineMask(values, 1)))

UO.FindAtCoord

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

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

int UO.FindAtCoord(object? x, object? y);

Ищет загруженные объекты мира на одной точной клетке X/Y текущей карты.

Параметры

  • x — мировая координата по горизонтали, int 0..65535. Обязательна; это не пиксели окна контейнера.
  • y — мировая координата по вертикали, int 0..65535. Обязательна. Дополнительных параметров Z, карты, type или радиуса нет.

Возвращает

int — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type, количество или bool. Сохраняются все 32 бита; проверяйте != 0, не == true и не > 0. Тот же ID записывается в FindItem().

Поведение

  • Проверяет неудалённые Item на земле и Mobile, включая самого персонажа на этой клетке. Содержимое контейнеров и надетые вещи исключены: их X/Y нельзя считать координатами мира. Serial из списка Ignore исключаются.
  • Подходят все высоты Z на заданных X/Y. FindDistance и FindVertical не ограничивают этот поиск точной клетки. Видны только загруженные объекты текущего мира; ландшафт, статика и другая карта не загружаются. Пакеты не отправляются, target не открывается, предметы не перемещаются.
  • Каждый вызов сначала очищает предыдущий поиск. FindCount() считает объекты, FindFullQuantity() суммирует единицы в стопках (Mobile добавляет одну), GetFoundItems() возвращает найденные serial. Сначала обходятся Item, затем Mobile; внутри коллекций действует текущий порядок перечисления. Сохраните список до следующего поиска, который заменит результаты.
  • Порядок выбора и фильтры выше описывают реализацию этого клиента.

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

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

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

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

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

var result = UO.FindAtCoord(1445, 1690);
UO.Print("FindAtCoord: " + Convert.ToString(result));

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

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

  • 1445 и 1690 — пример мировых X/Y: замените их своей клеткой. id сохраняет один serial; HEX выводит его в шестнадцатеричном виде. != 0 проверяет наличие результата, не количество.
var id = UO.FindAtCoord(1445, 1690);
if (Truth(id != 0))
{
    UO.Print(Hex(id));
}
else
{
    UO.Print("No loaded object");
}

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;

2. Просмотреть все объекты на клетке персонажа — функция сценария

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

  • x/y читаются у персонажа; ids сохраняет список текущего поиска. Каждый id обозначает один объект, включая целую стопку. GetType(id) читает graphic/body. Предметы не выбираются и не используются.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX("self");
    var y = UO.GetY("self");
    UO.FindAtCoord(x, y);
    var ids = UO.GetFoundItems();
    foreach (var id in ids)
    {
        UO.Print(Hex(id) + " type=" + Hex(UO.GetType(id)));
    }

    return null;
}

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

3. Полная функция CountGraphicAt — класс сценария

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

  • CountGraphicAt(x, y, graphic) один раз ищет клетку, перебирает сохранённые ID и считает объекты с нужной графикой. graphic=0x0EED — золото. Возвращается число объектов/стопок, не сумма единиц и не true/false; одна стопка даёт один. Функция полностью определена после Main.
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 = CountGraphicAt(1445, 1690, 0x0EED);
        UO.Print("Objects/stacks: " + Convert.ToString(count));
        return null;
    }

    dynamic CountGraphicAt(dynamic x, dynamic y, dynamic graphic)
    {
        UO.FindAtCoord(x, y);
        var ids = UO.GetFoundItems();
        var count = 0;
        foreach (var id in ids)
        {
            if (Truth(UO.GetType(id) == graphic))
            {
                count += 1;
            }
        }

        return count;
    }

    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.FindAtCoord(x, y) — UO.FindAtCoord(Any,Any)

Параметры: x (Any), y (Any)

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

При вызове:

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

case "findatcoord": return new InjectionValue(bridge.FindAtCoord(Arg(0), Arg(1)));

UO.FindByNotoriety

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

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

int UO.FindByNotoriety(object? distance, object? notoriety);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26, object? notoriety27);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26, object? notoriety27, object? notoriety28);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26, object? notoriety27, object? notoriety28, object? notoriety29);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26, object? notoriety27, object? notoriety28, object? notoriety29, object? notoriety30);
int UO.FindByNotoriety(object? distance, object? notoriety, object? notoriety2, object? notoriety3, object? notoriety4, object? notoriety5, object? notoriety6, object? notoriety7, object? notoriety8, object? notoriety9, object? notoriety10, object? notoriety11, object? notoriety12, object? notoriety13, object? notoriety14, object? notoriety15, object? notoriety16, object? notoriety17, object? notoriety18, object? notoriety19, object? notoriety20, object? notoriety21, object? notoriety22, object? notoriety23, object? notoriety24, object? notoriety25, object? notoriety26, object? notoriety27, object? notoriety28, object? notoriety29, object? notoriety30, object? notoriety31);

Находит ближайшего другого персонажа/NPC с одним из указанных статусов notoriety. Полезна, когда нужно сначала выбрать противника, союзника или наблюдаемую цель, а уже потом отдельно решать, атаковать ли её или следовать за ней.

Параметры

  • distance — Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются.
  • notoriety — Статус отношения к персонажу, полученный от сервера: 0 — неизвестный, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 — Invulnerable. Число означает один статус; "5|6" или массив чисел — любой из перечисленных. Это не цвет одежды и не класс. Отрицательное число (обычно -1), 0xFFFF, "any", пустая строка или пустой массив отдельно отключают этот фильтр. Некорректная строка без допустимых чисел не находит никого. Порядок статусов приоритет не задаёт. Фильтр 5 выбирает Enemy, а не автоматически любого NPC/монстра; реальные значения зависят от сервера.Несколько значений объединяются как OR: число 5, строка "5|6" либо плоский массив чисел/числовых строк. Можно смешать плоский массив и отдельные аргументы. Порядок значений приоритет не задаёт. Нечисловые токены исключаются; полностью ошибочная маска не находит ничего. Вложенные массивы не являются числами и игнорируются как ошибочные элементы; многомерные маски не поддерживаются.
  • notoriety2 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety3 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety4 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety5 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety6 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety7 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety8 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety9 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety10 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety11 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety12 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety13 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety14 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety15 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety16 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety17 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety18 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety19 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety20 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety21 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety22 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety23 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety24 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety25 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety26 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety27 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety28 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety29 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety30 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • notoriety31 — Необязательная дополнительная маска notoriety; те же формы, что у notoriety. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.

Возвращает

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

Поведение

  • Поиск читает только mobiles, уже загруженные клиентом; уничтоженные записи и Ignore исключены. Сам вызов не открывает target, не атакует, не идёт к цели и не запрашивает у сервера удалённые объекты.
  • Расстояние — геометрическое max(abs(dx),abs(dy)), не длина маршрута. Близость не гарантирует отсутствие стены или доступность другого этажа. Состояние может измениться после возврата.
  • Жизнь, скрытность и линия обзора автоматически не проверяются. Если они важны, используйте GetMobiles с aliveOnly/visibleOnly либо свои проверки. Наличие у сервера статуса Enemy не делает любого NPC подходящим.
  • Не изменяет FindItem, FindCount или GetFoundItems. Эти поля могут содержать результаты предыдущей другой команды: используйте непосредственно возвращённый ID.
  • Минимум два аргумента: distance, notoriety. Максимум 32: радиус и до 31 маски. Для большего числа значений передайте плоский массив одним аргументом. Удаление фильтра: -1/any/0xFFFF/пустая строка или пустой массив отдельно. Если рядом указаны конкретные коды, они сохраняют ограничение.
  • Исключает self. Соблюдает UO.FindVertical() как предел разности Z; параметра maxZ в этой команде нет. Всегда выбирает ближайшего, при равенстве — меньший serial. Аргумент после notoriety — ещё notoriety, не nearest и не body.

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

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

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

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

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

var result = UO.FindByNotoriety(12, "5|6");
UO.Print("FindByNotoriety: " + Convert.ToString(result));

1. Выбрать ближайшую цель и сохранить её имя — прямой скрипт

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

  • Сохранённый opponent можно использовать позже; этот пример не атакует. Также действует текущий FindVertical, даже если цель близка по X/Y.
var found = UO.FindByNotoriety(12, "5|6");
if (Truth(found != 0))
{
    UO.AddObject("opponent", found);
    UO.Print("Selected: " + UO.GetName(found));
}

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

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

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

  • allowed содержит Enemy, отдельный 6 добавляет Murderer. Статусы объединяются, а не сортируются по приоритету. Пример запрашивает атаку одного найденного живого mobile; правила сервера определяют допустимость.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
    allowed[0] = 5;
    var found = UO.FindByNotoriety(8, allowed, 6);
    if (Truth(found != 0) && !(Truth(UO.IsDead(found))))
    {
        UO.Attack(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. Полная функция поиска на одинаковой высоте — класс сценария

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

  • radius — радиус X/Y в клетках. FindVertical(0) требует одинаковую Z; это не проверка этажа или стен. Функция возвращает ID/0, а Finally сохраняет настройку других частей скрипта.
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 = FindOpponentAtSameLevel(10);
        if (Truth(found != 0))
        {
            UO.AddObject("same_level", found);
        }

        return null;
    }

    dynamic FindOpponentAtSameLevel(dynamic radius)
    {
        var previous = UO.FindVertical();
        try
        {
            UO.FindVertical(0);
            return UO.FindByNotoriety(radius, "5|6");
        }
        finally
        {
            UO.FindVertical(previous);
        }
    }

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

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

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2) — UO.FindByNotoriety(Any,Any,Any)

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

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3) — UO.FindByNotoriety(Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4) — UO.FindByNotoriety(Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26, notoriety27) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any), notoriety27 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26, notoriety27, notoriety28) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any), notoriety27 (Any), notoriety28 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26, notoriety27, notoriety28, notoriety29) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any), notoriety27 (Any), notoriety28 (Any), notoriety29 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26, notoriety27, notoriety28, notoriety29, notoriety30) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any), notoriety27 (Any), notoriety28 (Any), notoriety29 (Any), notoriety30 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindByNotoriety(distance, notoriety, notoriety2, notoriety3, notoriety4, notoriety5, notoriety6, notoriety7, notoriety8, notoriety9, notoriety10, notoriety11, notoriety12, notoriety13, notoriety14, notoriety15, notoriety16, notoriety17, notoriety18, notoriety19, notoriety20, notoriety21, notoriety22, notoriety23, notoriety24, notoriety25, notoriety26, notoriety27, notoriety28, notoriety29, notoriety30, notoriety31) — UO.FindByNotoriety(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: distance (Any), notoriety (Any), notoriety2 (Any), notoriety3 (Any), notoriety4 (Any), notoriety5 (Any), notoriety6 (Any), notoriety7 (Any), notoriety8 (Any), notoriety9 (Any), notoriety10 (Any), notoriety11 (Any), notoriety12 (Any), notoriety13 (Any), notoriety14 (Any), notoriety15 (Any), notoriety16 (Any), notoriety17 (Any), notoriety18 (Any), notoriety19 (Any), notoriety20 (Any), notoriety21 (Any), notoriety22 (Any), notoriety23 (Any), notoriety24 (Any), notoriety25 (Any), notoriety26 (Any), notoriety27 (Any), notoriety28 (Any), notoriety29 (Any), notoriety30 (Any), notoriety31 (Any)

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

При вызове:

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

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

values => new InjectionValue(FindFilteredMobileSerial(-1, CombineMask(values, 1),

                        NumberConversions.ToInt(values[0]), true, bridge.GetFindVertical(), -1, false))

UO.FindCount

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

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

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

Читает количество единиц в указанной стопке, если передан ID. Форма без аргументов сохраняет отдельный смысл: число объектов последнего поиска.

Параметры

  • id — Serial/ID конкретного объекта: int, десятичная/hex-строка или установленный алиас self, backpack, lasttarget, lastobject либо имя AddObject. Это не graphic/type. Необязательный аргумент. При переданном ID читается текущий Amount именно этого предмета. Алиас finditem явно выбирает первый результат поиска. Без аргумента возвращается число найденных объектов.

Возвращает

int: FindCount(id) — количество единиц в указанной стопке (Amount); обычный одиночный предмет даёт 1, неизвестный/удалённый предмет, ошибочный алиас или Mobile дают 0. FindCount() без ID — число объектов в последнем поиске: одна стопка считается одним объектом независимо от Amount. Например, три стопки по 20, 50 и 100: FindCount()=3, FindCount(ID второй стопки)=50, FindFullQuantity()=170.

Поведение

  • FindCount(id) эквивалентна чтению GetQuantity(id), не запускает поиск и не изменяет FindItem/FindCount()/FindFullQuantity/GetFoundItems.
  • ID означает serial конкретного предмета, не type. Изменение количества отражается при следующем вызове FindCount(id). Количество в удалённом предмете равно 0; это не автоматический поиск другой стопки.
  • Исходная совместимость без аргументов сохранена: FindCount() считает объекты. FindQuantity() читает одну найденную стопку, 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");
var result = UO.FindCount();
UO.Print("FindCount: " + Convert.ToString(result));

1. Количество в конкретной стопке по ID — прямой скрипт

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

  • id=0x40001234 — пример serial стопки. Замените своим ID предмета.
  • Стопка из 50 единиц вернёт 50; одиночный предмет — 1; неизвестный ID — 0.
var amount = UO.FindCount("0x40001234");
UO.Print("Units: " + Convert.ToString(amount));

2. Найти предмет и прочитать его количество — функция сценария

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

  • FindType получает type золота 0x0EED, любой hue=-1, область backpack и возвращает serial.
  • В FindCount передаётся возвращённый serial item. Сам type 0x0EED сюда передавать нельзя.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var units = UO.FindCount(item);
        UO.Print(Convert.ToString(units));
    }

    return null;
}

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

3. Количество в последней цели и в сохранённом имени — класс сценария

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

  • lasttarget должен указывать на предмет. AddObject сохраняет этот serial под именем selected_stack.
  • FindCount разрешает имя в ID и читает Amount. Если выбрана цель-персонаж, возвращается 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(item)))
        {
            UO.AddObject("selected_stack", item);
            UO.Print(Convert.ToString(UO.FindCount("selected_stack")));
        }

        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. Измерить результат поиска золота — прямой скрипт

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

  • type=0x0EED — золото; color=-1 — любой hue; backpack — только прямое содержимое рюкзака в этой форме FindType.
  • int — число найденных items/персонажей, 0 без совпадений. Одна стопка из 1000 единиц считается одним объектом. Это не сумма единиц, для неё нужен FindFullQuantity.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindCount();
UO.Print(Convert.ToString(value));

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

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

  • Все четыре чтения относятся к одному поиску, пока между ними не вызван другой поиск.
  • Например, две стопки по 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");

6. Сохранить результат до следующего поиска — класс сценария

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

  • Первый 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.FindCount();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindCount()));
        return null;
    }
}

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

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

UO.FindCount() — UO.FindCount()

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

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

При вызове:

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

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

UO.FindCount(id) — UO.FindCount(Any)

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

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

При вызове:

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

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

UO.FindDistance

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

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

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

Читает или изменяет горизонтальный радиус поиска по умолчанию.

Параметры

  • value — Необязательный int. Без аргумента — чтение; value — установка. Значение ограничивается диапазоном 0..255; отрицательное становится 0, а не безлимитом. В новом runtime: 18; восстановленное состояние может содержать другое значение. Дробное число усекается к нулю; допустимы также числовые строки double/0x. Используйте int, чтобы избежать неявного преобразования.

Возвращает

Без аргументов: int — текущий предел (расстояние в клетках), не найденный ID, количество объектов или bool. 0 означает нулевой предел, а не неудачу. С value: void — значения нет; это не true/false и не прежняя настройка. После установки прочитайте FindDistance(), чтобы узнать сохранённое значение.

Поведение

  • Расстояние: max(abs(dx), abs(dy)) от текущей точки отсчёта дальности клиента; диагональная клетка считается за одну. Граница включается. При 0 подходят только объекты на тех же X/Y. Для движущихся Mobile расстояние учитывает конечную позицию очереди шагов.
  • Настройка хранится в 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.FindDistance();
UO.Print("FindDistance: " + Convert.ToString(result));

1. Чтение, установка и ограничение диапазона — прямой скрипт

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

  • previous сохраняет фактическую настройку. value:=5 задаёт обычный предел; 1000 показывает ограничение до 255. Print читает результат отдельным вызовом без аргумента. Finally восстанавливает previous.
var previous = UO.FindDistance();
try
{
    UO.FindDistance(5);
    UO.Print(Convert.ToString(UO.FindDistance()));
    UO.FindDistance(1000);
    UO.Print(Convert.ToString(UO.FindDistance()));
}
finally
{
    UO.FindDistance(previous);
}

2. Временный поиск на земле — функция сценария

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

  • previous сохраняет настройку вызывающего кода. 5 меняет только FindDistance; второй предел остаётся прежним. 0x0EED — графика золота, -1 — любой hue, Container=-1 — мир, false — без рекурсии контейнеров. id — один serial; != 0 проверяет наличие. FindCount считает целые объекты/стопки. Finally восстанавливает настройку, а не список результатов.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindDistance();
    try
    {
        UO.FindDistance(5);
        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.FindDistance(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.FindDistance() — UO.FindDistance()

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

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

При вызове:

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

case "finddistance":

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

                    return new InjectionValue(bridge.GetFindDistance());

UO.FindDistance(value) — UO.FindDistance(Any)

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

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

При вызове:

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

case "finddistance":

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

                    return new InjectionValue(bridge.GetFindDistance());

UO.FindFullQuantity

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

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

dynamic UO.FindFullQuantity();

Читает общее количество единиц в снимке последнего поиска.

Параметры

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

Возвращает

int — сумма max(1, Amount) найденных предметов; каждый найденный персонаж добавляет 1. 0 без совпадений. Две стопки по 50 дают 100, а FindCount даст 2. Это снимок на момент поиска, не постоянно обновляемая сумма.

Поведение

  • Данные принадлежат последнему обычному поиску этого скрипта. 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.FindFullQuantity();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Измерить результат поиска золота — прямой скрипт

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

  • type=0x0EED — золото; color=-1 — любой hue; backpack — только прямое содержимое рюкзака в этой форме FindType.
  • int — сумма max(1, Amount) найденных предметов; каждый найденный персонаж добавляет 1. 0 без совпадений. Две стопки по 50 дают 100, а FindCount даст 2. Это снимок на момент поиска, не постоянно обновляемая сумма.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindFullQuantity();
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.FindFullQuantity();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindFullQuantity()));
        return null;
    }
}

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

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

UO.FindFullQuantity() — UO.FindFullQuantity()

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

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

При вызове:

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

case "findfullquantity": return new InjectionValue(bridge.FindFullQuantity());

UO.FindItem

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

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

dynamic UO.FindItem();

Читает serial первого результата последнего обычного поиска.

Параметры

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

Возвращает

int — serial/ID первого найденного объекта, 0 при отсутствии результата. Это числовой serial, тогда как FindType возвращает hex-строку или пустую строку. Не возвращает type.

Поведение

  • Данные принадлежат последнему обычному поиску этого скрипта. 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.FindItem();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Измерить результат поиска золота — прямой скрипт

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

  • type=0x0EED — золото; color=-1 — любой hue; backpack — только прямое содержимое рюкзака в этой форме FindType.
  • int — serial/ID первого найденного объекта, 0 при отсутствии результата. Это числовой serial, тогда как FindType возвращает hex-строку или пустую строку. Не возвращает type.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindItem();
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.FindItem();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindItem()));
        return null;
    }
}

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

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

UO.FindItem() — UO.FindItem()

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

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

При вызове:

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

case "finditem": return new InjectionValue(bridge.FindItem);

UO.FindList

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

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

string UO.FindList(object? list);
string UO.FindList(object? list, object? container);
string UO.FindList(object? list, object? container, object? distance);
string UO.FindList(object? list, object? container, object? distance, object? notoriety);
string UO.FindList(object? list, object? container, object? distance, object? notoriety, object? nearest);
string UO.FindList(object? list, object? container, object? distance, object? notoriety, object? nearest, object? maxZ);
string UO.FindList(object? list, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? includeIgnored);

Ищет загруженные предметы или mobiles по нескольким type/hue. Возвращает первый serial строкой и сохраняет весь упорядоченный результат для FindItem, FindCount и GetFoundItems.

Параметры

  • list — Имя непустого набора AddFindList; либо плоский массив числовых type; либо строка типов с разделителями |, запятая, точка с запятой или пробел, например "0x0EED|0x0F7A". Массив/строка типов используют любой hue. Пары [type,hue] внутри массива не поддерживаются; для hue создайте именованный набор. Порядок записей задаёт приоритет. Graphic/type предмета либо body mobile, а не его serial. Обычно int 0..65535, включая 0x0EED; -1 или 0xFFFF означают любой type при поиске. Указывайте одно значение на запись. Несколько типов добавляются отдельными вызовами.
  • container — По умолчанию -1: вещи, чей корневой контейнер — персонаж (в том числе вложенные сумки и экипировка). "my" = -1. ground, "ground", UO.Ground(), числовые 0 или 1 выбирают мир: предметы на земле и mobiles, кроме self. "backpack" или serial контейнера >1 ищут только прямое содержимое, без рекурсии. Объектный алиас разрешается как serial; неверный алиас может дать 0, поэтому проверьте его через GetSerial заранее.
  • distance — Неотрицательный радиус клеток по max(abs(dx),abs(dy)); диагональ — одна клетка. Действует на поиск ground; прямое содержимое контейнера по расстоянию не ограничивается. По умолчанию и при отрицательном аргументе берётся UO.FindDistance(). 0 — те же X/Y.
  • notoriety — По умолчанию -1, любой код. Одно число, строка "5|6" или плоский массив чисел задают разрешённые коды mobiles; при таком фильтре Items исключены. Коды: 0 неизвестно, 1 innocent, 2 ally, 3 gray, 4 criminal, 5 enemy, 6 murderer, 7 invulnerable; смысл отношений задаёт сервер. Пустая маска/any/-1 без конкретных кодов не ограничивает. При смешивании wildcard и кодов конкретные коды остаются ограничением. Нечисловые токены игнорируются рядом с корректными; маска только из ошибочных токенов не находит ничего.
  • nearest — По умолчанию false. false/0: сначала приоритет записи list, затем меньший serial. true/1: сначала расстояние, затем приоритет записи, затем serial. Это порядок, а не дополнительный фильтр.
  • maxZ — Допустимое абсолютное отличие Z от персонажа включительно. По умолчанию или при отрицательном аргументе используется UO.FindVertical(); 0 допускает только одинаковую Z. Для явного serial контейнера >1 берётся Z загруженного контейнера (если его нет — Z вещи); для остальных режимов — Z кандидата. Координаты вещи в gump не являются высотой мира.
  • includeIgnored — По умолчанию false: serial из Ignore данного runtime исключаются. true/1 включает их только в этот поиск и не очищает Ignore.

Возвращает

string: hex-serial первого результата (например "0x40000011") или пустая строка "" при отсутствии совпадений. Это ID, не type, количество и не bool: проверяйте result != "", а не result == true. При нормальном непустом запросе FindItem хранит тот же ID числом, FindCount() — число distinct объектов, GetFoundItems() — массив их числовых serial.

Поведение

  • От 1 до 7 позиционных аргументов; пропускать можно только хвост. Чтобы задать maxZ, явно передайте предшествующие аргументы. Поиск синхронный по локально загруженному состоянию: не открывает контейнер, не подгружает содержимое, не проверяет линию обзора/доступность и не атакует.
  • Каждый объект включается один раз, даже если совпал с несколькими правилами. Его приоритет — первая совпавшая запись. Неизвестное имя пытается разбираться как строка типов; нечитаемый type/hue вызывает ошибку преобразования.
  • Непустой запрос очищает предыдущие FindItem/FindCount/GetFoundItems до отбора; отсутствие совпадений оставляет пустые результаты. Исключение: пустой массив или пустая строка list возвращают "" ДО обращения к поиску и сохраняют прежние результаты. Не считайте FindCount после такого вызова новым результатом.
  • Изменение определений AddFindList/ClearFindList/DeleteFindList не меняет уже найденный набор. Другой поиск в этом runtime заменяет FindItem и общий массив, поэтому сохраняйте GetFoundItems перед вложенным поиском.
  • Определения находятся в состоянии данного скриптового runtime. Самостоятельный другой runtime имеет свой набор; закрытие окна IDE не является очисткой этих правил. Это не файл настроек и не список глобальных объектов игры.
  • AddFindList дописывает запись в конец; повторения не удаляются. Для повторной подготовки своего набора сначала вызывайте ClearFindList("имя"). Изменение определений не очищает уже полученные FindItem/FindCount/GetFoundItems.
  • Запись хранит текстовые поля. Числовой литерал 0x0EED сохраняется как "3821", строка "0x0EED" — как "0x0EED". Поиск преобразует оба варианта в число, а DeleteFindList сравнивает именно сохранённый текст. Используйте одинаковую форму при добавлении и удалении.
  • Неизвестное имя в FindList не является пустым зарегистрированным набором: движок пытается разобрать его как список числовых типов. Нечисловое имя вызывает ошибку преобразования. После удаления последней записи создайте новый набор до поиска по этому имени.

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

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

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

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

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

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

1. Выбрать ресурс по приоритету и перенести одну стопку — прямой скрипт

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

  • При false золото имеет приоритет над вторым type даже при большей дистанции. Радиус 2 и maxZ=5 ограничивают кандидатов; они не гарантируют право поднять вещь.
  • Это реальное игровое действие: переносится только первый найденный объект. Результат MoveItem не означает подтверждение сервером всего перемещения.
BuildLoot();
var item = UO.FindList("loot", "ground", 2, -1, false, 5);
if (Truth(item == ""))
{
    return null;
}
var accepted = UO.MoveItem(item, 0, "backpack");
if (Truth(accepted == 0))
{
    UO.Print("Move was not accepted");
}

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

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

2. Сохранить ближайшего mobile из двух notoriety — функция сценария

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

  • Семь параметров: два body, мир, радиус 12, коды 5 или 6, ближайший первым, разница Z не больше 10, игнорированные исключены. Здесь только выбор и сохранение; атакующий скрипт должен отдельно проверить подходящие условия.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.FindList("0x0190|0x0191", "ground", 12, "5|6", true, 10, false);
    if (Truth(target != ""))
    {
        UO.AddObject("candidate", target);
        UO.Print("Candidate: " + UO.GetName(target));
    }

    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. Посчитать запасы нескольких типов из массива — класс сценария

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

  • объявление переменной types[1] создаёт индексы 0 и 1 в этом движке. Суммируются единицы двух видов, а не число стопок. backpack ограничен прямым содержимым; вложенные сумки сюда не входят.
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[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0EED;
        types[1] = 0x0F7A;
        var first = UO.FindList(types, "backpack");
        var total = 0;
        if (Truth(first != ""))
        {
            var items = UO.GetFoundItems();
            foreach (var item in items)
            {
                total += UO.FindCount(item);
            }
        }

        if (Truth(total < 100))
        {
            UO.Print("Stock below limit: " + Convert.ToString(total));
        }

        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.FindList(list) — UO.FindList(Any)

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container) — UO.FindList(Any,Any)

Параметры: list (Any), container (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container, distance) — UO.FindList(Any,Any,Any)

Параметры: list (Any), container (Any), distance (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container, distance, notoriety) — UO.FindList(Any,Any,Any,Any)

Параметры: list (Any), container (Any), distance (Any), notoriety (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container, distance, notoriety, nearest) — UO.FindList(Any,Any,Any,Any,Any)

Параметры: list (Any), container (Any), distance (Any), notoriety (Any), nearest (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container, distance, notoriety, nearest, maxZ) — UO.FindList(Any,Any,Any,Any,Any,Any)

Параметры: list (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))

UO.FindList(list, container, distance, notoriety, nearest, maxZ, includeIgnored) — UO.FindList(Any,Any,Any,Any,Any,Any,Any)

Параметры: list (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), includeIgnored (Any)

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

При вызове:

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

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

values => new InjectionValue(CompactFindList(values))
⚠️ **GitHub.com Fallback** ⚠️