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

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

Поиск — 2

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

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

1 · 2

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


UO.FindMan

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

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

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

Находит один serial по notoriety, расстоянию, высоте, телу и hue. Применяется для предварительного выбора цели без автоматической атаки.

Параметры

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

Возвращает

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

Поведение

  • Поиск локальный: только уже загруженные mobiles. Учитывается Ignore; self исключён, кроме явного includeSelf=true в поддерживающих его командах. Контейнеры и предметы не являются mobiles.
  • Условия применяются вместе (AND). Допустимые альтернативы внутри body/notoriety объединены через OR. Поиск не меняет FindItem, FindCount и GetFoundItems.
  • В body/notoriety маска с допустимыми числами использует именно их: "any|5" всё равно ограничивает значением 5. Пустые/неверные элементы рядом с допустимыми числами игнорируются. Для отсутствия ограничения передайте -1 отдельно. Не переносите это правило на classMask: неизвестное имя класса отклоняет весь список.
  • Команды не открывают область мира, не бегут к цели и не проверяют проходимость маршрута. Между выбором и обработкой сервером состояние мира может измениться.
  • Передача true и 1 равнозначна для флагов, false и 0 также. Другие ненулевые числа тоже преобразуются в true, но 8/9 не являются отдельными режимами; используйте понятные true/false.
  • Точный порядок: notoriety, distance, nearest, maxZ, body, color, includeSelf. Отличается от AttackNearest и GetMobiles.
  • Нет параметров classMask, aliveOnly или visibleOnly. При необходимости проверяйте найденный ID отдельно; для выбора среди всех живых/видимых используйте GetMobiles, чтобы мёртвый ближайший не заслонял остальных.

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

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

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

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

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

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

1. Найти и сохранить ближайшего союзника — прямой скрипт

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

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

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

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

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

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

    return null;
}

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

3. Найти первый mobile с конкретным hue — класс сценария

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

  • Первый -1 отключает notoriety, второй -1 отключает body. false в третьей позиции выключает сортировку; последний false исключает self. Hue одежды не проверяется.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var chosenHue = 0x0455;
        var mobile = UO.FindMan(-1, 10, false, 8, -1, chosenHue, false);
        if (Truth(mobile == 0))
        {
            return null;
        }

        UO.AddObject("body_hue_match", mobile);
        return null;
    }

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

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

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

UO.FindMan() — UO.FindMan()

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

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

При вызове:

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

case "findman":

                {

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

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

                    break;

                }

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMobile

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

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

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

Находит одного ближайшего загруженного персонажа/существо по совместным строковым фильтрам. Самого игрока исключает.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return null;
}

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

3. Полная функция для составного фильтра — класс сценария

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

  • В helper передаётся строка "north east". Это несколько условий одного запроса, а не последовательный поиск разных целей.
  • FindAndDescribe объявлена целиком. Она возвращает ID/0, не меняя target или персонажа.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var id = FindAndDescribe("north east");
        UO.Print("Returned ID: " + Convert.ToString(id));
        return null;
    }

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

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

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

4. Найти существо и отдельно проверить точную дистанцию — прямой скрипт

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

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

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

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

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

UO.FindMobile() — UO.FindMobile()

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

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

При вызове:

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

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

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

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

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

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

При вызове:

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

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

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

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

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

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

При вызове:

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

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

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

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

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

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

При вызове:

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

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

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

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

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

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

При вызове:

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

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

