RU UO Topic search Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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, чтобы мёртвый ближайший не заслонял остальных.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Проверка 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;Параметры и ход выполнения:
- Первый -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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMobiles:bridge.GetMobiles(). -
InjectionScript.Runtime.State.RuntimeDictionary.Set:state.Objects.Set(arguments.Length > 0 ? Text(0) : "findman", mobile). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "findman":
{
int mobile = bridge.GetMobiles().FirstOrDefault();
if (mobile != 0) state.Objects.Set(arguments.Length > 0 ? Text(0) : "findman", mobile);
break;
}Параметры: notoriety (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Параметры: notoriety (Any), distance (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Параметры: notoriety (Any), distance (Any), nearest (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Параметры: notoriety (Any), distance (Any), nearest (Any), maxZ (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Параметры: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Параметры: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any), color (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindMan]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindMan:CompactFindMan(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindMan(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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().
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.FindMobile("all", "all", "above");
UO.Print("FindMobile: " + Convert.ToString(result));Параметры и ход выполнения:
- Передано 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- В 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;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindMobile. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(new InjectionValue("all"), new InjectionValue("all"), new InjectionValue("all"), new InjectionValue("all")).
Внутренний код реализации, не самостоятельный скрипт.
public int FindMobile() => FindMobile(new InjectionValue("all"), new InjectionValue("all"),
new InjectionValue("all"), new InjectionValue("all"));Параметры: stateFilter (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindMobile. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(stateFilter, new InjectionValue("all"), new InjectionValue("all"), new InjectionValue("all")).
Внутренний код реализации, не самостоятельный скрипт.
public int FindMobile(InjectionValue stateFilter) => FindMobile(stateFilter, new InjectionValue("all"),
new InjectionValue("all"), new InjectionValue("all"));Параметры: stateFilter (Any), rangeFilter (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindMobile. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(stateFilter, rangeFilter, new InjectionValue("all"), new InjectionValue("all")).
Внутренний код реализации, не самостоятельный скрипт.
public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter) => FindMobile(stateFilter,
rangeFilter, new InjectionValue("all"), new InjectionValue("all"));Параметры: stateFilter (Any), rangeFilter (Any), verticalFilter (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindMobile. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(stateFilter, rangeFilter, verticalFilter, new InjectionValue("all")).
Внутренний код реализации, не самостоятельный скрипт.
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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindMobile]. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(values[0], values[1], values[2], values[3]).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindMobile]. -
InjectionScript.Runtime.InjectionApiUO.FindMobile:FindMobile(values[0], values[1], values[2], values[3], values[4]).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(
FindMobile(values[0], values[1], values[2], values[3], values[4]))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 вызывает ошибку преобразования.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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));Параметры и ход выполнения:
- -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;Параметры и ход выполнения:
- Массив содержит два кода. Отсутствующие хвостовые аргументы означают текущий радиус/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.
Параметры: type (Any), notoriety (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindNotoriety(values))Параметры: type (Any), notoriety (Any), distance (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindNotoriety(values))Параметры: type (Any), notoriety (Any), distance (Any), nearest (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindNotoriety(values))Параметры: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [FindNotoriety]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindNotoriety:CompactFindNotoriety(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactFindNotoriety(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.FindQuantity();Читает текущее количество в первом результате поиска.
Параметров нет.
int — текущий Amount предмета с serial FindItem, 1 для существующего персонажа, 0 для отсутствующего/удалённого объекта. Другие найденные стопки не суммируются. В отличие от FindFullQuantity, количество читается из текущего объекта при вызове.
- Данные принадлежат последнему обычному поиску этого скрипта. FindType с 1–5 аргументами, FindTypeEx, Count/CountEx/CountGround заменяют результаты. Расширенные фильтрованные команды персонажей не обязаны менять этот снимок.
- Новый поиск без совпадений обнуляет FindItem, FindCount и FindFullQuantity и очищает GetFoundItems. Чтение результата само по себе новый поиск не запускает.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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));Параметры и ход выполнения:
- Все четыре чтения относятся к одному поиску, пока между ними не вызван другой поиск.
- Например, две стопки по 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");Параметры и ход выполнения:
- Первый 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindQuantity:bridge.FindQuantity().
Внутренний код реализации, не самостоятельный скрипт.
case "findquantity": return new InjectionValue(bridge.FindQuantity());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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, а не рекурсивный обход.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.FindType(0x0EED, -1, "backpack");
UO.Print("FindType: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: type (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindType. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(ResolveType(type)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
Внутренний код реализации, не самостоятельный скрипт.
public string FindType(InjectionValue type)
=> FindType(ResolveType(type));Параметры: type (Any), color (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindType. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(ResolveType(type), -1, ConvertContainer(color), -1, color.String.Equals("my", StringComparison.OrdinalIgnoreCase)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.InjectionApiUO.ConvertContainer:ConvertContainer(color). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
Внутренний код реализации, не самостоятельный скрипт.
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);
}Параметры: type (Any), color (Any), container (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindType. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(type, color, container, new InjectionValue(-1)).
Внутренний код реализации, не самостоятельный скрипт.
public string FindType(InjectionValue type, InjectionValue color, InjectionValue container)
=> FindType(type, color, container, new InjectionValue(-1));Параметры: type (Any), color (Any), container (Any), range (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.FindType. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), true). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
InjectionScript.Runtime.InjectionApiUO.ConvertContainer:ConvertContainer(container).
Внутренний код реализации, не самостоятельный скрипт.
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);
}Параметры: type (Any), color (Any), container (Any), distance (Any), recursive (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(values[0], values[1], values[2], values[3], values[4]).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindType:CompactFindType(values[0], values[1], values[2], values[3], values[4], values[5]).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [FindType]. -
InjectionScript.Runtime.InjectionApiUO.CompactFindTypeExtended:CompactFindTypeExtended(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactFindTypeExtended(values)Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Это особенности данного клиента.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print("FindTypeEx: " + Convert.ToString(result));Параметры и ход выполнения:
- 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");Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: objType (Any), color (Any), container (Any), inSub (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(ResolveType(arguments[0]), Arg(1), StealthContainer(2), -1, Arg(3) != 0). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::StealthContainer:StealthContainer(2).
Внутренний код реализации, не самостоятельный скрипт.
case "findtypeex": return new InjectionValue(bridge.FindType(ResolveType(arguments[0]), Arg(1), StealthContainer(2), -1, Arg(3) != 0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Это особенности данного клиента.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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");Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- 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.
Параметры: objTypes (Any), colors (Any), containers (Any), inSub (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindTypes: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). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(1). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(3).
Внутренний код реализации, не самостоятельный скрипт.
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));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 работает при обычном завершении и перехватываемой ошибке скрипта; аварийную остановку нельзя использовать как механизм очистки.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.FindVertical();
UO.Print("FindVertical: " + Convert.ToString(result));Параметры и ход выполнения:
- 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);
}Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetFindVertical:bridge.SetFindVertical(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFindVertical:bridge.GetFindVertical().
Внутренний код реализации, не самостоятельный скрипт.
case "findvertical":
if (arguments.Length > 0) { bridge.SetFindVertical(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(bridge.GetFindVertical());Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetFindVertical:bridge.SetFindVertical(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFindVertical:bridge.GetFindVertical().
Внутренний код реализации, не самостоятельный скрипт.
case "findvertical":
if (arguments.Length > 0) { bridge.SetFindVertical(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(bridge.GetFindVertical());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Чтение результата само по себе новый поиск не запускает.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- Предварительно выполнен обычный 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;Параметры и ход выполнения:
- Предварительно выполнен обычный 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;Параметры и ход выполнения:
- Предварительно выполнен обычный 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.
Параметры: userList (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFoundItems:bridge.GetFoundItems().
Внутренний код реализации, не самостоятельный скрипт.
case "getfindedlist":
return new InjectionValue(bridge.GetFoundItems().Select(serial => new InjectionValue(serial)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Чтение результата само по себе новый поиск не запускает.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- Предварительно выполнен обычный 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;Параметры и ход выполнения:
- Предварительно выполнен обычный 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;Параметры и ход выполнения:
- Предварительно выполнен обычный 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFoundItems:bridge.GetFoundItems().
Внутренний код реализации, не самостоятельный скрипт.
case "getfounditems":
return new InjectionValue(bridge.GetFoundItems().Select(serial => new InjectionValue(serial)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 без аргументов сами этот фильтр не применяют.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetIgnoreList();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Параметров нет; читается снимок явных 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;Параметры и ход выполнения:
- Параметров нет; читается снимок явных 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;Параметры и ход выполнения:
- Параметров нет; читается снимок явных 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetIgnoreList:bridge.GetIgnoreList().
Внутренний код реализации, не самостоятельный скрипт.
case "getignorelist":
return new InjectionValue(bridge.GetIgnoreList().Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 либо используйте форму без аргументов для всех загруженных предметов земли.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetWorldItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Параметров нет: специальная форма без фильтров.
- Результат не означает все предметы карты или сервера. Ignore здесь не применяется.
var items = UO.GetWorldItems();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Любые 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems().
Внутренний код реализации, не самостоятельный скрипт.
case "getworlditems":
return new InjectionValue(bridge.GetWorldItems().Select(serial => new InjectionValue(serial)).ToArray());Параметры: type (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetWorldItems(values)Параметры: type (Any), color (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetWorldItems(values)Параметры: type (Any), color (Any), distance (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetWorldItems(values)Параметры: type (Any), color (Any), distance (Any), container (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetWorldItems(values)Параметры: type (Any), color (Any), distance (Any), container (Any), nearest (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetWorldItems]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetWorldItems:CompactGetWorldItems(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetWorldItems(values)Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Ignore");
UO.Ignore("lasttarget");Параметры и ход выполнения:
- Добавляет или удаляет serial в обычном списке игнорирования поиска.
UO.Ignore("lasttarget");Параметры и ход выполнения:
- Ignore(id) вызывает bridge.Ignore(serial), добавляющий serial в State.IgnoredSerials. Ignore(id,stateValue) выбирает Ignore либо Unignore. Нельзя считать любую непустую строку истинной: перечисленные выключающие слова обрабатываются отдельно.
return RunScenario();
object? RunScenario()
{
UO.Ignore("lasttarget", "off");
return null;
}Параметры и ход выполнения:
- Это фильтр поиска, не скрытие и не удаление объекта. Именованные фильтры типов 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.
Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Ignore:bridge.Ignore(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "ignore": bridge.Ignore(Arg(0)); return InjectionValue.Unit;Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Ignore. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Ignore:bridge.Ignore(id).
Внутренний код реализации, не самостоятельный скрипт.
public void Ignore(int id) => bridge.Ignore(id);Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Ignore. -
InjectionScript.Runtime.InjectionApiUO.Ignore:Ignore(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public void Ignore(string id) => Ignore(GetObject(id));Параметры: id (Any), stateValue (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Ignore. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(stateValue). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Ignore:bridge.Ignore(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unignore:bridge.Unignore(serial).
Внутренний код реализации, не самостоятельный скрипт.
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);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.IgnoreOff");
UO.IgnoreOff(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Убирает один 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Локальное изменение фильтра поиска; пакеты не отправляются.
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.
Параметры: objID (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unignore:bridge.Unignore(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "ignoreoff": bridge.Unignore(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.IgnoreReset();Очищает обычный список игнорируемых serial.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge.IgnoreReset вызывает State.IgnoredSerials.Clear. Удаляет все serial из этого фильтра, включая добавленные другим поиском в общей bridge-сессии.
- Не очищает именованные AddIgnoreList, не удаляет объекты и не сбрасывает результаты FindType.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.IgnoreReset");
UO.IgnoreReset();Параметры и ход выполнения:
- Очищает обычный список игнорируемых serial.
UO.IgnoreReset();Параметры и ход выполнения:
- Bridge.IgnoreReset вызывает State.IgnoredSerials.Clear. Удаляет все serial из этого фильтра, включая добавленные другим поиском в общей bridge-сессии.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetIgnoreList());
UO.IgnoreReset();
return null;
}Параметры и ход выполнения:
- Не очищает именованные 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IgnoreReset. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IgnoreReset:bridge.IgnoreReset().
Внутренний код реализации, не самостоятельный скрипт.
public void IgnoreReset() => bridge.IgnoreReset();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
Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.
UO.Print(UO.InfoFindList());string ReadDefinitions() => UO.InfoFindList();
UO.Print(ReadDefinitions());string report = UO.InfoFindList();
foreach (string line in report.Split('\n'))
UO.Print(line);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
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.MFGI();Печатает текущий список результатов поиска.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ExecuteLegacyManualAlias читает GetFoundItems, форматирует каждый serial как 0xXXXXXXXX и соединяет строки разделителем " | ". Новый поиск не выполняется; пустой список даёт пустую строку.
- Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.MFGI");
UO.MFGI();Параметры и ход выполнения:
- Печатает текущий список результатов поиска.
UO.MFGI();Параметры и ход выполнения:
- ExecuteLegacyManualAlias читает GetFoundItems, форматирует каждый serial как 0xXXXXXXXX и соединяет строки разделителем " | ". Новый поиск не выполняется; пустой список даёт пустую строку.
return RunScenario();
object? RunScenario()
{
UO.FindType("0x0E21");
UO.MFGI();
return null;
}Параметры и ход выполнения:
- Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}"))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFoundItems:bridge.GetFoundItems().
Внутренний код реализации, не самостоятельный скрипт.
case "mfgi":
SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}")));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SelectIgnoreList");
UO.SelectIgnoreList("SORT");Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Пустая строка отключает только именованный фильтр. Чтобы позже восстановить его, снова передайте имя набора.
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;Параметры и ход выполнения:
- До добавления правила 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.
Параметры: list (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "selectignorelist": state.SelectedIgnoreList = Text(0).Trim(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetBadLocation");
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Каждый вызов добавляет одну пару X/Y.
- Повтор пары не создаёт второй отдельный запрет; Z не является параметром.
return RunScenario();
object? RunScenario()
{
UO.SetBadLocation(1445, 1690);
UO.SetBadLocation(1445, 1691);
return null;
}Параметры и ход выполнения:
- Координаты замените реально непроходимой клеткой. Команда настраивает локальные данные маршрута и не создаёт объект в мире.
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.
Параметры: x (Any), y (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
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;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetBadObject");
UO.SetBadObject(0x398C, 0xFFFF, 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));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: objType (Any), color (Any), radius (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
Внутренний код реализации, не самостоятельный скрипт.
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;
}