Repository navigation
UO Topic combat
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Атака, бойовий режим, здібності зброї та лікування бинтами. Надсилання команди означає запит на дію; її виконання залежить від стану персонажа й відповіді сервера.
| Тема | Команди та пояснення |
|---|---|
| Атака | UO.Attack |
| Атака найближчої цілі | UO.AttackNearest |
| Остання ціль атаки | UO.LastAttack |
| Бойовий режим | UO.WarMode |
| Ціль у бойовому режимі | UO.WarTargetID |
| Здібності зброї | UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility |
| Основна здібність | UO.UsePrimaryAbility |
| Друга здібність | UO.UseSecondaryAbility |
| Особливі прийоми | UO.Specmove |
| Лікування себе бинтом | UO.BandageSelf |
UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID
UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove
UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest
Назви груп та типи одягнених речей задаються скриптом; порядок імен через | задає пріоритет.
Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.
Параметри, результат та всі сценарії
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
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;Параметри, результат та всі сценарії
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Attack(object? objID);Надсилає запит атаки на конкретний serial. Підходить, коли ціль вже обрана користувачем або знайдена іншою командою; самостійного пошуку по одягу/дистанції тут немає.
-
objID— Serial mobile: int, десятковий/hex-рядок або ім'я об'єкта (наприклад lasttarget або ім'я AddObject). Чи не graphic/type і не назва класу. Обов'язковий аргумент; 0 не є командою зупинки бою. Для вибору мети без її ID використовуйте пошук або ігровий target.
void - значення немає. Пишіть UO.Attack(enemy) окремим рядком, не var result=UO.Attack(...). Завершення дзвінка не підтверджує попадання, шкоду або згоду сервера.
- Сам собою виклик не відкидає мертвих, далеких, self, союзників, порожній serial або предмети. Перевіряйте обрану мету; краще відфільтрований mobile з GetMobiles/FindMan.
- Використовується штатний GameActions.Attack: можливе питання про кримінальну атаку при EnabledCriminalActionQuery. При звичайному ході оновлюються LastAttack/NewTargetSystemSerial і надсилається пакет запиту атаки.
- Команда сама не вмикає WarMode, не виконує подвійний клік мишею, не прокладає маршрут і не запускає цикл повторних атак. Обробка бойового режиму та подальшого бою залежить від сервера.
- Для рядка невідомого об'єктного імені можлива помилка дозволу. Перевірка Exists доводить наявність об'єкта, але не те, що це mobile; GetMobiles видає саме mobiles.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());Параметри та порядок виконання:
- lasttarget може бути предметом чи дружнім персонажем. Список allowed виключає ці випадки; Attack викликається максимум один раз.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
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;Параметри та порядок виконання:
- FindMan повертає serial і не атакує. Перевірку IsDead додано окремо, тому що у FindMan немає aliveOnly.
return RunScenario();
object? RunScenario()
{
var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
if (Truth(enemy == 0))
{
return null;
}
if (Truth(UO.IsDead(enemy) == 0))
{
UO.AddObject("enemy", enemy);
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;Параметри та порядок виконання:
- GetMobiles вже впорядкований nearest=true. Якщо перед першою метою стіна, перевіряється така; наявність visibleOnly сама по собі не замінює CheckLOS. Серверна перевірка може відрізнятись.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(targets)))
{
var enemy = targets[i];
if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
{
UO.Attack(enemy);
return null;
}
i += 1;
}
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.
Параметри: objID (Any/Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;Параметри: objID (Any/Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
Внутрішній код реалізації, не самостійний скрипт.
public void Attack(int id) => bridge.Attack(id);Параметри: objID (Any/Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутрішній код реалізації, не самостійний скрипт.
public void Attack(string id) => Attack(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);Вибирає одну потрібну бойову мету і передає її обробникові атаки. Фільтри обмежують допустимі персонажі; користувальницький classMask задає екіпірування та пріоритет класів, nearest - вибір усередині класу.
-
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. Чи не довжина маршруту; перешкоди та поверхи цим параметром не перевіряються. -
body— Graphic тіла персонажа/NPC, не ID конкретного персонажа і не type одягненої броні. Число, hex-рядок, рядок 0x0190|0x0191" або масив чисел. 0x0190 (400) - чоловік-людина; 0x0191 (401) - жінка-людина. Маска поєднує обидва тіла. Список автоматично не включає інші раси, привидів або перетворення; таблиці стандартних графічних типів тіла. Негативне число (-1 за умовчанням), 0xFFFF, "any", порожній рядок або порожній масив окремо - будь-яке тіло. Невідомий текст без допустимого числа дає результат. -
maxZ— максимальна abs(Z цілі - Z власного персонажа) включно, в одиницях Z світу. Це не кількість поверхів і не клітинки X/Y. maxZ=4 за Z гравця 10 допускає Z цілі 6..14; 0 вимагає однакової висоти. За замовчуванням/за від’ємного числа використовується UO.FindVertical(). На сходах однакова Z може виключити потрібну ціль. Навіть мала різниця Z не доводить доступність поверху. -
nearest— true/1 за умовчанням вибирає найближчого відповідного персонажа; рівну відстань дозволяється меншим serial. false/0 зберігає перший відповідний об'єкт у порядку списку клієнта, не вибирає найдальшого. При classMask спочатку діє пріоритет класу, потім відстань усередині класу. -
color— Hue самого mobile: int або числове/hex-рядок. Негативне число (-1 за умовчанням) і 0xFFFF - будь-який hue; 0 - саме hue 0, а не будь-яке значення. Чи не колір смужки notoriety і не відтінок одягу. Колір одягненої речі цей параметр не перевіряє. -
classMask- Імена правил, заздалегідь визначених UO.SetClassMask в цьому ж скриптовому ході. Наприклад "DTMH|мисливець|запасний" - пріоритет зліва направо; також допускається масив рядків. Назви будь-які, регістр не важливий. Розділювачі рядка: |, кома або;. Будь-яке невідоме ім'я/порожній елемент у списку скасовує вибір повністю: результат 0, Атаки немає. Це не числова бітова маска: 7 не означає три класи. Пропущений аргумент, -1, "-1Magne/Tank/Archer не вбудовано: без реєстрації таких правил збігів не буде. -
aliveOnly— true/1 виключає mobiles з IsDead != 0; false/0 за умовчанням не додає цієї умови. Не порівняння HP з нулем, не пошук трупів-предметів і не гарантія, що ціль залишиться живою після виклику. -
visibleOnly— true/1 вимагає IsVisible=1 за поточним станом ClassicUO; false/0 за умовчанням не додає умову. Це видимість завантаженого об'єкта клієнту, а чи не перевірка стін/лінії огляду. Для геометричної перевірки є окрема UO.CheckLOS з координатами; сервер все одно може відхилити дію.
int — serial вибраного mobile, або 0, коли потрібної мети немає або classMask недійсний. Це не 1/0-прапор, не body/type, не відстань і не підтвердження удару. Перевіряйте enemy != 0; enemy == true неприпустимо в C#: int не порівнюється з bool. При ненульовому ID обробник ClassicUO ще може показати підтвердження атаки Innocent; сервер може відхилити дію.
- Пошук локальний: тільки вже завантажені 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.
- Ім'я — мітка користувача, а не серверна професія. Можна назвати правило DTMH, мою групу або будь-яким іншим словом. Двигун не визначає навички/клас на сервері на ім'я персонажа.
- Required один type або плоский масив означає хоча б одну річ зі списку. Масив груп означає: потрібна хоча б одна річ із КОЖНОЇ групи. Наприклад [шкіра, палиці] вимагає шкіру І палицю. Це набір альтернатив, а не вимога одягнути весь перерахований гардероб.
- Будь-яка одягнена річ з forbidden виключає персонажа з цього правила, навіть у виконаних required. Шкіра плюс заборонений chain не проходить правило шкіри. Інші правила продовжують перевірятись.
- Враховуються лише завантажені речі, одягнені на шарах 1..24 крім рюкзака 21. Вміст рюкзака/скрині, маунт 25, магазин 26..28 та банк 29 не вважаються одягом. Порівнюється graphic/type; serial, ім'я та hue речі тут не використовуються.
- Список без завантаженого відповідного екіпірування не збігається. Відсутність забороненої речі в локальних даних не доводить її відсутність на сервері, якщо сервер ще не надіслав екіпірування. Клієнт не вгадує приховані дані.
- Правила належать одному runtime скрипту, включаючи його функції та Include; не передаються іншим самостійним запускам та не зберігаються у профіль. При новому запуску визначте їх знову, наприклад, загальною процедурою налаштування. Повторний SetClassMask замінює правило з тим самим ім'ям тільки після повної перевірки нових даних.
- Масиви копіюються під час реєстрації. Зміна вихідного масиву не змінює правило: повторіть SetClassMask. Кілька правил, що збіглися, дозволяються порядком імен в classMask. Жодних стандартних таблиць одягу сервера немає.
- Підтримуються 1..9 позиційних аргументів. Пропускати можна хвіст; щоб задати classMask, потрібно передати перші шість аргументів. Використовуйте іменовані var, щоб бачити зміст кожної позиції.
- Вибирається одна ціль, атака відправляється один раз. Це не автоматичний цикл бою. Без classMask фільтр екіпірування та читання речей не виконуються.
- Спочатку загальні фільтри, потім пріоритет ліворуч, потім nearest. nearest=false все одно зберігає пріоритет класів, але всередині першого класу вибирає перший mobile у списку клієнта.
- Стара спроба пошуку підрядка в імені/титулі замінена правилами екіпірування. Перенесіть такі скрипти на явний SetClassMask; Ім'я персонажа більше не видає його за певний клас.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));Параметри та порядок виконання:
- body=-1, maxZ=FindVertical(), nearest=true, color=-1, classMask відключений, aliveOnly=false, visibleOnly=false. Для обов'язкового виключення мертвих використовуйте повну форму нижче.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
return null;
}
UO.AddObject("combat_target", enemy);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- maxZ=0 корисний для суворого порівняння висоти, але може відсікнути мету на сходинці. visibleOnly не перевіряє стіну. Усі дев'ять аргументів підписано; повертається ID, не true.
return RunScenario();
object? RunScenario()
{
var status = "5|6";
var radius = 8;
var bodies = "0x0190|0x0191";
var heightTolerance = 0;
dynamic chooseNearest = true;
var bodyHue = -1;
var equipmentClasses = -1;
dynamic requireAlive = true;
dynamic requireVisible = true;
var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_same_height", 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;Параметри та порядок виконання:
- Спочатку вибирається DTMH; тільки якщо підходящих DTMH немає - важкий, потім мисливець. DTMH на 10 клітинах має пріоритет над важким на 2 клітинах. Для зворотного порядку поміняйте рядок classMask. З двох DTMH вибирається найближчий.
- Gear — повністю наведена функція користувача C#, не окрема команда UO. Два масиву Gear(leather, staves) утворюють дві обов'язкові групи. Додавання типу у leather розширює альтернативи; не вимагає вдягати дві шкіряні речі.
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 leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Параметри та порядок виконання:
- 10 - радіус, 4 - допустима різниця Z, обидва -1 після прапора відключають color і classMask. Порядок списку клієнтів не гарантовано між оновленнями світу. Для передбачуваної близькості скористайтеся true.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
return null;
}
UO.AddObject("current_enemy", target);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Змінюється лише порядок позначок: жодних нових таблиць одягу чи назв у клієнті додавати не потрібно. Щоб заборонити fallback на важкий, видаліть його з priority.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var priority = "охотник|DTMH|тяжёлый";
var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("priority_enemy", enemy);
}
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
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.
Параметри: notoriety (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметри: notoriety (Any), distance (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметри: notoriety (Any), distance (Any), body (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)
Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)
Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)
Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)
Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(CompactAttackNearest(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BandageSelf();Ставить персонажа як UO.Wait-target і використовує на собі бинт типу 0x0E21, вибраний з рюкзака. Операція надсилається клієнтом і виконується сервером асинхронно.
Параметрів немає.
void. Метод не повертає статус лікування та не чекає завершення бинтування.
- Runtime ставить мету
Self, потім шукає в рюкзаку найближчий відповідний предмет типу0x0E21з будь-яким hue і використовує його. Якщо бинт не знайдено, пошук повідомляє про це системний журнал; результат пошуку не повертається скрипту, що викликає. Можливість та результат лікування залежать від серверного стану персонажа.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.BandageSelf");
UO.BandageSelf();Параметри та порядок виконання:
- Одноразово використати знайдений у рюкзаку бинт на собі.
UO.BandageSelf();2. Спочатку перевірити з'єднання, потім відправити дію; виклик не чекає на закінчення лікування. - Функція сценарію
Параметри та порядок виконання:
- Спочатку перевірити з'єднання, потім відправити дію; виклик не чекає на закінчення лікування.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.BandageSelf();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;3. Процедура тільки надсилає використання бинта і не повідомляє про успіх лікування. - Клас сценарію
Параметри та порядок виконання:
- Процедура тільки надсилає використання бинта і не повідомляє про успіх лікування.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyBandage();
return null;
}
void ApplyBandage()
{
UO.BandageSelf();
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
Внутрішній код реалізації, не самостійний скрипт.
public void BandageSelf()
{
var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));
if (foundBandages != string.Empty)
{
WaitTargetSelf();
UseObject(foundBandages);
}
else
SystemMessage("No bandages found.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ClearClassMask();
int UO.ClearClassMask(object? name);Видаляє одне правило екіпіровки або всі правила поточного скриптового runtime. Корисно перед переналаштуванням наборів або вимкненням тимчасового пріоритету.
-
name— Необов'язкове ім'я, передане SetClassMask. Реєстр не важливий. Без аргументів видаляються всі правила цього runtime. Це не ряд пріоритетів: "mage|tank" тут неприпустимо; видаляйте по одному або викличте без аргументів.
int – кількість віддалених правил. З ім'ям 1 означає видалено, 0 — такого правила не було. Без аргументів повертається 0..N, не логічний прапор. Тому загальний результат порівнюйте з > 0, а чи не з true.
- Не скасовує вже відправлену атаку та не зупиняє скрипт. Не змінює екіпірування персонажів.
- Після видалення ім'я залишається невідомим для наступного AttackNearest. Видаліть його також із classMask або зареєструйте знову; невідоме ім'я блокує весь вибір.
- Чужі runtime та їхні правила не торкаються. Для звичайного пошуку без класів використовуйте classMask=-1, а не порожній набір обов'язкового одягу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));Параметри та порядок виконання:
- Вилучення не перемикає зброю та не завершує бій. Воно змінює лише подальшу класифікацію.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("main_enemy", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- removed – кількість віддалених правил. Новий набір створюється у тому ж runtime, без перезапуску клієнта.
return RunScenario();
object? RunScenario()
{
UO.SetClassMask("старый_набор", 0x13B2);
var removed = UO.ClearClassMask();
UO.SetClassMask("новый_набор", 0x0F50);
var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("new_enemy", 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;Параметри та порядок виконання:
- Не передавайте дистанційне ім'я: результат був би 0. -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()
{
UO.SetClassMask("по_одежде", 0x13C4);
UO.ClearClassMask();
var classes = -1;
var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_without_classes", 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;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
args => new InjectionValue(ClearClassMask(null))Параметри: name (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetAbilityID(object? abilityName);Дозволяє ім'я здатності зброї або числовий рядок у ID каталогу клієнта.
-
abilityName— string: ім'я AbilityData, ім'я enum Ability або десятковий ID. Прогалини/пунктуація видаляються при порівнянні імен, регістр не враховується.
int 1..AbilityData.Abilities.Length - відома здатність; 0 — невідоме ім'я, порожній нормалізований рядок або числовий ID поза каталогом.
- ResolveClassicUOAbilityId спочатку розбирає десятковий int, потім порівнює нормалізовані імена каталогу та enum. Команда не активує здатність та не перевіряє відповідність поточній зброї.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));Параметри та порядок виконання:
- Число позначає ID каталогу, а не застосування можливості.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));Параметри та порядок виконання:
- Рядок 1 проходить числовий шлях резолвера.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}Параметри та порядок виконання:
- Відсутнє ім'я повертає 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 id = UO.GetAbilityID("unknown-example-ability");
UO.Print(Convert.ToString(id));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: abilityName (String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
Внутрішній код реалізації, не самостійний скрипт.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetAbilityName(object? abilityId);Повертає ім'я здатності зброї за її ID каталогу.
-
abilityId— int: індексація ID починається з 1; bridge читає AbilityData.Abilities[abilityId-1].
string імені каталогу. Для ID менше 1 або більше довжини каталогу повертається порожній рядок.
- Читання локальне та не активує здатність. ID каталогу не означає, що здатність присутня у поточної зброї.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));Параметри та порядок виконання:
- ID 1 відповідає першому елементу каталогу.
var name = UO.GetAbilityName(1);
UO.Print(name);Параметри та порядок виконання:
- Ім'я повертається по ID, знайденому резолвером.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
UO.Print(UO.GetAbilityName(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;Параметри та порядок виконання:
- ID 0 повертає рядок довжини 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 name = UO.GetAbilityName(0);
UO.Print(Convert.ToString(Len(name)));
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: abilityId (Integer)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
Внутрішній код реалізації, не самостійний скрипт.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetActiveAbility();Читає ім'я активованої бойової здатності свого персонажа.
Параметрів немає.
string - англійське ім'я активованої здібності, наприклад Armor Ignore. Рядок "0", якщо жодна здатність не активована або персонаж відсутня. Це не int 0, не ID здібності та не підтвердження успішного удару.
- Читаються прапори PrimaryAbility/SecondaryAbility поточного персонажа. Якщо обидва активні, вибирається первинна здатність. Прапор активності виключається із номера перед пошуком імені.
- Дані читаються локально; сам getter не активує здатність і не витрачає ману. Після атаки сервер може зняти активацію.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Аргументів немає; читається символ поточного клієнта.
- За відсутності активації друкується рядок 0.
var name = UO.GetActiveAbility();
UO.Print(name);Параметри та порядок виконання:
- Порівняння виконується з рядком 0. UsePrimaryAbility викликається окремо.
- Це запит активації, а чи не доказ успішного удару. Доступність залежить від зброї та правил сервера.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetActiveAbility() == "0"))
{
UO.UsePrimaryAbility();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- GetAbilityID отримує ім'я, повернене getter.
- ID здібності не є 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()
{
var name = UO.GetActiveAbility();
if (Truth(name != "0"))
{
var id = UO.GetAbilityID(name);
UO.Print("Ability ID: " + Convert.ToString(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;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetActiveAbility:bridge.GetActiveAbility().
Внутрішній код реалізації, не самостійний скрипт.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWeaponAbilities();Bridge читає Player.Abilities, застосовує ((byte) value & 0x7F), зберігає позитивні ID у вихідному порядку.
Параметрів немає.
Array позитивних int ID здібностей поточної зброї. Старший прапор 0x80 знято; нульові значення виключено. Без Player – порожній масив.
- Bridge читає Player.Abilities, застосовує ((byte)value & 0x7F), зберігає позитивні ID у вихідному порядку. Повертає доступні ID, а не факт активного режиму та не імена.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Bridge читає Player.Abilities, застосовує ((byte) value & 0x7F), зберігає позитивні ID у вихідному порядку.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Параметри та порядок виконання:
- Bridge читає Player.Abilities, застосовує ((byte)value & 0x7F), зберігає позитивні ID у вихідному порядку. Повертає доступні ID, а не факт активного режиму та не імена.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.GetAbilityName(abilities[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;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, 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 before = UO.GetWeaponAbilities();
UO.Wait(500);
var after = UO.GetWeaponAbilities();
UO.Print(before);
UO.Print(after);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsWarMode(object? objID);Перевіряє бойову стійку mobile.
-
objID— Обов'язковий serial/ID конкретного об'єкта: int, hex-рядок або аліас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse або ім'я AddObject. Це не graphic/type. Невстановлене ім'я дозволяється у 0; ніякий новий target команда не відкриває. Аргумент обов'язковий; для себе передайте self.
int 1 — завантажений mobile має ознаку InWarMode. int 0 — ознака відсутня, об'єкт не є mobile, невідомий чи видалений. Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
- Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
- Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));Параметри та порядок виконання:
- Аргумент self явно вибирає свого персонажа. state — лише 1/0.
- Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.
var state = UO.IsWarMode("self");
if (Truth(state))
{
UO.Print("Combat stance is active");
}
else
{
UO.Print("Combat stance is inactive");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- IsNpc виключає предмет та невідомий об'єкт. target зберігає один serial, а не живе посилання на змінний lasttarget.
- Результат відноситься до поля InWarMode. Дані оновлюються лише після отримання відповідного стану клієнтом.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsWarMode(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- UO.Wait(500) - пауза в мілісекундах. Після неї окремо перевіряється, що mobile ще існує.
- Порівнюються два знімки. Проміжні зміни можуть бути пропущені, і це не безперервна передплата серверних подій.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsWarMode(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsWarMode(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
Внутрішній код реалізації, не самостійний скрипт.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastAttack();Читає serial останньої мети атаки.
Параметрів немає.
int - збережений serial; 0 означає, що serial не встановлено. Це не bool та не graphic/type; ненульовий ID може вже бути відсутнім у світі.
- Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Читає serial останньої мети атаки.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
return RunScenario();
object? RunScenario()
{
var id = UO.LastAttack();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(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;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, 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 before = UO.LastAttack();
UO.Wait(500);
var after = UO.LastAttack();
UO.Print(before = after);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Внутрішній код реалізації, не самостійний скрипт.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);Створює або замінює власний клас екіпірування для classMask в UO.AttackNearest. Ви вибираєте ім'я та graphic/type речей; вбудовані назви професій не потрібні.
-
name— Непустий рядок з вашою назвою, наприклад "DTMH", "моя_група", "арчер_з_щитом". Регістр не важливий, прогалини по краях забираються. | , ; заборонено: це роздільники пріоритетів. any/all/-1 зарезервовані для відключення фільтра. -
required— Один type, плоский масив альтернатив або масив обов'язкових груп. Кожна група - type або плоский масив. Потрібна хоча б одна річ із кожної групи; порожні обов'язкові групи неприпустимі. Кожен type — int/числовий/hex-рядок 1..65534. Вкладеність глибше за масив груп не приймається. Це graphic речей, не serial і не body персонажа. -
forbidden— необов'язковий type або плоский масив заборонених типів. За замовчуванням заборонених речей немає; порожній масив також дозволено. Якщо будь-яка така річ одягнена, правило не збігається. Ті самі межі 1..65534; -1/any тут не приймаються. Цілком забороняти всі альтернативи обов'язкової групи не можна.
int 1 — правило перевірено та записано. Помилковий тип/ім'я/порожня обов'язкова група/суперечність викликає помилку скрипта, яку можна перехопити try/CATCH; колишнє правило зберігається. Чи не повертає serial або знайдених персонажів, не починає атаку.
- Ім'я — мітка користувача, а не серверна професія. Можна назвати правило DTMH, мою групу або будь-яким іншим словом. Двигун не визначає навички/клас на сервері на ім'я персонажа.
- Required один type або плоский масив означає хоча б одну річ зі списку. Масив груп означає: потрібна хоча б одна річ із КОЖНОЇ групи. Наприклад [шкіра, палиці] вимагає шкіру І палицю. Це набір альтернатив, а не вимога одягнути весь перерахований гардероб.
- Будь-яка одягнена річ з forbidden виключає персонажа з цього правила, навіть у виконаних required. Шкіра плюс заборонений chain не проходить правило шкіри. Інші правила продовжують перевірятись.
- Враховуються лише завантажені речі, одягнені на шарах 1..24 крім рюкзака 21. Вміст рюкзака/скрині, маунт 25, магазин 26..28 та банк 29 не вважаються одягом. Порівнюється graphic/type; serial, ім'я та hue речі тут не використовуються.
- Список без завантаженого відповідного екіпірування не збігається. Відсутність забороненої речі в локальних даних не доводить її відсутність на сервері, якщо сервер ще не надіслав екіпірування. Клієнт не вгадує приховані дані.
- Правила належать одному runtime скрипту, включаючи його функції та Include; не передаються іншим самостійним запускам та не зберігаються у профіль. При новому запуску визначте їх знову, наприклад, загальною процедурою налаштування. Повторний SetClassMask замінює правило з тим самим ім'ям тільки після повної перевірки нових даних.
- Масиви копіюються під час реєстрації. Зміна вихідного масиву не змінює правило: повторіть SetClassMask. Кілька правил, що збіглися, дозволяються порядком імен в classMask. Жодних стандартних таблиць одягу сервера немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));Параметри та порядок виконання:
- DTMH — лише ваше ім'я. Значення в myLeather/forbiddenChain — приклади: замініть/доповніть реальними graphic вашого сервера. Плоский список означає OR, а не повний комплект.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("leather_enemy", enemy);
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Спочатку вибирається DTMH; тільки якщо підходящих DTMH немає - важкий, потім мисливець. DTMH на 10 клітинах має пріоритет над важким на 2 клітинах. Для зворотного порядку поміняйте рядок classMask. З двох DTMH вибирається найближчий.
- Gear — повністю наведена функція користувача C#, не окрема команда UO. Два масиву Gear(leather, staves) утворюють дві обов'язкові групи. Додавання типу у leather розширює альтернативи; не вимагає вдягати дві шкіряні речі.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- оголошення змінної required[1] створює два елементи з індексами 0 та 1. Дві вкладені групи вимагають torso Та weapon; плоский [torsoType,weaponType] означав би torso АБО weapon.
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[] required = new dynamic[checked((int)(1) + 1)];
dynamic[] torso = new dynamic[checked((int)(0) + 1)];
dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
torso[0] = 0x13C4;
weapon[0] = 0x0DF0;
required[0] = torso;
required[1] = weapon;
UO.SetClassMask("мой_комплект", required);
var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("outfit_enemy", 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;
}Параметри та порядок виконання:
- Повторна реєстрація замінює копію правила. Старе ім'я залишається тим самим, тому рядок пріоритетів переписувати не потрібно.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("updated_outfit", enemy);
}
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.
Параметри: name (Any), required (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
args => new InjectionValue(SetClassMask(args))Параметри: name (Any), required (Any), forbidden (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
args => new InjectionValue(SetClassMask(args))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWarMode(object? value);Запитує бойовий чи мирний режим персонажа.
-
value- 0 - мирний режим; будь-яке ненульове ціле – бойовий режим.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- WarMode передає режим у GameActions.ToggleWarMode: 0 вимикає, будь-яке ненульове значення включає. Без Player дії немає.
- Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);Параметри та порядок виконання:
- Запитує бойовий чи мирний режим персонажа.
UO.SetWarMode(1);Параметри та порядок виконання:
- WarMode передає режим у GameActions.ToggleWarMode: 0 вимикає, будь-яке ненульове значення включає. Без Player дії немає.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}Параметри та порядок виконання:
- Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.
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()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetWarMode(mode);
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: value (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);Передає один крок кроку безпосередньо bridge.
-
direction— int; напрямок & 7 daët 0..7 N, NE,E, SE,S, SW,W, NW. -
running— Необов'язковий Числовий прапор int: 0/відсутність — ходьба, ненульове — біг.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteLegacyManualAlias викликає bridge.Step(direction & 7, running != 0) і відкидає весь код результату 0/2/3/4/5/7; назовні повертається void. Це один крок/поворот, не маршрут. Очікування всередині Step до 10000 мс зберігається, але скрипт не отримує коду підтвердження, відмови або тайм-ауту.
- Гілка не виконує runtime-умови MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor з UO.Step. Сам bridge/Player.Walk та сервер все одно перевіряють рух.
- QueueStep на ігровому потоці перевіряє гравця, з'єднання, напрямок, чергу, темп та локальну прохідність. Перед Player.Walk кожен виклик окремо фіксує покоління Confirm/Deny свого sequence та Walker; потім повертає Result разом із цим знімком. Step і чекаючий StepControlled перевіряють тільки цю збережену пару, а не загальні поля наступного запиту; заміна гравця/Walker припиняє очікування загальною відмовою. Підтвердження іншої чергової команди не підтверджує цього кроку. Поворот без переміщення залишається окремим випадком.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.Specmove");
UO.Specmove(0);Параметри та порядок виконання:
- Передає один крок кроку безпосередньо bridge.
UO.Specmove(0);Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає bridge.Step(direction&7,running!=0), потім відкидає повертається 1/0. Це один крок, не шлях до координати.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}Параметри та порядок виконання:
- Гілка не виконує runtime-умови MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor з UO.Step. Сам bridge/Player.Walk та сервер все одно перевіряють рух.
Мінімальний інтервал кроку: пішки — ходьба 400 мс, біг 200 мс; верхи - ходьба 200 мс, біг 100 мс.
Це стандартні межі клієнта, а не автоматично визначені налаштування вашого шарда. Серверні режими швидкості й політ враховуються окремо. Таймери скрипта можуть уповільнити рух, але не зменшити ці межі.
Кроки, маршрути, Follow, керування мишею/клавішами та карта використовують загальну чергу персонажа. Заміна маршруту, поворот або корекція позиції сервером не скасовують паузу, що залишилася після запиту кроку. Після затримки немає прискореної серії компенсації пропущених кадрів. Очікування підтвердження, перешкоди та поганий зв'язок можуть сповільнити рух.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetX();
UO.Specmove(2, 0);
UO.Wait(500);
UO.Print(UO.GetX() - before);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: direction (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Параметри: direction (Any), running (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseAbility(object? abilityId);Запитує здатність, доступну поточній зброї.
-
abilityId— Ім'я можливості чи int ID 1..AbilityData.Abilities.Length. Імена нормалізуються: зберігаються лише літери/цифри та порівнюються у верхньому регістрі. Числовий текст означає ID.
Числовий прапор int: 1 — ID збігся з основною/додатковою здатністю поточного Player і відповідний GameActions викликаний; 0 - немає Player, невідомий ID/ім'я або здатність не належить поточній зброї.
- Рядкова форма використовує ResolveAbility; числова відразу bridge. UseAbility. Bridge маскує 0x80 у двох поточних здібностей і зіставляє ID, потім викликає UsePrimaryAbility або UseSecondaryAbility.
- Це прийняття локального запиту, не підтвердження влучення, витрати mana або активації сервером. Доступні ID читаються GetWeaponAbilities, активне ім'я - GetActiveAbility.
- GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));Параметри та порядок виконання:
- Запитує здатність, доступну поточній зброї.
UO.Print(UO.UseAbility("Armor Ignore"));Параметри та порядок виконання:
- Рядкова форма використовує ResolveAbility; числова відразу bridge. UseAbility. Bridge маскує 0x80 у двох поточних здібностей і зіставляє ID, потім викликає UsePrimaryAbility або UseSecondaryAbility.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.UseAbility(abilities[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;Параметри та порядок виконання:
- Це прийняття локального запиту, не підтвердження влучення, витрати mana або активації сервером. Доступні ID читаються GetWeaponAbilities, активне ім'я - GetActiveAbility.
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.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.UseAbility(id);
UO.Print(accepted);
UO.Print(UO.GetActiveAbility());
}
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.
Параметри: abilityId (Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Внутрішній код реалізації, не самостійний скрипт.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);Параметри: abilityId (Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Внутрішній код реалізації, не самостійний скрипт.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UsePrimaryAbility();Викликає основну здатність зброї.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- UsePrimaryAbility передає GameActions.UsePrimaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
- У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
- GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.UsePrimaryAbility");
UO.UsePrimaryAbility();Параметри та порядок виконання:
- Викликає основну здатність зброї.
UO.UsePrimaryAbility();Параметри та порядок виконання:
- UsePrimaryAbility передає GameActions.UsePrimaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}Параметри та порядок виконання:
- У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.UsePrimaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
Внутрішній код реалізації, не самостійний скрипт.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSecondaryAbility();Викликає додаткову здатність до зброї.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- UseSecondaryAbility передає GameActions.UseSecondaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
- У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
- GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.UseSecondaryAbility");
UO.UseSecondaryAbility();Параметри та порядок виконання:
- Викликає додаткову здатність до зброї.
UO.UseSecondaryAbility();Параметри та порядок виконання:
- UseSecondaryAbility передає GameActions.UseSecondaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}Параметри та порядок виконання:
- У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.UseSecondaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
Внутрішній код реалізації, не самостійний скрипт.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WarMode();
void UO.WarMode(object? mode);Читає чи запитує бойовий режим персонажа.
-
mode— Необов'язковий int: 0 вимикає, будь-яке ненульове значення включає. Форма без аргументів лише читає.
Без аргументів Числовий прапор "int": "1" - поточний Player в бойовому режимі, "0" - мирний режим/ні Player. З mode - null, результату немає.
- WarMode() читає Player.InWarMode локально. WarMode(mode) викликає GameActions.ToggleWarMode з вибраним режимом; без Player запит не виконується.
- Не надавайте результат форми з аргументом змінної. Негайне повторне читання не є підтвердженням мережі.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));Параметри та порядок виконання:
- Читає чи запитує бойовий режим персонажа.
var active = UO.WarMode();
UO.Print(active);Параметри та порядок виконання:
- WarMode() читає Player.InWarMode локально. WarMode(mode) викликає GameActions.ToggleWarMode з вибраним режимом; без Player запит не виконується.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
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()
{
var before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
Внутрішній код реалізації, не самостійний скрипт.
public int WarMode() => bridge.WarMode();Параметри: mode (Integer)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
Внутрішній код реалізації, не самостійний скрипт.
public void WarMode(int mode) => bridge.WarMode(mode);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WarTargetID();Читає serial останньої мети атаки.
Параметрів немає.
int - збережений serial; 0 означає, що serial не встановлено. Це не bool та не graphic/type; ненульовий ID може вже бути відсутнім у світі.
- Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Читає serial останньої мети атаки.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
return RunScenario();
object? RunScenario()
{
var id = UO.WarTargetID();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(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;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, 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 before = UO.WarTargetID();
UO.Wait(500);
var after = UO.WarTargetID();
UO.Print(before = after);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Внутрішній код реалізації, не самостійний скрипт.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ClassicUO — Bad Newbie & C# Scripts IDE