values => new InjectionValue(

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

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

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

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

При вызове:

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

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

values => new InjectionValue(

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

UO.FindNotoriety

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

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

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

Ищет другого mobile по одному body/type и разрешённой notoriety. Подходит, когда нужен определённый вид персонажа с нужным отношением; расширенные формы позволяют ограничить радиус, высоту и hue. Это только выбор объекта, не атака.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

1. Посчитать мужчин и женщин с репутацией Enemy — прямой скрипт

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

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

2. Ближайший из двух статусов с ограничением высоты — функция сценария

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

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

    return null;
}

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

3. Массив статусов во втором параметре — класс сценария

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

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

     public object? RunScenario()
    {
        dynamic[] allowed = new dynamic[checked((int)(1) + 1)];
        allowed[0] = 5;
        allowed[1] = 6;
        var found = UO.FindNotoriety(0x0191, allowed);
        if (Truth(found != 0))
        {
            UO.AddObject("allowed_mobile", found);
            UO.Print("Selected ID: " + Convert.ToString(found));
        }

        return null;
    }

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

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

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

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

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

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

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

При вызове:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindQuantity

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

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

dynamic UO.FindQuantity();

Читает текущее количество в первом результате поиска.

Параметры

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

Возвращает

int — текущий Amount предмета с serial FindItem, 1 для существующего персонажа, 0 для отсутствующего/удалённого объекта. Другие найденные стопки не суммируются. В отличие от FindFullQuantity, количество читается из текущего объекта при вызове.

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Сохранить результат до следующего поиска — класс сценария

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

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

     public object? RunScenario()
    {
        var found = UO.FindType(0x0EED, -1, "backpack");
        var saved = UO.FindQuantity();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindQuantity()));
        return null;
    }
}

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

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

UO.FindQuantity() — UO.FindQuantity()

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

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

При вызове:

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

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

UO.FindType

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

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

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

Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету, контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры, не подбирает предмет и не атакует найденную цель.

Параметры

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

Возвращает

string: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

Поведение

  • Существуют формы с 1–14 аргументами, но это не одна длинная сигнатура с произвольно пропускаемыми параметрами. Выберите точную строку синтаксиса; аргументы передаются позиционно.
  • Формы 1–5 используют обычный поиск и обновляют FindItem / FindCount / список результатов. Для форм 6–14 используйте непосредственно возвращённую строку: фильтрация персонажей выполняется отдельным путём и не обещает обновления этих общих значений.
  • У коротких форм по умолчанию поиск идёт в мире, любой цвет, расстояние FindDistance, без рекурсии. Строка "my" — специальная сокращённая форма для рюкзака с подконтейнерами.
  • Форма из шести аргументов сначала ищет подходящего персонажа; при отсутствии фильтра notoriety и подходящего персонажа возможен поиск предметов. Формы 7–14 объединяют разрешённых кандидатов и применяют дополнительные фильтры.
  • Изменение количества аргументов с пяти на шесть особенно важно: recursive заменяется на notoriety, а nearest становится шестым аргументом. Значение 1 на позиции 5 тогда означает innocent, а не рекурсивный обход.

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

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

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

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

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

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

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

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

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

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

2. Рекурсивно искать предмет в загруженных сумках рюкзака — функция сценария

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

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

    return null;
}

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

3. Найти ближайшего персонажа с одной из двух репутаций — класс сценария

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

  • 1: body=-1 разрешает любой body.
  • 2: color=-1 разрешает любой цвет.
  • 3: "ground" означает загруженных мировых объектов.
  • 4: radius=10 ограничивает расстояние десятью клетками.
  • 5: reputation="3|6" — attackable или murderer. Это notoriety, не recursive.
  • 6: nearest=1 просит выбрать ближайшего. Фильтр репутации исключает предметы. Пример только показывает информацию и не атакует цель.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var body = -1;
        var radius = 10;
        var reputation = "3|6";
        var nearest = 1;
        var found = UO.FindType(body, -1, "ground", radius, reputation, nearest);
        if (Truth(found != ""))
        {
            UO.Print("Matching mobile: " + found);
            UO.Info(found);
        }
        else
        {
            UO.Print("No matching mobile within the radius");
        }

        return null;
    }

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

4. Все четырнадцать параметров: живой видимый моб с подходящим именем — прямой скрипт

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

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

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

