Repository navigation
UO Topic search Part 2
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Українська · Русский · 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 у командах, що його підтримують. Контейнери та предмети не є мобільними.
- Умови застосовуються разом (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, нижче: 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) { ... }, не знайдено == true. Знайдений ID можна передати UO.AddObject, UO.Attack або UO.Follow, але кожна ігрова дія викликається окремо.
- Пошук читає тільки мобільні, вже завантажені клієнтом; знищені записи та Ignore виключені. Сам виклик не відкриває target, не атакує, не йде до мети і не просить сервера віддалені об'єкти.
- Відстань - геометрична max (abs (dx), abs (dy)), не довжина маршруту. Близькість не гарантує відсутність стіни чи доступність іншого поверху. Стан може змінитися після повернення.
- Життя, скритність та лінія огляду автоматично не перевіряються. Якщо вони важливі, використовуйте GetMobiles з aliveOnly/visibleOnly або свої перевірки. Наявність сервера статусу Enemy не робить будь-якого NPC відповідним.
- Від 2 до 7 аргументів. Для передачі maxZ потрібно вказати попередні distance та nearest. Для кількох notoriety в цій команді використовуйте одну маску "5"|6" або плоский масив у другому аргументі; Третій аргумент - distance, не другий статус.
- Важлива відмінність форм: два аргументи з ЧИСЛОВОЮ notoriety викликають bridge.FindNotoriety, скидають старі FindItem/FindCount/GetFoundItems і записують всі збіги. Два аргументи зі РЯДКОЮ/МАСИВОМ, а також будь-які форми з 3..7 аргументами повертають тільки ID, зберігаючи колишні поля Find*. Не читайте FindCount як результат розширеного запиту.
- Усі форми виключають self та Ignore, використовують межу Z; фільтри живий/бачимо та лінія огляду відсутні. Відсутність збігів повертає 0. Нечитаний type/distance/maxZ/color викликає помилку перетворення.
Кожен приклад можна зберегти окремим файлом .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();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.InfoFindList();Виводить збережені визначення AddFindList у локальний журнал клієнта. Корисна для перевірки імені, порядку, type та hue після додавання чи видалення правил. Не відображає об'єктів, знайдених у світі.
Параметрів немає.
void: значення, що повертається, немає. Не привласнюйте виклик змінною та не перевіряйте його на true/1. Стан визначень можна вивести UO.InfoFindList(); сам пошук запускається окремо через UO.FindList().
- Чи не приймає аргументів; друкує всі набори поточного runtime одним рядком.
- У записі list|type|color колір відсутній, якщо AddFindList викликали з двома аргументами. Між записами використовується "|". Числові літерали відображаються десятковим текстом; порядок відповідає доданню.
- Не запускає FindList і не змінює FindItem/FindCount. Для порожнього сховища канал повідомлень передається порожній рядок; це не явне повідомлення "список порожній".
- Визначення перебувають у стані даного скриптового runtime. Самостійний інший runtime має свій набір; закриття вікна IDE не є очищенням цих правил. Це не файл налаштувань та не список глобальних об'єктів гри.
- AddFindList дописує запис до кінця; повторення не видаляються. Для повторної підготовки свого набору спершу викликайте ClearFindList("ім'я"). Зміна визначень не очищає вже отримані FindItem/FindCount/GetFoundItems.
- Запис зберігає текстові поля. Числовий літерал "0x0EED" зберігається як "3821", рядок "0x0EED" - як "0x0EED". Пошук перетворює обидва варіанти на число, а DeleteFindList порівнює саме збережений текст. Використовуйте однакову форму при додаванні та видаленні.
- Невідоме ім'я в FindList не є порожнім зареєстрованим набором: двигун намагається розібрати його як список числових типів. Число ім'я викликає помилку перетворення. Після видалення останнього запису створіть новий набір до пошуку цього імені.
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.InfoFindList");
UO.InfoFindList();Параметри та порядок виконання:
- Для цього набору видно рядок loot|3821|-1| loot|3962|-1: 3821 = 0x0EED, 3962 = 0x0F7A. Це type, а не serial знайденої речі.
BuildLoot();
UO.InfoFindList();
void BuildLoot()
{
UO.ClearFindList("loot");
UO.AddFindList("loot", 0x0EED, -1);
UO.AddFindList("loot", 0x0F7A, -1);
}Параметри та порядок виконання:
- Висновок Before/After дозволяє побачити видалення лише одного забарвлення; інші іменовані набори будуть показані, якщо існують.
return RunScenario();
object? RunScenario()
{
UO.ClearFindList("check");
UO.AddFindList("check", 0x0EED, 0);
UO.AddFindList("check", 0x0EED, 0x0044);
UO.Print("Before:");
UO.InfoFindList();
UO.DeleteFindList("check", 0x0EED, 0x0044);
UO.Print("After:");
UO.InfoFindList();
return null;
}Параметри та порядок виконання:
- Наявність рядка stock|3821 підтверджує правило, але не наявність золота. Кількість serial та сума одиниць читаються після успішного пошуку.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.ClearFindList("stock");
UO.AddFindList("stock", 0x0EED);
UO.InfoFindList();
var first = UO.FindList("stock", "backpack");
if (Truth(first == ""))
{
UO.Print("Rule exists, but no matching item is loaded");
}
else
{
UO.Print("Objects: " + Convert.ToString(UO.FindCount()));
UO.Print("Units: " + Convert.ToString(UO.FindFullQuantity()));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(string.Join(" | ", LegacyList("AddFindList"))). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList("AddFindList").
Внутрішній код реалізації, не самостійний скрипт.
case "infofindlist": SystemMessage(string.Join(" | ", LegacyList("AddFindList"))); break;Українська · Русский · 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;
}ClassicUO — Bad Newbie & C# Scripts IDE