Repository navigation
UO Topic character Part 4
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MaxStamina();Читає максимальну витривалість із локальної моделі.
Параметрів немає.
int — значення поля StaminaMax, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.
- Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
- Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
- Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
- Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(value));Параметри та порядок виконання:
- Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxStamina();
if (Truth(value > 0))
{
UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
}
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. ReadValue без параметрів читає self; два дзвінки розділені UO.Wait(1000). Порівняння двох знімків може пропустити проміжні зміни.
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 before = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxStamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [MaxStamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxStamina:bridge.MaxStamina.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.MaxStaminaСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MaxWeight();Читає лічильник статусу свого персонажа: максимальна вага у stones.
Параметрів немає.
int — максимальна вага в stones, 0..65535 у моделі клієнта. 0 може бути реальним значенням, відсутністю даних або відсутнім/знищеним Player. Ця кількість не bool, ID або type: 1 означає одну одиницю, а не успіх. Команда не перебирає об'єкти та не повертає масив.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. WeightMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- MaxWeight читає кеш WeightMax. Власний статус type >= 5 задає серверну межу UInt16, навіть якщо вона дорівнює 0. Старий розширений статус обчислює його один раз під час прийому: протокол UO >= 5.0.0a — 7 * floor(Strength / 2) + 40; старіший - Strength * 4 + 25. Результат зберігається як UInt16; крайні значення обертаються за модулем 65536. Strength=101 дає відповідно 390 або 429. При окремій зміні Strength сам getter межа не перераховує.
- CharacterStatus перевіряє обов'язкове тіло до оновлення. Weight є у своєму розширеному статусі, слоти - з type 3, Luck - з type 4, серверний WeightMax - з type 5. Компактний/старий пакет без необов'язкового лічильника залишає його попередній кеш. Новий Player починає з нулів; дзвінок не доводить отримання свіжого статусу.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.MaxWeight();
UO.Print("MaxWeight: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає один виклик без аргументів для свого персонажа; Convert.ToString форматує число для журналу, не змінюючи його значення.
var value = UO.MaxWeight();
UO.Print("WeightMax: " + Convert.ToString(value));Параметри та порядок виконання:
- UO.Wait(500) поділяє before та after на 500 мілісекунд. difference може бути позитивною, нульовою або негативною; проміжні оновлення та зміна персонажа можуть бути пропущені. Пауза належить наприклад.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.MaxWeight();
await Delay(500);
var after = UO.MaxWeight();
var difference = after - before;
UO.Print("Counter change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- CanCarry(extra) отримує додаткову вагу в stones; 10 - приклад, не число стопок. Відкидає негативний extra, відсутність Player або maximum <= 0, читає поточну вагу та межу, потім повертає bool: true або false за extra <= maximum - current. Віднімання уникає переповнення current + extra. При перевантаженні результат false навіть для extra=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()
{
if (Truth(Truth(CanCarry(10)) == true))
{
UO.Print("Local check passed");
}
else
{
UO.Print("Local check failed or data unavailable");
}
return null;
}
dynamic CanCarry(dynamic extra)
{
if (Truth(extra < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0))
{
return false;
}
return extra <= maximum - current;
}
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.MaxWeight. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxWeight:bridge.MaxWeight.
Внутрішній код реалізації, не самостійний скрипт.
public int MaxWeight() => bridge.MaxWeight;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Mount();
void UO.Mount(object? mount);Запитує посадку на обрану верхову тварину/предмет.
-
mount- Необов'язковий serial мети. Без аргументу береться LastTarget. Це ID, не graphic/type. Живий mobile має бути завантажений і перебувати не далі однієї клітини; предмет повинен перебувати в інвентарі персонажа (наприклад, ethereal mount). Довільний предмет у інвентарі не стає їздовим: вирішує сервер.
void — значення, що повертається, немає. Викликайте окремим рядком, не порівнюйте результат з 1/true. Перевіряйте шар 25 після відповіді сервера.
- Команда надсилає запит використання об'єкта протоколу UO (0x06), без емуляції миші. Вона обходить загальний обробник double-click інтерфейсу: у war mode запит не замінюється атакою.
- Стан верхової тварини читається із шару 25. Воно змінюється після даних сервера; повернення з команди не підтверджує завершення посадки/спішування.
- Повторні mount/dismount запити тимчасово поєднуються: до зміни шару, зміни персонажа або закінчення 5 секунд новий запит не надсилається. Це захищає від дублювання між скриптами.
- За відсутності персонажа, поза грою або для мертвого персонажа, запит не надсилається. Остаточні правила володіння, доступності та посадки визначає сервер.
- Якщо персонаж уже верхи, мета дорівнює 0/self, знищена, мертва або недоступна за вказаними умовами, запит не надсилається. Предмет землі відкидається.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.Mount");
UO.Mount();Параметри та порядок виконання:
- Аргументів немає: використовується LastTarget. Print не підтверджує згоду сервера.
if (Truth(UO.GetSerial("lasttarget") == "0x00000000"))
{
UO.Print("Mount target not selected");
return null;
}
UO.Mount();
UO.Print("Mount request processed locally");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- mount=target, номер 25 відноситься до шару власного персонажа. Якщо вже верхи, новий запит не потрібний.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(target == "0x00000000"))
{
return null;
}
if (Truth(UO.ObjAtLayer(25) == 0))
{
UO.Mount(target);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- target - ID цілі. Один запит, потім до 20 очікувань по 50 мс. true/false повертає наш helper, сама UO.Mount повертає Unit.
- false означає, що шар не з'явився цей термін; запізніла відповідь сервера все ще можлива.
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 mounted = await TryMount("lasttarget");
UO.Print("Mounted within one second: " + Convert.ToString(mounted));
return null;
}
async Task<dynamic> TryMount(dynamic target)
{
if (Truth(UO.ObjAtLayer(25) != 0))
{
return true;
}
if (Truth(target == "0x00000000"))
{
return false;
}
UO.Mount(target);
var attempts = 0;
while (Truth(attempts < 20))
{
if (Truth(UO.ObjAtLayer(25) != 0))
{
return true;
}
await Delay(50);
attempts = attempts + 1;
}
return false;
}
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.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Mount:bridge.Mount(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
Внутрішній код реалізації, не самостійний скрипт.
case "mount": bridge.Mount(Arg(0, bridge.LastTarget)); break;Параметри: mount (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Mount:bridge.Mount(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
Внутрішній код реалізації, не самостійний скрипт.
case "mount": bridge.Mount(Arg(0, bridge.LastTarget)); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ObjAtLayer(object? layer);Знаходить предмет на вказаному прошарку екіпірування власного персонажа.
-
layer— Один обов'язковий аргумент: число шару 1..29 або рядкове ім'я зі списку нижче. Число 0 та ім'я Invalid дають 0. Регістр і пробіли імені ігноруються. Невідоме рядкове ім'я викликає помилку скрипту; Чисельний рядок "1" не замінює число 1.
Числова форма повертає int - serial предмета, або 0 для порожнього/неприпустимого шару. Строкова форма повертає string виду "0x40001001", якщо предмет знайдений, інакше int 0. Це ID предмет, а не номер шару, graphic/type або кількість. Метадані object? Рядковий форми відображають два можливі типи результату.
- Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
- Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
- Перевіряються дані екіпірування self. Команда не відкриває сумку, не надягає предмет та не надсилає запит огляду.
- Числа поза 1..29 дають 0 без перетворення за модулем 256; наприклад, 257 не може вибрати праву руку.
- Всі числові шари, що підтримуються, і рядкові імена:
- 1 OneHanded/Rhand/RightHand; 2 TwoHanded/Lhand/LeftHand; 3 Shoes; 4 Pants; 5 Shirt; 6 Helmet/Hat; 7 Gloves; 8 Ring; 9 Talisman; 10 Necklace/Neck.
- 11 Hair; 12 Waist; 13 Torso; 14 Bracelet/Brace; 15 Face; 16 Beard; 17 Tunic; 18 Earrings/Ear; 19 Arms; 20 Cloak.
- 21 Backpack/Bpack/BackpackLayer; 22 Robe; 23 Skirt; 24 Legs; 25 Mount; 26 ShopBuyRestock/Rstk; 27 ShopBuy/NRstk; 28 ShopSell/Sell; 29 Bank.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
object? item = UO.ObjAtLayer("Rhand");
if (item is string serial) UO.Print("Equipped serial: " + serial);
else UO.Print("The layer is empty");Параметри та порядок виконання:
- Rhand вибирає шар 1. При успіху hand - hex-рядок; за відсутності - число 0.
- Convert.ToString дозволяє вивести обидва можливі типи. Результат не можна приймати за graphic зброї.
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
UO.Print("Right hand serial: " + serial);
}
else
{
UO.Print("Right hand is empty or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Число 2 вибирає TwoHanded. Ця форма завжди повертає int.
- Exists перевіряє, що предмет доступний для читання його властивостей. GetGraphic повертає окремий type.
return RunScenario();
object? RunScenario()
{
var item = UO.ObjAtLayer(2);
if (Truth(UO.Exists(item)))
{
UO.Print("Two-handed layer serial: " + Convert.ToString(item));
UO.Print("Graphic: " + UO.GetGraphic(item));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- 21 - шар Backpack; результат 0 можливий до завантаження екіпіровки.
- 257 за межами списку і завжди дає 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()
{
var bag = UO.ObjAtLayer(21);
var invalid = UO.ObjAtLayer(257);
UO.Print("Backpack serial: " + Convert.ToString(bag));
UO.Print("Invalid layer: " + Convert.ToString(invalid));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: layer (Any/String)
Результат: dynamic / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(ObjAtLayer(Text(0))). -
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer:ObjAtLayer(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "objatlayer":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String
? GetObject(ObjAtLayer(Text(0))) : bridge.ObjAtLayer(Arg(0)));Параметри: layer (Any/String)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue ObjAtLayer(string layer)
{
var id = bridge.ObjAtLayer(ConvertLayer(layer));
if (id == 0)
return InjectionValue.Zero;
return new InjectionValue("0x" + id.ToString("X8"));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ObjAtLayerEx(object? layerType, object? playerID);Читає предмет/контейнер у заданому шарі зазначеного завантаженого персонажа.
-
layerType— Числовий номер шару 1..29. Приймається ціле чи числове рядок, наприклад 26 або "0x1A". Рядкові імена Rhand/ShopBuyRestock та bare-константи шарів тут не перетворюються на номери. Використовуйте число. -
playerID— Serial персонажа/mobile, числом, hex-рядком або об'єктним ім'ям, що дозволяється, наприклад "self"/"lasttarget". Graphic/type предмета або ID самого контейнера не підходять.
int: serial предмета/контейнера на шарі або 0 при порожньому/невідомому шарі, неприпустимому номері або відсутності завантаженого Mobile. Це не bool та не номер шару.
- Читання локальне, без target, покупки, відкриття контейнера та запиту мережі.
- Перевіряється діапазон 1..29. Конвертація невідповідного рядкового параметра може спричинити помилку; довільне ім'я шару не слід передавати замість числа.
- Для власного персонажа з рядковим ім'ям шару доступна окрема UO.ObjAtLayer. Не плутайте layer із world Z, індексом статики чи координатою гампа.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ObjAtLayerEx(26, UO.GetSerial("lasttarget"));
UO.Print("ObjAtLayerEx: " + Convert.ToString(result));Параметри та порядок виконання:
- LayerType=26; PlayerID=vendor; shop - serial контейнера. Для GetContent передається shop, а не номер шару.
- Масив індексується з 0 до довжини мінус 1. Кожен елемент – serial. Порожній масив означає відсутність завантажених безпосередніх елементів; покупка не виконується.
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("ShopBuyRestock container is not loaded");
return null;
}
UO.Print("Shop container ID: " + Convert.ToString(shop));
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
UO.Print(UO.GetName(item) + " | ID: " + Convert.ToString(item));
UO.Print("Graphic: " + Convert.ToString(UO.GetType(item)));
i = i + 1;
}
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
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;Параметри та порядок виконання:
- wantedType - graphic, а item - ID окремого предмета. stacks рахує записи/стопки; units складає кількість у них.
- Це читання вже одержаної кількості, а не залишок, гарантований майбутньою покупкою. Ціна тут не призначається.
return RunScenario();
object? RunScenario()
{
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("Shop layer is not loaded");
return null;
}
var wantedType = 0x1766;
var stacks = 0;
var units = 0;
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
if (Truth(UO.GetType(item) == wantedType))
{
stacks = stacks + 1;
units = units + UO.GetQuantity(item);
}
i = i + 1;
}
UO.Print("Stacks: " + Convert.ToString(stacks) + " | Units: " + Convert.ToString(units));
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;Параметри та порядок виконання:
- ShowVendorLayer оголошена повністю. vendor - ID, NPC, layerNumber - 26, 27, 28, caption - тільки підпис.
- Контейнери може бути невідомі клієнту. 0 перевіряється до GetContent: явний GetContent(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 vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
ShowVendorLayer(vendor, 26, "ShopBuyRestock / Rstk");
ShowVendorLayer(vendor, 27, "ShopBuy / NRstk");
ShowVendorLayer(vendor, 28, "ShopSell / Sell");
return null;
}
void ShowVendorLayer(dynamic vendor, dynamic layerNumber, dynamic caption)
{
var container = UO.ObjAtLayerEx(layerNumber, vendor);
if (Truth(container == 0))
{
UO.Print(caption + ": not loaded");
return;
}
var items = UO.GetContent(container);
UO.Print(caption + " | Container ID: " + Convert.ToString(container));
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
}
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.
Параметри: layerType (Any), playerID (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayerEx:bridge.ObjAtLayerEx(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "objatlayerex": return new InjectionValue(bridge.ObjAtLayerEx(Arg(0), Arg(1)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Paralyzed();
int UO.Paralyzed(object? value);Перевіряє відомий клієнт прапор паралічу персонажа.
-
value— Необов'язковий serial/ID mobile: число, hex-рядок, self, lasttarget або інше стандартне ім'я об'єкта або ім'я AddObject. Це не graphic/type. Без аргументу використається self. Невідоме ім'я дозволяється у 0; target не відкривається.
Числовий прапор "int": "1" (умова виконано) - завантажений "mobile" має прапор "IsParalyzed"; 0 (умова не виконано) - прапора немає, mobile невідомий, вилучений або об'єкт є предметом. Це не час паралічу і не гарантія можливості руху в результаті 0.
- Використовуйте Paralyzed для перевірки прапора паралічу. Варіанти Is/Get, GetParalisa, Frozen і GetLocked читають той же прапор.
- Команда лише читає локальні дані. Вона не накладає і не знімає параліч, не чекає його закінчення і не надсилає запит на оновлення серверу.
- Результат цієї команди має тип int: використовуйте if (value != 0) або if (value == 0). Пряме порівняння з true/false та if (value) у C# неприпустимі. Значення зберігає сенс прапора, а чи не кількості чи ID.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Paralyzed();
UO.Print("Paralyzed: " + Convert.ToString(result));Параметри та порядок виконання:
- Порожні дужки вибирають self. state зберігає один знімок прапора; true - числова константа 1.
- Результат false не виключає стіни, відсутність витривалості або іншу причину зупинки.
var state = UO.Paralyzed();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- target зберігає hex-рядок serial останньої мети. IsNpc перевіряє, що це завантажений mobile, включаючи гравців.
- Команда з аргументом читає саме target. Вона не вибирає нового персонажа і не змінює lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.Paralyzed(target);
UO.Print("Selected mobile paralysis 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;Параметри та порядок виконання:
- Не більше 10 пауз по 100 мс. Кожен виклик без аргументу наново читає self.
- Після циклу окремо перевіряється наявність self. Це спостереження приблизно на секунду плюс виконання команд, а не гарантоване зняття паралічу.
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 attempts = 0;
while (Truth(Truth(UO.Paralyzed()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.Paralyzed()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
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.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "paralyzed": return new InjectionValue(bridge.GetLocked(bridge.Self));Параметри: value (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Paralyzed]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
serial => bridge.GetLocked(serial)Внутрішній код реалізації, не самостійний скрипт.
value => getter(GetObject(value))Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PhysicalResist();Читає поле опору поточного персонажа: фізична броня/опір.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. PhysicalResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- PhysicalResistance - серверне поле броні/статусу: класичний сервер може передавати рейтинг броні, а правила з опорами - фізичний опір. API не переводить одне в інше і не обчислює відсоток зниження шкоди. Armor та фізичні псевдоніми читають одне поле.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.PhysicalResist();
UO.Print("PhysicalResist: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.PhysicalResist();
UO.Print("PhysicalResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PhysicalResist();
await Delay(500);
var after = UO.PhysicalResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PhysicalResist();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [PhysicalResist]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.ArmorСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Poison();
void UO.Poison(object? target);Використовує досвід Poisoning, при необхідності на заданій меті.
-
target— Необов'язковий serial/аліас цілі. Без аргументів - тільки UseSkill("Poisoning"). З аргументом - UseSkillAtTarget("Poisoning", target).
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- Зареєстрована legacy-команда не є getter опору отрути або стану отруєння. Гілка викликає навичку та відкидає її 1/0.
- У формі з метою UseSkillAtTarget перевіряє позитивний serial, готує ціль до запиту навички; при неприйнятому навичці скасовує target. Отруєння цілі сервером не гарантується.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.Poison");
UO.Poison();Параметри та порядок виконання:
- Використовує досвід Poisoning, при необхідності на заданій меті.
UO.Poison();Параметри та порядок виконання:
- Зареєстрована legacy-команда не є getter опору отрути або стану отруєння. Гілка викликає навичку та відкидає її 1/0.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.Poison("lasttarget");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- У формі з метою UseSkillAtTarget перевіряє позитивний serial, готує ціль до запиту навички; при неприйнятому навичці скасовує 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 = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.Poison(id);
UO.Print(UO.Waiting());
}
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.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
Внутрішній код реалізації, не самостійний скрипт.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;Параметри: target (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
Внутрішній код реалізації, не самостійний скрипт.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PoisonResist();Читає поле опору поточного персонажа: отрута.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. PoisonResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.PoisonResist();
UO.Print("PoisonResist: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.PoisonResist();
UO.Print("PoisonResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PoisonResist();
await Delay(500);
var after = UO.PoisonResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PoisonResist();
return value >= minimum;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PoisonResistance:bridge.PoisonResistance.
Внутрішній код реалізації, не самостійний скрипт.
case "poisonresist": return new InjectionValue(bridge.PoisonResistance);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Poisoned();
int UO.Poisoned(object? id);Перевіряє отруєння персонажа.
-
id— Необов'язковий об'єкт у показаних формах: serial числом/hex-рядком, self, lasttarget або зареєстроване ім'я AddObject. Це не type. Без аргументу читається self. Невідомий текст у деяких формах викликає помилку перетворення; перевіряйте ім'я перед викликом.
Числовий прапор int: 1 (умова виконана), 0 (умова не виконано). Це числовий прапор: в C# перевіряйте result != 0 або result == 0. Пряме порівняння int з true/false та if (result) неприпустимо. "1" - "mobile" має "IsPoisoned", "0" - прапора немає або "mobile" немає. Ступінь отрути і час, що залишився, не повертаються.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Читає локальну модель: не відкриває target, не вимагає status, не змінює прапор і не відправляє пакет. Знищений об'єкт вважається відсутнім ще до видалення запису зі словника.
- Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
- Для Poisoned/Flying враховується версія протоколу: до 7.0.0.0 біт 0x04 означає отруту; починаючи з 7.0.0.0 він означає політ, а отрута зберігається окремо. Політ не обчислюється із Z.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Poisoned();
UO.Print("Poisoned: " + Convert.ToString(result));Параметри та порядок виконання:
- Порожні дужки читають self. active зберігає результат один раз; true і false задають дві гілки. Print лише виводить приклад повідомлення.
var active = UO.Poisoned();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- lasttarget — вибраний раніше об'єкт. Exists перевіряє його наявність. obj - єдиний параметр ReadState; функція повертає результат команди без зміни. Її визначення входить у код, що копіюється.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.Poisoned(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Два виклики без аргументів читають self, UO.Wait(500) задає 500 мілісекунд. Порівнюються два знімки; проміжні переходи можуть бути пропущені. Нескінченного очікування немає.
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 before = UO.Poisoned();
await Delay(500);
var after = UO.Poisoned();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
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.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
public int Poisoned() => bridge.Poisoned(bridge.Self);Параметри: id (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутрішній код реалізації, не самостійний скрипт.
public int Poisoned(InjectionValue id) => bridge.Poisoned(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Race();Читає расу персонажа із моделі клієнта.
Параметрів немає.
int — 1=human, 2=elf, 3=gargoyle за моделлю клієнта. 0 означає відсутність завантаженого персонажа. Це не body/graphic та не serial.
- Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
- C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.Race();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів відноситься до self. Раса персонажа зберігається у значенні.
- Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Race();
UO.Print("Race: " + Convert.ToString(value));Параметри та порядок виконання:
- Значення читається одного разу без аргументів. Расу персонажа використовують у показаному розрахунку чи умови.
- Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return RunScenario();
object? RunScenario()
{
var value = UO.Race();
if (Truth(value == 3))
{
UO.Print("Player race is gargoyle");
}
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(1000) дає паузу в мілісекундах між знімками.
- Порівнюється зміна: расу персонажа. Приклад нічого не змінює у світі і не чекає нескінченно. Події всередині цієї секунди можуть бути пропущені.
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 before = UO.Race();
await Delay(1000);
var after = UO.Race();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Race:bridge.Race.
Внутрішній код реалізації, не самостійний скрипт.
case "race": return new InjectionValue(bridge.Race);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveEarrings();Вимагає зняття предмета із шару Ear.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteLegacyManualAlias викликає Unequip("Ear"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.RemoveEarrings");
UO.RemoveEarrings();Параметри та порядок виконання:
- Вимагає зняття предмета із шару Ear.
UO.RemoveEarrings();Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає Unequip("Ear"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ear"));
UO.RemoveEarrings();
return null;
}Параметри та порядок виконання:
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveEarrings();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ear"));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ear").
Внутрішній код реалізації, не самостійний скрипт.
case "removeearrings": Unequip("Ear"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveHat();Запитує зняття предмета із шару Hat.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteLegacyManualAlias викликає Unequip("Hat"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.RemoveHat");
UO.RemoveHat();Параметри та порядок виконання:
- Запитує зняття предмета із шару Hat.
UO.RemoveHat();Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає Unequip("Hat"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Hat"));
UO.RemoveHat();
return null;
}Параметри та порядок виконання:
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveHat();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Hat"));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Hat").
Внутрішній код реалізації, не самостійний скрипт.
case "removehat": Unequip("Hat"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveNeckless();Вимагає зняття предмета з шару Neck.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteLegacyManualAlias викликає Unequip("Neck"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.RemoveNeckless");
UO.RemoveNeckless();Параметри та порядок виконання:
- Вимагає зняття предмета з шару Neck.
UO.RemoveNeckless();Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає Unequip("Neck"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Neck"));
UO.RemoveNeckless();
return null;
}Параметри та порядок виконання:
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveNeckless();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Neck"));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Neck").
Внутрішній код реалізації, не самостійний скрипт.
case "removeneckless": Unequip("Neck"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveRing();Запитує зняття предмета із шару Ring.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteLegacyManualAlias викликає Unequip("Ring"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.RemoveRing");
UO.RemoveRing();Параметри та порядок виконання:
- Запитує зняття предмета із шару Ring.
UO.RemoveRing();Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає Unequip("Ring"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ring"));
UO.RemoveRing();
return null;
}Параметри та порядок виконання:
- Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveRing();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ring"));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ring").
Внутрішній код реалізації, не самостійний скрипт.
case "removering": Unequip("Ring"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RequestStats(object? objID);Запитує status персонажа по serial.
-
objID— Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- RequestStats викликає RequestMobileStatus(_world, serial, true). Виклик не повертає масив характеристик та не чекає відповіді; GetHP/GetStr після нього читають локальну модель.
- Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.RequestStats");
UO.RequestStats(UO.GetSerial("lasttarget"));Параметри та порядок виконання:
- Запитує status персонажа по serial.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- RequestStats викликає RequestMobileStatus(_world, serial, true). Виклик не повертає масив характеристик та не чекає відповіді; GetHP/GetStr після нього читають локальну модель.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(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;Параметри та порядок виконання:
- 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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.RequestStats(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.RequestStats:bridge.RequestStats(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "requeststats": bridge.RequestStats(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistCold();Читає поле опору поточного персонажа: мороз.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. ColdResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ResistCold();
UO.Print("ResistCold: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistCold();
UO.Print("ColdResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistCold();
await Delay(500);
var after = UO.ResistCold();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistCold();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [ResistCold]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ColdResistance:bridge.ColdResistance.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.ColdResistanceСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistEnergy();Читає поле опору нинішнього персонажа: енергія.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. EnergyResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ResistEnergy();
UO.Print("ResistEnergy: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistEnergy();
UO.Print("EnergyResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistEnergy();
await Delay(500);
var after = UO.ResistEnergy();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistEnergy();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [ResistEnergy]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnergyResistance:bridge.EnergyResistance.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.EnergyResistanceСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistFire();Читає поле опору нинішнього персонажа: вогонь.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. FireResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ResistFire();
UO.Print("ResistFire: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistFire();
UO.Print("FireResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistFire();
await Delay(500);
var after = UO.ResistFire();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistFire();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [ResistFire]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FireResistance:bridge.FireResistance.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.FireResistanceСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistPhysical();Читає поле опору поточного персонажа: фізична броня/опір.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. PhysicalResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- PhysicalResistance - серверне поле броні/статусу: класичний сервер може передавати рейтинг броні, а правила з опорами - фізичний опір. API не переводить одне в інше і не обчислює відсоток зниження шкоди. Armor та фізичні псевдоніми читають одне поле.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ResistPhysical();
UO.Print("ResistPhysical: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistPhysical();
UO.Print("PhysicalResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPhysical();
await Delay(500);
var after = UO.ResistPhysical();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPhysical();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [ResistPhysical]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.ArmorСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistPoison();Читає поле опору поточного персонажа: отрута.
Параметрів немає.
int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. PoisonResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
- CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ResistPoison();
UO.Print("ResistPoison: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistPoison();
UO.Print("PoisonResistance: " + Convert.ToString(value));Параметри та порядок виконання:
- Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPoison();
await Delay(500);
var after = UO.ResistPoison();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPoison();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [ResistPoison]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PoisonResistance:bridge.PoisonResistance.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.PoisonResistanceСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Self();Повертає ID поточного персонажа.
Параметрів немає.
int — serial/ID, не graphic/type, шар, кількість предметів або bool. 0 — поточного об'єкта немає. Зберігаються всі 32 біта serial; перевіряйте != 0, не == true або > 0. Збережений результат сам не оновлюється. Читає World.Player.Serial; відсутній або знищений Player дає 0. Смерть відрізняється від видалення: присутній привид зберігає ID персонажа.
- Параметрів немає. Читає локальні дані через Invoke на ігровому потоці; скасування скрипта перериває очікування цього потоку. Не надсилає пакет, не відкриває контейнер/target і не переносить предмет.
- Вбудований self/backpack без дужок читається заново, якщо його не перекрила змінна скрипта. Строкові імена обробляє команда, що приймає. У призначенні перенесення "self" означає рюкзак, а UO.Self() повертає serial персонажа. Для ID контейнера явно використовуйте UO.Backpack().
- World.Clear видаляє Player; наступні читання дають 0. Вхід у світ або заміна сумки можуть змінити ID. Окремі читання не є атомарними. Ненульова ID не доводить підключення, дозвіл сервера або завантаження вмісту.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Self();
UO.Print("Self: " + Convert.ToString(result));Параметри та порядок виконання:
- id зберігає результат одного дзвінка; HEX форматує serial для журналу. Приклад нічого не вибирає та не використовує.
var id = UO.Self();
UO.Print("ID: " + Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- before/after читаються з інтервалом 250 мс. UO.Wait доданий лише у приклад. Рівність означає однакові кінцеві ID; проміжні зміни можуть бути пропущені.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Self();
await Delay(250);
var after = UO.Self();
if (Truth(before != after))
{
UO.Print("ID changed: " + Hex(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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;Параметри та порядок виконання:
- candidate - збережений ID LastTarget. IsOwnSerial(candidate) приймає один serial і повертає bool: true для поточного ненулевого власного ID, інакше false. Визначення функції наведено повністю; 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 candidate = UO.LastTarget();
if (Truth(Truth(IsOwnSerial(candidate)) == true))
{
UO.Print("Own object selected");
}
else
{
UO.Print("Different object or no own object");
}
return null;
}
dynamic IsOwnSerial(dynamic candidate)
{
var current = UO.Self();
return Truth(current != 0) && Truth(current == candidate);
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "self": return new InjectionValue(bridge.Self);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetARExtParams();
void UO.SetARExtParams(object? shardName);
void UO.SetARExtParams(object? shardName, object? charName);
void UO.SetARExtParams(object? shardName, object? charName, object? useAtEveryConnect);Задає сервер зі списку шардів та персонажа для наступного входу. Корисно, коли скрипт повинен перепідключити певним персонажем того ж облікового запису.
-
shardName— Необов'язкове ім'я сервера зі списку входу, не IP і не порт. Порожнє або пропущене значення набирає поточний ShardName. Прогалини з обох боків видаляються. -
charName— Необов'язкове ім'я існуючого персонажа облікового запису. Порожнє або пропущене значення бере ім'я self, якщо воно відоме. Це ім'я, не номер слота та не serial; Непусте ім'я має пріоритет над слотом профілю. -
useAtEveryConnect— Необов'язковий прапор: false/0 за умовчанням — одноразовий вибір; true/1 або інше ненульове ціле — зберігати вибір для подальших входів у цьому сеансі.
void - значення немає. Це налаштування наступного входу, а чи не підтвердження підключення чи існування персонажа.
- У менеджері одноразові імена зберігаються через невдалі мережеві спроби і витрачаються лише після входження у світ. Наступне підключення повертається до параметрів профілю. Постійний вибір діє до нового настроювання або завершення власника сеансу; файл профілю менеджера не переписується. Нове налаштування під час входу відноситься до наступного входу і не втрачається при завершенні поточного.
- В окремому графічному клієнті сервер зберігається як LastServerName, персонаж - через LastCharacterManager. Після успішного входу персонаж також стає останнім використаним: одноразовість не означає автоматичного повернення до колишнього персонажа. Постійний override живе у поточному процесі.
- Сама команда не включає автореконнект і не розриває зв'язок. Для цього окремо використовують SetARStatus, Connect та Disconnect. Імена повинні бути присутніми у списках сервера, порівняння не враховує регістр. Якщо в менеджері вимкнено автоматичний вхід персонажем, залишається ручний вибір. Офлайн ім'я self може бути невідомим: вказуйте імена явно. Команда не змінює обліковий запис, пароль, IP, порт та Encryption; пусті значення без доступного поточного імені не очищають заданий вибір.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetARExtParams");
UO.SetARExtParams("", "", true);Параметри та порядок виконання:
- Перший приклад працює лише онлайн. Два порожні рядки беруть поточні імена; true зберігає їх для повторних входів, SetARStatus(true) включає політику автореконнекту. Негайного перепідключення немає.
if (!(Truth(UO.Connected())))
{
return null;
}
UO.SetARExtParams("", "", true);
UO.SetARStatus(true);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Другий приклад вибирає Example Character тільки якщо це ім'я є реальним GetCharsListForShard. Масив індексується з 0; ToLowerInvariant порівнює імена без урахування регістру. false означає один успішний вхід, після налаштування включається автореконнект і викликається Disconnect. Замініть своє ім'я на своє. За відсутності імені зв'язок зберігається. Автопауза може затримати відновлення до відновлення зв'язку.
return RunScenario();
object? RunScenario()
{
if (!(Truth(UO.Connected())))
{
return null;
}
var wanted = "Example Character";
var names = UO.GetCharsListForShard();
var i = 0;
while (Truth(i < ArrayLength(names)))
{
if (Truth(Convert.ToString(names[i]) == Convert.ToString(wanted)))
{
UO.SetARExtParams("", names[i], false);
UO.SetARStatus(true);
UO.Disconnect();
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;Параметри та порядок виконання:
- Третій приклад запускають із працюючого офлайн-скрипту. Явно задані Example Shard та Example Character; замініть їх на реальні імена. true зберігає вибір, false у SetARStatus відключає автоматичні повтори, Connect запитує один вхід. Потрібні збережені реквізити облікового запису. Connect не чекає на готовність світу; автоматично зупинений скрипт не дійде до цих рядків без відновлення.
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()
{
if (Truth(UO.Connected()))
{
return null;
}
UO.SetARExtParams("Example Shard", "Example Character", true);
UO.SetARStatus(false);
UO.Connect();
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.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Параметри: shardName (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Параметри: shardName (Any), charName (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Параметри: shardName (Any), charName (Any), useAtEveryConnect (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetARStatus(object? value);Вмикає або вимикає автоматичне перепідключення.
-
value— 0 вимикає; будь-яке ненульове ціле включає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- Bridge.SetAutoReconnect змінює налаштування автоматичного перепідключення. Значення сприймається як enabled != 0; негайний вхід/вихід серверу не виконується.
- Змінює налаштування клієнта. Значення не є результатом перевірки з'єднання та не підтверджує обробку сервером.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetARStatus");
UO.SetARStatus(1);Параметри та порядок виконання:
- Вмикає або вимикає автоматичне перепідключення.
UO.SetARStatus(1);Параметри та порядок виконання:
- Bridge.SetAutoReconnect змінює налаштування автоматичного перепідключення. Значення сприймається як enabled != 0; негайний вхід/вихід серверу не виконується.
return RunScenario();
object? RunScenario()
{
UO.SetARStatus(0);
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()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetARStatus(mode);
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: value (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetAutoReconnect:bridge.SetAutoReconnect(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "setarstatus": bridge.SetAutoReconnect(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetArm(object? name);Запам'ятовує поточну зброю та щит у іменованому наборі.
-
name- Строкове ім'я набору, наприклад "travel" або "battle". Імена нечутливі до регістру. Набори одягу та зброї зберігаються окремо: однакове ім'я допустиме в обох. Це не ID речі та не ім'я файлу. Тільки SetDress допускає відсутність імені: тоді записується окремий набір для DressSavedSet/EquipDressSet.
void - значення немає. Викликайте окремим рядком; не привласнюйте результат і не порівнюйте його з true. Збереження та видалення змінюють запис, а не екіпірування.
- Одяг: шари 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Зброя: тільки 1 та 2. Волосся, борода, рюкзак, тварина та банк у ці набори не входять.
- Записуються конкретні serial вже завантажених речей у своїх шарах. Повторне збереження того самого імені замінює запис. Порожні шари теж мають сенс: при відновленні відповідний шар буде звільнений у власний рюкзак. Тому збережений повністю порожній набір знімає речі своїх прошарків.
- Набір зберігається в стані runtime. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetArm");
UO.SetArm("battle");Параметри та порядок виконання:
- Знімок робиться зараз, коли потрібні речі вже одягнені. Виклик не надягає предметів з рюкзака.
UO.SetArm("battle");Параметри та порядок виконання:
- Однакове ім'я використовується у різних сховищах. SetDress() також окремо зберігає безіменний набір; це не вибір раніше записаного імені.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
return null;
}Параметри та порядок виконання:
- SaveIfReady перевіряє контрольний шар: 3 — взуття для одягу, 1 — права рука для зброї. Якщо вона порожня, знімок не перезаписується. Повертається 1/0 належить помічнику, а не SetDress/SetArm.
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()
{
return SaveIfReady("battle");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(1, UO.Self()) == 0))
{
return 0;
}
UO.SetArm(name);
return 1;
}
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 (String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.SetArm. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, armSets, weaponLayers, "Arm set.").
Внутрішній код реалізації, не самостійний скрипт.
public void SetArm(string name)
=> SetEquip(name, armSets, weaponLayers, "Arm set.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetDress();
void UO.SetDress(object? name);Запам'ятовує поточні одягнені одяг та зброю для подальшого відновлення.
-
name- Строкове ім'я набору, наприклад "travel" або "battle". Імена нечутливі до регістру. Набори одягу та зброї зберігаються окремо: однакове ім'я допустиме в обох. Це не ID речі та не ім'я файлу. Тільки SetDress допускає відсутність імені: тоді записується окремий набір для DressSavedSet/EquipDressSet.
void - значення немає. Викликайте окремим рядком; не привласнюйте результат і не порівнюйте його з true. Збереження та видалення змінюють запис, а не екіпірування.
- Одяг: шари 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Зброя: тільки 1 та 2. Волосся, борода, рюкзак, тварина та банк у ці набори не входять.
- Записуються конкретні serial вже завантажених речей у своїх шарах. Повторне збереження того самого імені замінює запис. Порожні шари теж мають сенс: при відновленні відповідний шар буде звільнений у власний рюкзак. Тому збережений повністю порожній набір знімає речі своїх прошарків.
- Набір зберігається в стані runtime. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetDress");
UO.SetDress();Параметри та порядок виконання:
- Знімок робиться зараз, коли потрібні речі вже одягнені. Виклик не надягає предметів з рюкзака.
UO.SetDress("travel");Параметри та порядок виконання:
- Однакове ім'я використовується у різних сховищах. SetDress() також окремо зберігає безіменний набір; це не вибір раніше записаного імені.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
UO.SetDress();
return null;
}Параметри та порядок виконання:
- SaveIfReady перевіряє контрольний шар: 3 — взуття для одягу, 1 — права рука для зброї. Якщо вона порожня, знімок не перезаписується. Повертається 1/0 належить помічнику, а не SetDress/SetArm.
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()
{
return SaveIfReady("travel");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(3, UO.Self()) == 0))
{
return 0;
}
UO.SetDress(name);
return 1;
}
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.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SetDress:SetDress("__stealth_saved_set__").
Внутрішній код реалізації, не самостійний скрипт.
case "setdress": SetDress("__stealth_saved_set__"); return InjectionValue.Unit;Параметри: name (String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.SetDress. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, dressSets, dressLayers, "Clothing set.").
Внутрішній код реалізації, не самостійний скрипт.
public void SetDress(string name)
=> SetEquip(name, dressSets, dressLayers, "Clothing set.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetDressSpeed(object? delayms);Задає паузу між запитами перевдягання.
-
delayms- int, мілісекунди. Значення обмежується до 10..10000 включно.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- SetDressSpeed зберігає state.DressSpeed = max (10, min(10000, delayms)). Цим користуються операції збережених комплектів; швидкість дозволених сервером дій не змінюється.
- Значення менше 10 стає 10, більше 10000 — 10000. Команда не вдягає та не знімає предмети.
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetDressSpeed");
UO.SetDressSpeed(250);Параметри та порядок виконання:
- Задає паузу між запитами перевдягання.
UO.SetDressSpeed(250);Параметри та порядок виконання:
- SetDressSpeed зберігає state.DressSpeed = max (10, min(10000, delayms)). Цим користуються операції збережених комплектів; швидкість дозволених сервером дій не змінюється.
return RunScenario();
object? RunScenario()
{
UO.SetDressSpeed(0);
UO.Print(UO.DressSpeed());
return null;
}Параметри та порядок виконання:
- Значення менше 10 стає 10, більше 10000 — 10000. Команда не вдягає та не знімає предмети.
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.SetDressSpeed(20000);
UO.Print(UO.DressSpeed());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: delayms (Integer)
Результат: void / Unit.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public void SetDressSpeed(int delayms) => state.DressSpeed = Math.Max(10, Math.Min(10_000, delayms));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetStatLockState(object? statNum, object? statState);Запитує зміну режиму характеристики.
-
statNum- Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком. -
statState— Обов'язковий режим: ?0? — підвищення, ?1? — зниження, ?2? — блокування. Це три коди, не bool; true/false не замінюють назви всіх режимів.
void - значення, що повертається немає. Не можна використовувати результат як успіх/помилка або порівнювати з true. Подальше читання показує локальну модель, а чи не підтвердження сервера.
- Допустимий запит надсилає один пакет через GameActions і відразу змінює локальний режим. Сервер може застосувати свої обмеження; підвищення навички чи характеристики не гарантується. Невідома навичка, неприпустимий індекс/режим та відсутність персонажа ігноруються без пакета.
- Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
- ExecuteClientApiCompatibility вибирає гілку команди. Text читає селектор навички, Arg - числові номери та режими. Неперетворюваний аргумент може завершити виклик помилкою перетворення.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetStatLockState");
UO.SetStatLockState(0, 2);Параметри та порядок виконання:
- У прикладі явно задані selector і при записі mode. Перший рядок вибирає навичку на ім'я або характеристику за номером. Print лише виводить результат.
var selector = 0;
var mode = 2;
UO.SetStatLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));Параметри та порядок виконання:
- Поріг 95.1 та режими 0/1/2 задані для прикладу. −1 перевіряється до зміни режиму. Після запису читається лише локальна копія; це не очікування відповіді сервера.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Весь код помічника наведено нижче Main. selector вибирає навичку/характеристику, mode визначає режим запису. ReadValue/ReadMode повертають вихідне число; ApplyMode перевіряє аргументи, виконує дію та не повертає значення. UO.Wait(1000) у прикладі читання розділяє два знімки.
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(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatLockState(selector, mode);
}
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.
Параметри: statNum (Any), statState (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetStatState(object? statNum, object? statState);Запитує зміну режиму характеристики.
-
statNum- Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком. -
statState— Обов'язковий режим: ?0? — підвищення, ?1? — зниження, ?2? — блокування. Це три коди, не bool; true/false не замінюють назви всіх режимів.
void - значення, що повертається немає. Не можна використовувати результат як успіх/помилка або порівнювати з true. Подальше читання показує локальну модель, а чи не підтвердження сервера.
- Допустимий запит надсилає один пакет через GameActions і відразу змінює локальний режим. Сервер може застосувати свої обмеження; підвищення навички чи характеристики не гарантується. Невідома навичка, неприпустимий індекс/режим та відсутність персонажа ігноруються без пакета.
- Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
- ExecuteClientApiCompatibility вибирає гілку команди. Text читає селектор навички, Arg - числові номери та режими. Неперетворюваний аргумент може завершити виклик помилкою перетворення.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetStatState");
UO.SetStatState(0, 2);Параметри та порядок виконання:
- У прикладі явно задані selector і при записі mode. Перший рядок вибирає навичку на ім'я або характеристику за номером. Print лише виводить результат.
var selector = 0;
var mode = 2;
UO.SetStatState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));Параметри та порядок виконання:
- Поріг 95.1 та режими 0/1/2 задані для прикладу. −1 перевіряється до зміни режиму. Після запису читається лише локальна копія; це не очікування відповіді сервера.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Весь код помічника наведено нижче Main. selector вибирає навичку/характеристику, mode визначає режим запису. ReadValue/ReadMode повертають вихідне число; ApplyMode перевіряє аргументи, виконує дію та не повертає значення. UO.Wait(1000) у прикладі читання розділяє два знімки.
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(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatState(selector, mode);
}
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.
Параметри: statNum (Any), statState (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Sex();Читає код статі та раси з моделі клієнта.
Параметрів немає.
int — сумісний код: 0=human male, 1=human female, 2=elf male, 3=elf female, 4=gargoyle male, 5=gargoyle Без персонажа також 0, тому для наявності перевіряйте Exists(self). Це не простий bool female.
- Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
- C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.Sex();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів відноситься до self. Код статі та раси зберігається у value.
- Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Sex();
UO.Print("Sex: " + Convert.ToString(value));Параметри та порядок виконання:
- Значення читається одного разу без аргументів. Код статі та раси використовується у наведеному розрахунку або умові.
- Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return RunScenario();
object? RunScenario()
{
var value = UO.Sex();
if (Truth(value == 4) || Truth(value == 5))
{
UO.Print("Gargoyle sex/race code");
}
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(1000) дає паузу в мілісекундах між знімками.
- Порівнюється зміна: код статі та раси. Приклад нічого не змінює у світі і не чекає нескінченно. Події всередині цієї секунди можуть бути пропущені.
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 before = UO.Sex();
await Delay(1000);
var after = UO.Sex();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Sex:bridge.Sex.
Внутрішній код реалізації, не самостійний скрипт.
case "sex": return new InjectionValue(bridge.Sex);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Stam();Читає поточну витривалість із локальної моделі.
Параметрів немає.
int — значення поля Stamina, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.
- Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
- Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
- Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
- Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.Stam();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.Stam();
UO.Print("Stam: " + Convert.ToString(value));Параметри та порядок виконання:
- Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return RunScenario();
object? RunScenario()
{
var value = UO.Stam();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
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. ReadValue без параметрів читає self; два дзвінки розділені UO.Wait(1000). Порівняння двох знімків може пропустити проміжні зміни.
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 before = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Stam();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
Внутрішній код реалізації, не самостійний скрипт.
case "stam": return new InjectionValue(bridge.Stamina);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Stamina();Читає поточну витривалість із локальної моделі.
Параметрів немає.
int — значення поля Stamina, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.
- Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
- Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
- Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
- Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Stamina();
UO.Print("Stamina: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.Stamina();
UO.Print("Stamina: " + Convert.ToString(value));Параметри та порядок виконання:
- Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return RunScenario();
object? RunScenario()
{
var value = UO.Stamina();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
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. ReadValue без параметрів читає self; два дзвінки розділені UO.Wait(1000). Порівняння двох знімків може пропустити проміжні зміни.
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 before = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Stamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Stamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.StaminaСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Str();Читає поточну силу (Strength) персонажа.
Параметрів немає.
int — поточні окуляри характеристики, 0..65535 у моделі клієнта; не відсоток, ID, навичка, режим блокування або bool. 0 також означає відсутність/видалення персонажа або недоступний об'єкт. Порівнюйте з числовою вимогою, не == true. Це не межа характеристики та не гарантоване базове значення без модифікаторів.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читає Player.Strength, якщо Player існує й не знищений; інакше 0. Присутній мертвий персонаж не є видаленим об’єктом. Характеристика не обчислюється з HP, мани чи витривалості.
- GetStr/GetInt/GetDex приймають ObjID. Дані PlayerMobile доступні лише для self; для іншого serial - 0, навіть для завантаженого mobile. Чужа характеристика не підставляється і вгадується.
- Invoke читає на ігровому потоці з можливістю скасувати очікування на скрипт. Чи не запитує status, не відкриває target, не посилає пакет, не змінює характеристику і не додає затримку.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- У C# використовуйте точне написання:
UO.Str(),UO.Strength(),UO.GetStr()абоUO.GetStrength(). C# враховує регістр літер.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Str();
UO.Print("Str: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає числовий результат; Convert.ToString лише форматує його для журналу. Аргументів та дії персонажа немає.
var value = UO.Str();
UO.Print("Strength: " + Convert.ToString(value));Параметри та порядок виконання:
- before та after поділяє 1000 мс; UO.Wait доданий у приклад. change=after-before буває позитивним, нульовим чи негативним. Сам собою він не розрізняє всі проміжні оновлення і вихід зі світу.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Str();
await Delay(1000);
var after = UO.Str();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 80 - приклад вимоги, не межа клієнта. AttributeAtLeast(minimum) відкидає відсутнього персонажа, один раз читає характеристику та повертає bool: true або false за умовою >= minimum. Логічне значення дає порівняння, не сама характеристика.
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()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Str();
return value >= minimum;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
Внутрішній код реалізації, не самостійний скрипт.
case "str": return new InjectionValue(bridge.Strength);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Strength();Читає поточну силу (Strength, Convert. ToString) персонажа.
Параметрів немає.
int — поточні окуляри характеристики, 0..65535 у моделі клієнта; не відсоток, ID, навичка, режим блокування або bool. 0 також означає відсутність/видалення персонажа або недоступний об'єкт. Порівнюйте з числовою вимогою, не == true. Це не межа характеристики та не гарантоване базове значення без модифікаторів.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читає Player.Strength, якщо Player існує й не знищений; інакше 0. Присутній мертвий персонаж не є видаленим об’єктом. Характеристика не обчислюється з HP, мани чи витривалості.
- GetStr/GetInt/GetDex приймають ObjID. Дані PlayerMobile доступні лише для self; для іншого serial - 0, навіть для завантаженого mobile. Чужа характеристика не підставляється і вгадується.
- Invoke читає на ігровому потоці з можливістю скасувати очікування на скрипт. Чи не запитує status, не відкриває target, не посилає пакет, не змінює характеристику і не додає затримку.
- Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
- C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.Str(),UO.Strength(),UO.GetStr(),UO.GetStrength().
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Strength();
UO.Print("Strength: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає числовий результат; Convert.ToString лише форматує його для журналу. Аргументів та дії персонажа немає.
var value = UO.Strength();
UO.Print("Strength: " + Convert.ToString(value));Параметри та порядок виконання:
- before та after поділяє 1000 мс; UO.Wait доданий у приклад. change=after-before буває позитивним, нульовим чи негативним. Сам собою він не розрізняє всі проміжні оновлення і вихід зі світу.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Strength();
await Delay(1000);
var after = UO.Strength();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- minimum = 80 - приклад вимоги, не межа клієнта. AttributeAtLeast(minimum) відкидає відсутнього персонажа, один раз читає характеристику та повертає bool: true або false за умовою >= minimum. Логічне значення дає порівняння, не сама характеристика.
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()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Strength();
return value >= minimum;
}
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.RegisterCharacterGetterAliases [Strength]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.StrengthСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TicksDead();Читає чи вперше встановлює позначку поміченої смерті.
Параметрів немає.
int - UO.Timer в десятих секунди від старту runtime, спочатку 0. Чи не число смертей і не тривалість смерті.
- При кожному дзвінку, якщо bridge.Dead()!=0 та ticksDead==0, зберігає Timer(). Інакше повертає колишнє ticksDead. Після пожвавлення поле цим способом не скидається.
- Це позначка першого дзвінка TicksDead під час поміченої смерті, не точний час серверної події. У першій десятій секунді значення 0 може бути встановлене повторно.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TicksDead();
UO.Print("TicksDead: " + Convert.ToString(result));Параметри та порядок виконання:
- Читає чи вперше встановлює позначку поміченої смерті.
UO.Print(UO.TicksDead());Параметри та порядок виконання:
- При кожному дзвінку, якщо bridge.Dead()!=0 та ticksDead==0, зберігає Timer(). Інакше повертає колишнє ticksDead. Після пожвавлення поле цим способом не скидається.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsDead()))
{
var stamp = UO.TicksDead();
UO.Print(UO.Timer() - stamp);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Це позначка першого дзвінка TicksDead під час поміченої смерті, не точний час серверної події. У першій десятій секунді значення 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 before = UO.TicksDead();
UO.Wait(500);
UO.Print(before = UO.TicksDead());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TicksDead. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dead:bridge.Dead(). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
Внутрішній код реалізації, не самостійний скрипт.
public int TicksDead()
{
if (bridge.Dead() != 0 && ticksDead == 0)
ticksDead = Timer();
return ticksDead;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ToggleFly();Запитує перемикання польоту свого Gargoyle: із землі — у політ, із польоту — на землю. Це дія, а UO.Flying() тільки перевіряє стан. Команда стане в нагоді перед маршрутом, що вимагає певного режиму.
Параметрів немає.
void - значення немає. Це не true/false і не підтвердження сервера. Фактичний результат перевіряйте через UO.Flying() після обробки серверної відповіді.
- Єдина форма - UO.ToggleFly(), без ID, координат і параметра true/false. Належить до свого персонажа; політ іншого mobile змінити не можна.
- Відправляє запит 0xBF з підкомандою 0x0032. Сам виклик не перевіряє расу, версію протоколу, дозволу сервера та поточний режим; вибирайте його для свого Gargoyle на сервері з підтримкою польоту.
- Сервер може відмовити, а оновлення стану надходить пізніше. Не викликайте ToggleFly у циклі очікування: повторний запит може скасувати попереднє перемикання. Надішліть один запит і читайте Flying до тайм-ауту.
- Висота Z та ознака польоту - різні дані. UO.Flying() повертає int 1/true або 0/false; false також можливий за відсутності персонажа або старого протоколу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.ToggleFly");
UO.ToggleFly();Параметри та порядок виконання:
- Приклад призначений для свого Gargoyle на сервері, що підтримує політ. EnsureFlight(timeoutMs) повертає 1/true, якщо спостерігається політ, інакше 0/false. 2000 - межа очікування в мілісекундах; перевірки кожні 50 мс. Якщо вже летить, ToggleFly не викликається. Відправляється не більше одного запиту, потім перевіряється стан у відповідь. Пауза скрипта/затримка планувальника може збільшити реальний час.
if (Truth(await EnsureFlight(2000)))
{
UO.Print("Flight confirmed; ready for the next stage");
}
else
{
UO.Print("Flight not confirmed; route was not started");
}
async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
UO.ToggleFly();
var waited = 0;
while (Truth(waited < timeoutMs))
{
if (!(Truth(UO.Connected())))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
await Delay(50);
waited += 50;
}
return UO.Flying();
}
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;Параметри та порядок виконання:
- До 40 очікувань по 50 мс, лише один запит. Перевірка Connected не дає прийняти вимкнення за успішну посадку. Пауза скрипта може збільшити час.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.Connected()) && Truth(UO.Flying()))
{
UO.ToggleFly();
var checks = 0;
while (Truth(UO.Connected()) && Truth(UO.Flying()) && Truth(checks < 40))
{
await Delay(50);
checks += 1;
}
if (Truth(UO.Connected()) && !(Truth(UO.Flying())))
{
UO.Print("Landing state observed");
}
else
{
UO.Print("Landing not confirmed");
}
}
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;Параметри та порядок виконання:
- Призначте Main на клавішу одного запиту перемикання. Це не EnsureFlight: повторне натискання під час польоту запитує посадку. Повторні клавіші або два паралельні скрипти можуть надіслати кілька запитів; обмежувач тут не встановлюється.
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()
{
if (Truth(UO.Connected()) && !(Truth(UO.Dead())))
{
UO.ToggleFly();
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ToggleFly:bridge.ToggleFly().
Внутрішній код реалізації, не самостійний скрипт.
case "togglefly": bridge.ToggleFly(); return InjectionValue.Unit;ClassicUO — Bad Newbie & C# Scripts IDE