5. Сокращённая форма поиска в рюкзаке — функция сценария

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

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

    return null;
}

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

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

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

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

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

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

При вызове:

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

public string FindType(InjectionValue type)

            => FindType(ResolveType(type));

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

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

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

При вызове:

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

public string FindType(InjectionValue type, InjectionValue color)

        {

            if (color.Kind == InjectionValueKind.String

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

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

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

            {

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

            }



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

        }

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

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

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

При вызове:

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

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

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

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

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

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

При вызове:

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

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

        {

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

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

            else

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

        }

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

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

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

При вызове:

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

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

values =>

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

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

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

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

При вызове:

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

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

values =>

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

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

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

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

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

При вызове:

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

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

values => CompactFindTypeExtended(values)

UO.FindTypeEx

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

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

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

Ищет одну графику и цвет в контейнере либо на земле и возвращает один найденный ID.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

1. Прямое содержимое рюкзака — прямой скрипт

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

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

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

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

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

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

    return null;
}

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

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

3. Имя контейнера и вложенные сумки — класс сценария

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

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

     public object? RunScenario()
    {
        var bag = UO.GetSerial("backpack");
        if (Truth(bag != "0x00000000"))
        {
            UO.AddObject("search_bag", bag);
            UO.FindTypeEx(0x0EED, -1, "search_bag", true);
            var items = UO.GetFoundItems();
            foreach (var item in items)
            {
                if (Truth(UO.IsObjectExists(item)))
                {
                    UO.Print(Hex(item));
                }
            }
        }

        return null;
    }

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

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

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

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

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

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

При вызове:

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

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

UO.FindTypesArrayEx

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

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

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

За один обход ищет разные графики, цвета и контейнеры и возвращает один найденный ID. Полный список читается через GetFoundItems.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return null;
    }

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

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

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

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

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

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

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

При вызове:

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

case "findtypesarrayex":

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

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

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

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

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

UO.FindVertical

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

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

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

Читает или изменяет допустимую разницу высоты при поиске по умолчанию.

Параметры

  • value — Необязательный int. Без аргумента — чтение; value — установка. Значение ограничивается диапазоном 0..120; отрицательное становится 0, а не безлимитом. В новом runtime: 2; восстановленное состояние может содержать другое значение. Дробное число усекается к нулю; допустимы также числовые строки double/0x. Используйте int, чтобы избежать неявного преобразования.

Возвращает

Без аргументов: int — текущий предел (разница в единицах мировой Z), не найденный ID, количество объектов или bool. 0 означает нулевой предел, а не неудачу. С value: void — значения нет; это не true/false и не прежняя настройка. После установки прочитайте FindVertical(), чтобы узнать сохранённое значение.

Поведение

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

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

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

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

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

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

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

1. Чтение, установка и ограничение диапазона — прямой скрипт

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

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

2. Временный поиск на земле — функция сценария

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

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

    return null;
}

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

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

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

  • CountGroundInRange(graphic, radius, height) сохраняет оба предела, задаёт radius=5 и height=10, ищет graphic=0x0EED и возвращает FindCount(). Стопка считается одним объектом. Полная функция приведена после Main. Finally восстанавливает оба предела даже при выходе через return; результат поиска остаётся доступен.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var count = CountGroundInRange(0x0EED, 5, 10);
        UO.Print(Convert.ToString(count));
        return null;
    }

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

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

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

UO.FindVertical() — UO.FindVertical()

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

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

При вызове:

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

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

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

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

При вызове:

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.GetFindedList

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

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

dynamic UO.GetFindedList(object? userList);

Создаёт копию списка ID последнего обычного поиска.

Параметры

  • userList — Обязательный аргумент совместимости. В текущей реализации не заполняется и не изменяется: список возвращается результатом команды. Можно передать 0. Для формы без аргументов используйте GetFoundItems.

Возвращает

