Repository navigation
UO Topic character Part 5
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Undress();Знімає одяг та обладунки з шарів 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Руки, волосся, бороду, рюкзак, верхова тварина та банк не торкається.
Параметрів немає.
Числовий прапор int: 1 (умова виконана) - локальна операція прийнята, 0 (умова не виконано) - відмова. Це не підтвердження сервера, не ID і не кількість. Сервер може відмовити пізніше; перевіряйте фактичне екіпірування після відповіді.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Потрібні завантажені предмети та вільна рука перетягування. При знятті потрібен справжній наплічник self: запасний GrabBag не використовується. Невідомі, знищені та невідповідні речі дають відмову. Чужі предмети не можна зняти через UnequipItems. Набір не є атомарною транзакцією.
- EquipItems/UnequipItems застосовують DressSpeed після прийнятої операції перед наступним елементом; Disarm/Undress – після кожного зайнятого шару. Зняття додатково дотримується DropDelay при прийнятому перенесенні. Однойменні налаштування інших runtime не змінюються; прискорення не скасовує обмеження сервера.
- Невірна форма виклику, невідоме ім'я шару або значення, що не переводиться в число, можуть викликати помилку скрипту замість 0. Знімок екіпірування містить лише завантажені дані. У помічнику ChangeAndConfirm layer=1 — права рука: для іншої речі передайте її реальний шар.
- Для масиву 1 означає, що прийнято всі перелічені операції; при будь-якій відмові повертається 0. Інші елементи все одно обробляються, відкату немає. Порожній масив дає 1 без дій. Disarm/Undress дають 1 також при вже порожніх потрібних шарах; часткова відмова дає 0.
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Undress();
UO.Print("Undress: " + Convert.ToString(result));Параметри та порядок виконання:
- Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
return UO.Undress();Параметри та порядок виконання:
- Для надягання 0x0F5E — приклад меча, 0x1B76 — приклад щита. FindType шукає їх серед завантажених речей рюкзака, ASC перетворює повернутий hex-ID. Для зняття читаються власні поточні верстви. Якщо потрібної речі нема, сценарій завершується. Масив зберігає два ID; кожен предмет переноситься цілком.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(5, UO.Self());
var second = UO.ObjAtLayerEx(4, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
return UO.Undress();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ChangeAndConfirm виконує команду один раз. Потім до ?20? раз перевіряє фактичний стан з паузою ?100? мс. 1 — перевірка побачила очікуваний стан, 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()
{
return ChangeAndConfirm();
return null;
}
dynamic ChangeAndConfirm()
{
if (!(Truth(UO.Undress())))
{
return 0;
}
dynamic[] layers = new dynamic[checked((int)(16) + 1)];
layers[0] = 3;
layers[1] = 4;
layers[2] = 5;
layers[3] = 6;
layers[4] = 7;
layers[5] = 8;
layers[6] = 10;
layers[7] = 12;
layers[8] = 13;
layers[9] = 14;
layers[10] = 17;
layers[11] = 18;
layers[12] = 19;
layers[13] = 20;
layers[14] = 22;
layers[15] = 23;
layers[16] = 24;
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
dynamic empty = true;
for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
{
empty = false;
}
}
if (Truth(empty))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
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.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Undress. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(dressLayers, "Clothing removed.").
Внутрішній код реалізації, не самостійний скрипт.
public int Undress()
=> Unequip(dressLayers, "Clothing removed.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Unequip(object? layer);Знімає свою річ із вказаного шару у власний рюкзак.
-
layer— Номер шару, наприклад 1 — права рука, 2 — ліва. Equip та Unequip також приймають ім'я шару, наприклад "Rhand". WearItem використовує числовий шар. Шар повинен збігатися з wearable шаром предмета; це не graphic і не ID.
Числовий прапор int: 1 (умова виконана) - локальна операція прийнята, 0 (умова не виконано) - відмова. Це не підтвердження сервера, не ID і не кількість. Сервер може відмовити пізніше; перевіряйте фактичне екіпірування після відповіді.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Потрібні завантажені предмети та вільна рука перетягування. При знятті потрібен справжній наплічник self: запасний GrabBag не використовується. Невідомі, знищені та невідповідні речі дають відмову. Чужі предмети не можна зняти через UnequipItems. Набір не є атомарною транзакцією.
- EquipItems/UnequipItems застосовують DressSpeed після прийнятої операції перед наступним елементом; Disarm/Undress – після кожного зайнятого шару. Зняття додатково дотримується DropDelay при прийнятому перенесенні. Однойменні налаштування інших runtime не змінюються; прискорення не скасовує обмеження сервера.
- Невірна форма виклику, невідоме ім'я шару або значення, що не переводиться в число, можуть викликати помилку скрипту замість 0. Знімок екіпірування містить лише завантажені дані. У помічнику ChangeAndConfirm layer=1 — права рука: для іншої речі передайте її реальний шар.
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Unequip(1);
UO.Print("Unequip: " + Convert.ToString(result));Параметри та порядок виконання:
- Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
return UO.Unequip(1);Параметри та порядок виконання:
- Для надягання 0x0F5E — приклад меча, 0x1B76 — приклад щита. FindType шукає їх серед завантажених речей рюкзака, ASC перетворює повернутий hex-ID. Для зняття читаються власні поточні верстви. Якщо потрібної речі нема, сценарій завершується. Масив зберігає два ID; кожен предмет переноситься цілком.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.Unequip(1);
var secondOk = UO.Unequip(2);
return firstOk != 0 && secondOk != 0;
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ChangeAndConfirm виконує команду один раз. Потім до ?20? раз перевіряє фактичний стан з паузою ?100? мс. 1 — перевірка побачила очікуваний стан, 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 item = UO.ObjAtLayerEx(1, UO.Self());
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.Unequip(layer))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 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.
Параметри: layer (Any/String)
Результат: int / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "unequip":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Unequip(Text(0)) : bridge.Unequip(Arg(0)));Параметри: layer (Any/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Unequip. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
Внутрішній код реалізації, не самостійний скрипт.
public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.UnequipItems(object? items);Знімає перелічені власні одягнені речі у рюкзак. ID чужої речі не знімає вашу річ з того ж шару.
-
items— Обов'язковий ID або масив ID предметів. Елементи масиву - числа або числові hex-рядки. Поодинокий аргумент також приймає "lasttarget"/ім'я AddObject. Для масиву використовуйте оголошення змінної items[1] для двох елементів з індексами 0 та 1. Передаються речі, а не номери шарів і не type.
Числовий прапор int: 1 (умова виконана) - локальна операція прийнята, 0 (умова не виконано) - відмова. Це не підтвердження сервера, не ID і не кількість. Сервер може відмовити пізніше; перевіряйте фактичне екіпірування після відповіді.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Потрібні завантажені предмети та вільна рука перетягування. При знятті потрібен справжній наплічник self: запасний GrabBag не використовується. Невідомі, знищені та невідповідні речі дають відмову. Чужі предмети не можна зняти через UnequipItems. Набір не є атомарною транзакцією.
- EquipItems/UnequipItems застосовують DressSpeed після прийнятої операції перед наступним елементом; Disarm/Undress – після кожного зайнятого шару. Зняття додатково дотримується DropDelay при прийнятому перенесенні. Однойменні налаштування інших runtime не змінюються; прискорення не скасовує обмеження сервера.
- Невірна форма виклику, невідоме ім'я шару або значення, що не переводиться в число, можуть викликати помилку скрипту замість 0. Знімок екіпірування містить лише завантажені дані. У помічнику ChangeAndConfirm layer=1 — права рука: для іншої речі передайте її реальний шар.
- Для масиву 1 означає, що прийнято всі перелічені операції; при будь-якій відмові повертається 0. Інші елементи все одно обробляються, відкату немає. Порожній масив дає 1 без дій. Disarm/Undress дають 1 також при вже порожніх потрібних шарах; часткова відмова дає 0.
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.UnequipItems(UO.ObjAtLayerEx(1, "self"));
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.UnequipItems(item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Для надягання 0x0F5E — приклад меча, 0x1B76 — приклад щита. FindType шукає їх серед завантажених речей рюкзака, ASC перетворює повернутий hex-ID. Для зняття читаються власні поточні верстви. Якщо потрібної речі нема, сценарій завершується. Масив зберігає два ID; кожен предмет переноситься цілком.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
dynamic[] items = new dynamic[checked((int)(1) + 1)];
items[0] = first;
items[1] = second;
return UO.UnequipItems(items);
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ChangeAndConfirm виконує команду один раз. Потім до ?20? раз перевіряє фактичний стан з паузою ?100? мс. 1 — перевірка побачила очікуваний стан, 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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.UnequipItems(item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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.
Параметри: items (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ChangeEquipmentItems:ChangeEquipmentItems(ArrayArg(0), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "unequipitems":
return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), false));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UnsetArm(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. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
- Видалення стосується лише запису вибраного імені. Речі залишаються на персонажі, інші імена та інший вид наборів не торкаються. Повторне видалення відсутнього запису допустиме. У UnsetDress та UnsetArm ім'я обов'язкове.
- 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.UnsetArm");
UO.UnsetArm("battle");Параметри та порядок виконання:
- Видаляється лише вказаний запис. Одяг/зброя не знімається.
UO.UnsetArm("battle");Параметри та порядок виконання:
- Імена travel та battle видаляються окремо. Одинакове ім'я іншого типу набору зберігається.
return RunScenario();
object? RunScenario()
{
UO.UnsetArm("travel");
UO.UnsetArm("battle");
return null;
}Параметри та порядок виконання:
- CleanupSets — повністю оголошена процедура прибирання двох власних імен. prefix формує імена записів, не файлові шляхи.
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetArm(prefix + "travel");
UO.UnsetArm(prefix + "battle");
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: name (String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.UnsetArm. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:armSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Arm set removed.").
Внутрішній код реалізації, не самостійний скрипт.
public void UnsetArm(string name)
{
armSets.Remove(name);
SystemMessage("Arm set removed.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UnsetDress(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. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
- Видалення стосується лише запису вибраного імені. Речі залишаються на персонажі, інші імена та інший вид наборів не торкаються. Повторне видалення відсутнього запису допустиме. У UnsetDress та UnsetArm ім'я обов'язкове.
- 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.UnsetDress");
UO.UnsetDress("travel");Параметри та порядок виконання:
- Видаляється лише вказаний запис. Одяг/зброя не знімається.
UO.UnsetDress("travel");Параметри та порядок виконання:
- Імена travel та battle видаляються окремо. Одинакове ім'я іншого типу набору зберігається.
return RunScenario();
object? RunScenario()
{
UO.UnsetDress("travel");
UO.UnsetDress("battle");
return null;
}Параметри та порядок виконання:
- CleanupSets — повністю оголошена процедура прибирання двох власних імен. prefix формує імена записів, не файлові шляхи.
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetDress(prefix + "travel");
UO.UnsetDress(prefix + "battle");
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: name (String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.UnsetDress. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:dressSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Dress set removed.").
Внутрішній код реалізації, не самостійний скрипт.
public void UnsetDress(string name)
{
dressSets.Remove(name);
SystemMessage("Dress set removed.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseOtherPaperdollScroll(object? objID);Використовує вказаний serial через bridge.UseObject, зазвичай відкриваючи paperdoll персонажа.
-
objID— Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ObjID відноситься до персонажа, не до ID кнопки прокручування. Виклик не читає структуру paperdoll і не чекає її відкриття.
- Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));Параметри та порядок виконання:
- Використовує вказаний serial через bridge.UseObject, зазвичай відкриваючи paperdoll персонажа.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ObjID відноситься до персонажа, не до ID кнопки прокручування. Виклик не читає структуру paperdoll і не чекає її відкриття.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(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.UseOtherPaperdollScroll(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.UseObject:bridge.UseObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSelfPaperdollScroll();Використовує поточний персонаж, зазвичай відкриваючи paperdoll.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ExecuteClientApiCompatibility викликає bridge.UseObject(bridge.Self). Немає окремого читання чи натискання елемента paperdoll; це звичайний запит UseObject для self.
- У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.UseSelfPaperdollScroll");
UO.UseSelfPaperdollScroll();Параметри та порядок виконання:
- Використовує поточний персонаж, зазвичай відкриваючи paperdoll.
UO.UseSelfPaperdollScroll();Параметри та порядок виконання:
- ExecuteClientApiCompatibility викликає bridge.UseObject(bridge.Self). Немає окремого читання чи натискання елемента paperdoll; це звичайний запит UseObject для self.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Self() != 0))
{
UO.UseSelfPaperdollScroll();
}
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 задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.UseSelfPaperdollScroll();
UO.Wait(500);
UO.Print(UO.Name());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WearItem(object? layer, object? objID);Вдягає обраний предмет на числовий шар свого персонажа.
-
layer— Номер шару, наприклад 1 — права рука, 2 — ліва. Equip та Unequip також приймають ім'я шару, наприклад "Rhand". WearItem використовує числовий шар. Шар повинен збігатися з wearable шаром предмета; це не graphic і не ID. -
objID— ID конкретної завантаженої речі: ціле число, hex-рядок, "lasttarget" або ім'я AddObject. Це не type. Приклад з 0x0F5E спочатку шукає меч цього graphic і отримує його ID.
Числовий прапор int: 1 (умова виконана) - локальна операція прийнята, 0 (умова не виконано) - відмова. Це не підтвердження сервера, не ID і не кількість. Сервер може відмовити пізніше; перевіряйте фактичне екіпірування після відповіді.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- Потрібні завантажені предмети та вільна рука перетягування. При знятті потрібен справжній наплічник self: запасний GrabBag не використовується. Невідомі, знищені та невідповідні речі дають відмову. Чужі предмети не можна зняти через UnequipItems. Набір не є атомарною транзакцією.
- EquipItems/UnequipItems застосовують DressSpeed після прийнятої операції перед наступним елементом; Disarm/Undress – після кожного зайнятого шару. Зняття додатково дотримується DropDelay при прийнятому перенесенні. Однойменні налаштування інших runtime не змінюються; прискорення не скасовує обмеження сервера.
- Невірна форма виклику, невідоме ім'я шару або значення, що не переводиться в число, можуть викликати помилку скрипту замість 0. Знімок екіпірування містить лише завантажені дані. У помічнику ChangeAndConfirm layer=1 — права рука: для іншої речі передайте її реальний шар.
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
int item = UO.LastTarget();
if (item != 0)
UO.Print("Accepted flag: " + Convert.ToString(UO.WearItem(1, item)));Параметри та порядок виконання:
- Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.WearItem(1, item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Для надягання 0x0F5E — приклад меча, 0x1B76 — приклад щита. FindType шукає їх серед завантажених речей рюкзака, ASC перетворює повернутий hex-ID. Для зняття читаються власні поточні верстви. Якщо потрібної речі нема, сценарій завершується. Масив зберігає два ID; кожен предмет переноситься цілком.
return RunScenario();
object? RunScenario()
{
var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.WearItem(1, first);
var secondOk = UO.WearItem(2, second);
return firstOk != 0 && secondOk != 0;
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ChangeAndConfirm виконує команду один раз. Потім до ?20? раз перевіряє фактичний стан з паузою ?100? мс. 1 — перевірка побачила очікуваний стан, 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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (!(Truth(UO.WearItem(layer, item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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.
Параметри: layer (Any), objID (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Weight();Читає лічильник статусу свого персонажа: поточна вага у stones.
Параметрів немає.
int — поточна вага в stones, 0..65535 у моделі клієнта. 0 може бути реальним значенням, відсутністю даних або відсутнім/знищеним Player. Ця кількість не bool, ID або type: 1 означає одну одиницю, а не успіх. Команда не перебирає об'єкти та не повертає масив.
- Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
- Читання в ігровому потоці бере Player. Weight, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
- Weight читає загальну вагу, повідомлену сервером, у stones. Які ваги тіла, екіпірування та вкладених сумок входять до суми, визначають правила шарду. Команда не оминає контейнери, не підсумовує ваги предметів та не оновлює закриті сумки. Це не властивість Weight окремого предмету та не число items.
- 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.Weight();
UO.Print("Weight: " + Convert.ToString(result));Параметри та порядок виконання:
- value зберігає один виклик без аргументів для свого персонажа; Convert.ToString форматує число для журналу, не змінюючи його значення.
var value = UO.Weight();
UO.Print("Weight: " + Convert.ToString(value));Параметри та порядок виконання:
- UO.Wait(500) поділяє before та after на 500 мілісекунд. difference може бути позитивною, нульовою або негативною; проміжні оновлення та зміна персонажа можуть бути пропущені. Пауза належить наприклад.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Weight();
await Delay(500);
var after = UO.Weight();
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Weight:bridge.Weight.
Внутрішній код реалізації, не самостійний скрипт.
case "weight": return new InjectionValue(bridge.Weight);ClassicUO — Bad Newbie & C# Scripts IDE