Array — отдельный массив serial/ID в порядке последнего поиска. Пустой Array, если совпадений не было. Не содержит graphic, hue или Amount. Изменение возвращённого массива не редактирует сохранённый список поиска.

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return null;
}

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

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

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

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

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

        return null;
    }

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

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

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

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

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

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

При вызове:

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

case "getfindedlist":

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

UO.GetFoundItems

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

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

dynamic UO.GetFoundItems();

Создаёт копию списка ID последнего обычного поиска.

Параметры

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

Возвращает

Array — отдельный массив serial/ID в порядке последнего поиска. Пустой Array, если совпадений не было. Не содержит graphic, hue или Amount. Изменение возвращённого массива не редактирует сохранённый список поиска.

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return null;
}

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

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

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

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

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

        return null;
    }

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

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

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

UO.GetFoundItems() — UO.GetFoundItems()

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

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

При вызове:

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

case "getfounditems":

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

UO.GetIgnoreList

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

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

dynamic UO.GetIgnoreList();

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

Параметры

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

Возвращает

Array — serial из Ignore-списка по возрастанию числового ID. Пустой Array при пустом списке. ID могут уже не существовать в мире; это правила поиска, не список видимых предметов.

Поведение

  • Читаются данные, уже загруженные клиентом. Команда не открывает контейнер, не перемещает предметы и не загружает объекты со всего сервера.
  • Array — массив с индексами от 0. Сохраняйте его в var, проверяйте ArrayLength перед доступом. Элементы могут исчезнуть из мира после создания снимка: перед действием проверяйте Exists(serial).
  • В клиенте набор принадлежит общему состоянию скриптов профиля. Массив является копией: IgnoreOff(serial) снимает одно исключение, IgnoreReset очищает все serial. Они не отключают выбранные правила type/hue; для них нужны SelectIgnoreList, DeleteIgnoreList или ClearIgnoreList. GetContent/GetEquipment и GetWorldItems без аргументов сами этот фильтр не применяют.

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

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

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

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

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

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

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

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

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

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

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

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

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

    return null;
}

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

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

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

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

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

        return null;
    }

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

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

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

UO.GetIgnoreList() — UO.GetIgnoreList()

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

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

При вызове:

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

case "getignorelist":

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

UO.GetWorldItems

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

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

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

Возвращает массив ID предметов мира либо выбранного контейнера.

Параметры

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

Возвращает

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

Поведение

  • Читаются данные, уже загруженные клиентом. Команда не открывает контейнер, не перемещает предметы и не загружает объекты со всего сервера.
  • Array — массив с индексами от 0. Сохраняйте его в var, проверяйте ArrayLength перед доступом. Элементы могут исчезнуть из мира после создания снимка: перед действием проверяйте Exists(serial).
  • Снимок FindItem/FindCount/GetFoundItems не меняется. Команда не открывает контейнер и не обходит вложенные сумки.
  • Для отключения ограничений недостаточно -1: это выбор текущей настройки, а не бесконечного радиуса. Укажите нужное неотрицательное distance/maxZ либо используйте форму без аргументов для всех загруженных предметов земли.

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

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

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

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

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

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

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

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

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

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

2. Найти ближайшую стопку нужного типа и цвета — функция сценария

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

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

    return null;
}

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

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

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

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

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

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

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

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

UO.GetWorldItems() — UO.GetWorldItems()

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

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

При вызове:

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

case "getworlditems":

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

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

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

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

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

При вызове:

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

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

values => CompactGetWorldItems(values)

UO.Ignore

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

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

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

Добавляет или удаляет serial в обычном списке игнорирования поиска.

Параметры

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

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Ignore(id) вызывает bridge.Ignore(serial), добавляющий serial в State.IgnoredSerials. Ignore(id,stateValue) выбирает Ignore либо Unignore. Нельзя считать любую непустую строку истинной: перечисленные выключающие слова обрабатываются отдельно.
  • Это фильтр поиска, не скрытие и не удаление объекта. Именованные фильтры типов AddIgnoreList хранятся отдельно.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

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

1. Прямой вызов — прямой скрипт

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

  • Добавляет или удаляет serial в обычном списке игнорирования поиска.
UO.Ignore("lasttarget");

2. Явный вариант — функция сценария

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

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

3. Полная вспомогательная функция — класс сценария

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

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

     public object? RunScenario()
    {
        var id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Ignore(id, 1);
            UO.Print(UO.GetIgnoreList());
            UO.Ignore(id, 0);
        }

        return null;
    }

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

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

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

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

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

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

При вызове:

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

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

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

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

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

При вызове:

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

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

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

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

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

При вызове:

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

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

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

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

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

При вызове:

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

public void Ignore(InjectionValue id, InjectionValue stateValue)

        {

            int serial = GetObject(id);

            bool enabled = stateValue.Kind != InjectionValueKind.String

                ? NumberConversions.ToInt(stateValue) != 0

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

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

                    && stateValue.String != "0";



            if (enabled)

                bridge.Ignore(serial);

            else

                bridge.Unignore(serial);

        }

UO.IgnoreOff

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

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

void UO.IgnoreOff(object? objID);

Убирает один serial из обычного списка игнорирования.

Параметры

  • objID — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Bridge.Unignore удаляет ID из State.IgnoredSerials. Другие serial и именованные фильтры AddIgnoreList не очищаются; предметы не удаляются из мира.
  • Локальное изменение фильтра поиска; пакеты не отправляются.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

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

1. Прямой вызов — прямой скрипт

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

  • Убирает один serial из обычного списка игнорирования.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.IgnoreOff(id);
}

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

2. Явный вариант — функция сценария

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

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

    return null;
}

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

3. Полная вспомогательная функция — класс сценария

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

UO.IgnoreReset

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

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

void UO.IgnoreReset();

Очищает обычный список игнорируемых serial.

Параметры

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

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

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

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

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

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

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

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

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

1. Прямой вызов — прямой скрипт

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

  • Очищает обычный список игнорируемых serial.
UO.IgnoreReset();

2. Явный вариант — функция сценария

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

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

3. Полная вспомогательная функция — класс сценария

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

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

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

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

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

UO.IgnoreReset() — UO.IgnoreReset()

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

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

При вызове:

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

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

UO.InfoFindList

Сигнатуры C#

string UO.InfoFindList();

Поведение и результат

Режим вызова определяет результат: команда из графического чата или привязанная команда открывает таблицу с полями, значениями, Ctrl+C и прокруткой. Обычный C#-скрипт получает строку данных без окон и прицела, даже при открытом игровом окне. Доступны только известные клиенту данные.

В графическом чате Info и InfoTile без аргументов включают прицел. В скрипте Info() читает последнюю объектную цель или своего персонажа, а InfoTile() — землю под персонажем. Явные serial, type и координаты читают выбранный объект или тайл. Третий аргумент InfoTile(x,y,map) — номер карты.

Параметры

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

Префикс настраивается в C# Scripts IDE. В примерах # обозначает выбранный префикс. Параметры разделяются пробелами; кавычки сохраняют текст одним параметром. id означает serial, type — graphic. xy x y [z] выбирает первый загруженный объект в точке; type без координат — первый найденный объект этого типа. У InfoTile третий аргумент формы (x,y,map) — карта, а не Z.

Команды чата

#infofindlist

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

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

1

UO.Print(UO.InfoFindList());

2

string ReadDefinitions() => UO.InfoFindList();
UO.Print(ReadDefinitions());

3

string report = UO.InfoFindList();
foreach (string line in report.Split('\n'))
    UO.Print(line);

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoFindList());
    }
}

Внутренние вызовы

CSharpGameApi.InfoFindList
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoFindList
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.MFGI

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

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

void UO.MFGI();

Печатает текущий список результатов поиска.

Параметры

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

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • ExecuteLegacyManualAlias читает GetFoundItems, форматирует каждый serial как 0xXXXXXXXX и соединяет строки разделителем " | ". Новый поиск не выполняется; пустой список даёт пустую строку.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

1. Прямой вызов — прямой скрипт

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

  • Печатает текущий список результатов поиска.
UO.MFGI();

2. Явный вариант — функция сценария

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

  • ExecuteLegacyManualAlias читает GetFoundItems, форматирует каждый serial как 0xXXXXXXXX и соединяет строки разделителем " | ". Новый поиск не выполняется; пустой список даёт пустую строку.
return  RunScenario();
 object? RunScenario()
{
    UO.FindType("0x0E21");
    UO.MFGI();
    return null;
}

3. Полная вспомогательная функция — класс сценария

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

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

     public object? RunScenario()
    {
        UO.MFGI();
        UO.Print(UO.GetArrayLength(UO.GetFoundItems()));
        return null;
    }
}

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

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

UO.MFGI() — UO.MFGI()

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

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

При вызове:

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

case "mfgi":

                    SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}")));

                    break;

UO.SelectIgnoreList

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

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

void UO.SelectIgnoreList(object? list);

Переключает активный именованный фильтр поиска. Полезно менять набор исключений между добычей, сортировкой и выбором цели без удаления сохранённых правил. Сам поиск эта команда не выполняет.

Параметры

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

Возвращает

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

Поведение

  • Несуществующее имя выбирает пустой фильтр. Поздний AddIgnoreList с этим именем начнёт действовать в следующих поисках. Обычные Ignore(serial) продолжают действовать при любом выборе.
  • Именованный список содержит правила graphic/type + hue, а обычный Ignore содержит конкретные serial. Это разные фильтры: они объединяются при поддерживающем их поиске. Объекты остаются видимыми и доступными прямому UseObject/MoveItem; это не Hide и не запрет действий.
  • Имя списка не учитывает регистр; пробелы по краям удаляются. Активен один именованный список, первоначально default. AddIgnoreList не выбирает его автоматически. SelectIgnoreList("") отключает только именованный фильтр.
  • Правила действуют на новые поиски, включая предметы, загруженные ПОСЛЕ их добавления. Уже полученный массив и предыдущий результат FindCount не пересчитываются до нового поиска. Не выбирайте список с правилом -1,-1, если не хотите исключить всё.
  • Фильтр учитывают FindType/FindTypeEx/FindTypesArrayEx, FindList, FindAtCoord, FindNotoriety, Count/CountEx и расширенные выборки GetMobiles, GetWorldItems, UseType, WaitTarget, Attack/AttackNearest/FindMan. includeIgnored=true, где он предусмотрен, обходит и serial, и type/hue. Полное перечисление GetContent/GetEquipment, GetWorldItems() без аргументов и словесный FindMobile(human,near,...) не используют эти правила.
  • GetIgnoreList возвращает только явно добавленные serial; строки именованного списка в этот массив не входят. IgnoreReset очищает весь serial-фильтр, IgnoreOff(serial) снимает одно serial-исключение; именованные правила сохраняются. ClearIgnoreList() без аргументов очищает оба вида.
  • Состояние принадлежит общему состоянию скриптов профиля клиента; изменение влияет на другие скрипты с этим состоянием. Настройки входят в сохраняемый снимок. После изменения правил другой скрипт может уже выполнять поиск со снятым ранее снимком — следующий поиск увидит обновление.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SelectIgnoreList");
UO.SelectIgnoreList("SORT");

1. Переключить режим сортировки — прямой скрипт

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

  • SORT и sort — один список. Поиск выбирает первый разрешённый объект рюкзака; сохранение имени не переносит его.
UO.AddIgnoreList("sort", 0x0EED);
UO.SelectIgnoreList("SORT");
var item = UO.FindType(-1, -1, "backpack");
if (Truth(item != ""))
{
    UO.AddObject("sort_candidate", item);
}

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

2. Выключить правила type, сохранив сами наборы — функция сценария

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

  • Пустая строка отключает только именованный фильтр. Чтобы позже восстановить его, снова передайте имя набора.
return  RunScenario();
 object? RunScenario()
{
    UO.SelectIgnoreList("");
    var gold = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(gold != ""))
    {
        UO.AddObject("gold_candidate", gold);
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        UO.SelectIgnoreList("later");
        UO.AddIgnoreList("later", 0x0EED);
        var item = UO.FindType(0x0EED, -1, "ground");
        if (Truth(item == ""))
        {
            UO.Print("Gold is excluded by the selected rule");
        }

        return null;
    }

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

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

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

UO.SelectIgnoreList(list) — UO.SelectIgnoreList(Any)

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

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

При вызове:

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

case "selectignorelist": state.SelectedIgnoreList = Text(0).Trim(); break;

UO.SetBadLocation

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

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

void UO.SetBadLocation(object? x, object? y);

Добавляет X/Y в список запрещённых клеток для следующих маршрутов MoveXY, NewMoveXY, MoveXYZ, PMove и запросов GetPathArray/GetPathArray3D.

Параметры

  • x — Мировой X исключаемой клетки.
  • y — Мировой Y исключаемой клетки.

Возвращает

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

Поведение

  • Ключ состоит из X/Y, без карты и Z. Координаты должны быть целыми в пределах 0..65535; выход за диапазон вызывает ошибку скрипта.
  • Запреты относятся к runtime вызвавшего скрипта. Новый маршрут или запрос получает их снимок. Уже идущий маршрут сохраняет свой снимок, включая внутренний перерасчёт. После изменения списка запустите новый маршрут.
  • Это не изменение карты: обычное ручное движение и маршруты другого runtime не получают этот запрет. Исходную клетку можно покинуть, даже если она отмечена запрещённой.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SetBadLocation");
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());

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

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

  • X/Y — клетка восточнее персонажа.
  • Если возможен обход, возвращается другой полный путь; персонаж не двигается.
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());
var path = UO.GetPathArray(UO.GetX() + 3, UO.GetY(), true, 0);
UO.Print(Convert.ToString(ArrayLength(path)));

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

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

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

  • Каждый вызов добавляет одну пару X/Y.
  • Повтор пары не создаёт второй отдельный запрет; Z не является параметром.
return  RunScenario();
 object? RunScenario()
{
    UO.SetBadLocation(1445, 1690);
    UO.SetBadLocation(1445, 1691);
    return null;
}

3. Задать известное препятствие в соседней клетке — класс сценария

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

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

     public object? RunScenario()
    {
        int x = UO.GetX() + 1;
        int y = UO.GetY();
        UO.SetBadLocation(x, y);
        UO.Print($"Marked known blocked location: {x},{y}");
        return null;
    }
}

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

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

UO.SetBadLocation(x, y) — UO.SetBadLocation(Any,Any)

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

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

При вызове:

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

case "setbadlocation":

                {

                    int x = Arg(0), y = Arg(1);

                    if (x < 0 || x > ushort.MaxValue || y < 0 || y > ushort.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadLocation requires world X/Y in 0..65535.");

                    state.BadLocations.Add(x + "," + y);

                    return InjectionValue.Unit;

                }

UO.SetBadObject

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

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

void UO.SetBadObject(object? objType, object? color, object? radius);

Исключает из следующих маршрутов и запросов пути клетки вокруг загруженных предметов мира, выбранных по graphic и hue.

Параметры

  • objType — Graphic/type предмета, 0..65535. 0xFFFF или -1 разрешает любой тип. Это не serial конкретного экземпляра.
  • color — Hue предмета, 0..65535. 0xFFFF или -1 разрешает любой цвет; 0 означает именно hue 0.
  • radius — Радиус в клетках, 0..255 включительно. 0 исключает клетку предмета. R исключает квадрат max(abs(dx),abs(dy)) <= R вокруг него, включая диагональные клетки.

Возвращает

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

Поведение

  • Параметры обязательны. Неподходящий диапазон вызывает ошибку скрипта, а не молчаливое усечение числа.
  • Правила накапливаются в текущем runtime. Совпавшие правила объединяются: для одного предмета применяется наибольший радиус. ClearBadObjectList удаляет все эти правила.
  • Учитываются загруженные динамические предметы с Container=0, включая доступные клиенту двери. Предметы внутри контейнеров, NPC и статика карты этим фильтром не выбираются. Для персонажей используйте avoidMobiles, для отдельных клеток — SetBadLocation.
  • При начале MoveXY/NewMoveXY/MoveXYZ/PMove либо GetPathArray/GetPathArray3D создаётся снимок правил и положений предметов. Дальнейшие изменения мира и списка не меняют этот снимок; новый запуск получает новые данные.
  • Фильтр не отправляет ничего серверу, не заставляет закрытый контейнер загрузить содержимое и не меняет ручное движение. Правила X/Y не имеют отдельного ограничения по Z.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SetBadObject");
UO.SetBadObject(0x398C, 0xFFFF, 1);

1. Обойти предметы определённого типа — прямой скрипт

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

  • ObjType=0x398C — пример graphic: замените типом препятствия на своём сервере. Color=0xFFFF выбирает любой цвет; Radius=1 исключает квадрат 3×3 вокруг каждого подходящего предмета.
  • NewMoveXY идёт на пять клеток восточнее, с точными X/Y, пешком, без callback и с timeout=5000 мс. ok=1 означает достижение цели; 0 не подтверждает обход.
UO.SetBadObject(0x398C, 0xFFFF, 1);
var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, 0, 5000);
UO.Print(Convert.ToString(ok));

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

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

  • Color=0x0044 выбирает только этот hue, а Radius=0 исключает только занятую предметом клетку. ClearBadObjectList удаляет прежние правила типа и цвета.
  • GetPathArray возвращает записи [x,y,z], включая исходную точку. Пустой массив означает отсутствие полного пути при текущих ограничениях. Персонаж остаётся на месте.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadObjectList();
    UO.SetBadObject(0x398C, 0x0044, 0);
    var path = UO.GetPathArray(UO.GetX() + 4, UO.GetY(), true, 0);
    UO.Print("Path records: " + Convert.ToString(ArrayLength(path)));
    return null;
}

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

3. Временно исключить клетки любых предметов мира — класс сценария

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

  • ObjType=-1 и Color=-1 — оба wildcard. Radius=0 исключает клетки всех загруженных предметов мира, но не NPC и не содержимое сумок.
  • Очистка действует на будущие запросы. Уже полученный path сохраняется; это массив координат, а не активный маршрут.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SetBadObject(-1, -1, 0);
        var path = UO.GetPathArray(UO.GetX() + 2, UO.GetY(), true, 0);
        UO.ClearBadObjectList();
        UO.Print(Convert.ToString(ArrayLength(path)));
        return null;
    }

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

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

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

UO.SetBadObject(objType, color, radius) — UO.SetBadObject(Any,Any,Any)

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

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

При вызове:

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

case "setbadobject":

                {

                    int type = ResolveType(arguments[0]), hue = Arg(1), radius = Arg(2);

                    if (type < -1 || type > ushort.MaxValue || hue < -1 || hue > ushort.MaxValue || radius < 0 || radius > byte.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadObject requires type/color 0..65535 (or -1) and radius 0..255.");

                    state.BadObjects.Add(type + "," + hue + "," + radius);

                    return InjectionValue.Unit;

                }
⚠️ **GitHub.com Fallback** ⚠️