Repository navigation
UO Topic trade
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Вікно обміну предметами між двома гравцями: інший учасник, контейнер обміну, стан підтвердження та скасування.
| Тема | Команди та пояснення |
|---|---|
| Перевірка відкритого обміну | UO.IsTrade |
| Інший учасник обміну | UO.GetTradeOpponent · UO.GetTradeOpponentName |
| Контейнер обміну | UO.GetTradeContainer |
| Підтвердження обміну | UO.ConfirmTrade |
| Скасування обміну | UO.CancelTrade |
UO.IsTrade · UO.TradeCount · UO.TradeCheck · UO.TradeContainer · UO.GetTradeContainer · UO.TradeOpponent · UO.GetTradeOpponent · UO.TradeName · UO.GetTradeOpponentName · UO.ConfirmTrade · UO.CancelTrade
Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.
Параметри, результат та всі сценарії
var value = UO.GetTradeContainer(1, 1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри, результат та всі сценарії
var result = UO.ConfirmTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.CancelTrade(object? tradeNum);Скасує обраний обмін і закриває вікно.
-
tradeNum— ціле число: поточний номер вікна від 1 до TradeCount(). 0 та негативні значення неприпустимі. Це не serial.
int: 1 (умова виконана) — вікно знайдено, закрито та запит скасування надіслано через закриття; 0 (умова не виконана) - вікна немає. Це не очікування серверної відповіді. Повторне скасування закритого вікна не надсилає другий пакет.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.CancelTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var result = UO.CancelTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
return RunScenario();
object? RunScenario()
{
var tradeNumber = 2;
if (Truth(UO.TradeCount() >= tradeNumber))
{
var result = UO.CancelTrade(tradeNumber);
UO.Print(Convert.ToString(result));
}
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. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var expectedPartner = UO.GetTradeOpponent(1);
var result = ApplyToPartner(1, expectedPartner);
UO.Print(Convert.ToString(result));
return null;
}
dynamic ApplyToPartner(dynamic tradeNumber, dynamic expectedPartner)
{
if (Truth(expectedPartner == 0))
{
return false;
}
if (Truth(UO.GetTradeOpponent(tradeNumber) != expectedPartner))
{
return false;
}
return UO.CancelTrade(tradeNumber);
}
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.
Параметри: tradeNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelTrade:bridge.CancelTrade(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "canceltrade": return new InjectionValue(bridge.CancelTrade(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConfirmTrade(object? tradeNum);Встановлює власний прапорець згоди у вибраному обміні.
-
tradeNum— ціле число: поточний номер вікна від 1 до TradeCount(). 0 та негативні значення неприпустимі. Це не serial.
int: 1 (умова виконана) - вікно знайдено і власну згоду включено (або вже було включено); 0 (умова не виконана) - вікна немає. Не підтверджує передачу предметів на сервер. Повторний виклик не знімає згоди.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.ConfirmTrade(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var result = UO.ConfirmTrade(1);
if (Truth(Truth(result) == true))
{
UO.Print("Local request processed");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
return RunScenario();
object? RunScenario()
{
var tradeNumber = 2;
if (Truth(UO.TradeCount() >= tradeNumber))
{
var result = UO.ConfirmTrade(tradeNumber);
UO.Print(Convert.ToString(result));
}
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. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var expectedPartner = UO.GetTradeOpponent(1);
var result = ApplyToPartner(1, expectedPartner);
UO.Print(Convert.ToString(result));
return null;
}
dynamic ApplyToPartner(dynamic tradeNumber, dynamic expectedPartner)
{
if (Truth(expectedPartner == 0))
{
return false;
}
if (Truth(UO.GetTradeOpponent(tradeNumber) != expectedPartner))
{
return false;
}
return UO.ConfirmTrade(tradeNumber);
}
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.
Параметри: tradeNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConfirmTrade:bridge.ConfirmTrade(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "confirmtrade": return new InjectionValue(bridge.ConfirmTrade(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTradeContainer(object? tradeNum, object? num);Повертає числовий serial одного з двох контейнерів обміну.
-
tradeNum— ціле число: поточний номер вікна від 1 до TradeCount(). 0 та негативні значення неприпустимі. Це не serial. -
num- 1 - свій контейнер, 2 - контейнер партнера. Інші значення повертають 0.
int: 32 біта serial контейнера; 0 за відсутності вікна або неправильному Num. Це не type. Старший біт зберігається: перевіряйте != 0, а не > 0 або == true.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetTradeContainer(1, 1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.GetTradeContainer(1, 1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var ours = UO.GetTradeContainer(1, 1);
var theirs = UO.GetTradeContainer(1, 2);
UO.Print(Hex(ours) + " / " + Hex(theirs));
return null;
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Hex(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return 0;
}
return UO.GetTradeContainer(index, 1);
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: tradeNum (Any), num (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeContainer:bridge.GetTradeContainer(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "gettradecontainer": return new InjectionValue(bridge.GetTradeContainer(Arg(0), Arg(1)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTradeOpponent(object? tradeNum);Повертає числовий serial персонажа-партнера.
-
tradeNum— ціле число: поточний номер вікна від 1 до TradeCount(). 0 та негативні значення неприпустимі. Це не serial.
int: serial персонажа з LocalSerial вікна; 0 за відсутності вікна. Чи не контейнер і не bool; перевіряйте != 0.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetTradeOpponent(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.GetTradeOpponent(1);
UO.Print(Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(1); index <= total - 0; index += (int)(1))
{
var value = UO.GetTradeOpponent(index);
UO.Print(Convert.ToString(index) + ": " + Hex(value));
}
return null;
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Hex(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return 0;
}
return UO.GetTradeOpponent(index);
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: tradeNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeOpponent:bridge.GetTradeOpponent(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "gettradeopponent": return new InjectionValue(bridge.GetTradeOpponent(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTradeOpponentName(object? tradeNum);Повертає ім'я партнера, отримане разом із вікном обміну.
-
tradeNum— ціле число: поточний номер вікна від 1 до TradeCount(). 0 та негативні значення неприпустимі. Це не serial.
string: ім'я пакета відкриття обміну; порожній рядок за відсутності вікна чи імені. Чи не запитує ім'я заново.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetTradeOpponentName(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.GetTradeOpponentName(1);
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(1); index <= total - 0; index += (int)(1))
{
var value = UO.GetTradeOpponentName(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(1);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 1) || Truth(index >= total + 1))
{
return "";
}
return UO.GetTradeOpponentName(index);
}
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.
Параметри: tradeNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTradeOpponentName:bridge.GetTradeOpponentName(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "gettradeopponentname": return new InjectionValue(bridge.GetTradeOpponentName(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsTrade();Перевіряє наявність відкритого вікна безпечного обміну.
Параметрів немає.
int: 1 (умова виконана) - є відкритий обмін; 0 (умова не виконана) - ні.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.IsTrade();
UO.Print("IsTrade: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.IsTrade();
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- before/after — два окремі знімки з інтервалом 500 мілісекунд. Пауза не чекає на конкретний обмін; між читаннями стан може змінитися кілька разів.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.IsTrade();
await Delay(500);
var after = UO.IsTrade();
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeState();
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeState()
{
return UO.IsTrade();
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTrade:bridge.IsTrade().
Внутрішній код реалізації, не самостійний скрипт.
case "istrade": return new InjectionValue(bridge.IsTrade());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TradeCheck(object? windowIndex);
dynamic UO.TradeCheck(object? tradeNum, object? num);
int UO.TradeCheck(object? windowIndex, object? checkbox, object? stateValue);Читає прапорці згоди; Трипараметрова форма також змінює власний прапорець.
-
windowIndex— Ціле число: поточний індекс вікна від 0 до TradeCount()-1. Негативний чи відсутній індекс дає порожній результат. Це не serial. -
tradeNum— Ціле число: поточний індекс вікна від 0 до TradeCount()-1. Негативний чи відсутній індекс дає порожній результат. Це не serial. -
num- Тільки двопараметрова форма: 1 - свій прапорець, 2 - прапорець партнера; інші значення дають 0. TradeNum тут починається з 0. -
checkbox— Лише трипараметрова форма: 0 — свій прапорець, 1 — партнера. Чужий прапор лише читається; інше значення дає 0. -
stateValue— Тільки при checkbox=0: 0/false знімає згоду, будь-яке ненульове число/true включає. При checkbox=1 значення ігнорується.
int: 1 (умова виконана) — вибраний прапорець встановлений; 0 (умова не виконано) - знято, вікно відсутня або сторона неправильна. У формі запису повертається стан, а чи не ознака успішної угоди: зняття прапорця повертає 0.
Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TradeCheck(0);
UO.Print("TradeCheck: " + Convert.ToString(result));Параметри та порядок виконання:
- UO.TradeCheck(0) та UO.TradeCheck(0,1) читають свою згоду першого вікна; UO.TradeCheck(0,2) - чуже. Тут немає запису та немає автоматичного підтвердження.
var own = UO.TradeCheck(0);
var sameOwn = UO.TradeCheck(0, 1);
var other = UO.TradeCheck(0, 2);
UO.Print(Convert.ToString(own) + "/" + Convert.ToString(sameOwn) + "/" + Convert.ToString(other));Параметри та порядок виконання:
- UO.TradeCheck(0,0,false) знімає свою згоду. UO.TradeCheck(0,1,false) тільки читає згоду партнера: false не може змінити чужу сторону. Результат 0 після зняття очікуємо.
return RunScenario();
object? RunScenario()
{
var cleared = UO.TradeCheck(0, 0, false);
var other = UO.TradeCheck(0, 1, false);
UO.Print(Convert.ToString(cleared) + "/" + Convert.ToString(other));
return null;
}Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var accepted = BothAccepted(0);
if (Truth(Truth(accepted) == true))
{
UO.Print("Both boxes are checked; server completion is not known");
}
return null;
}
dynamic BothAccepted(dynamic index)
{
if (Truth(index < 0) || Truth(index >= UO.TradeCount()))
{
return false;
}
var own = UO.TradeCheck(index, 1);
var other = UO.TradeCheck(index, 2);
return Truth(Truth(own) == true) && Truth(Truth(other) == true);
}
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.
Параметри: windowIndex (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeCheck. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(NumberConversions.ToInt(windowIndex), 0, 0, false). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
Внутрішній код реалізації, не самостійний скрипт.
public int TradeCheck(InjectionValue windowIndex)
=> bridge.TradeCheck(NumberConversions.ToInt(windowIndex), 0, 0, false);Параметри: tradeNum (Any), num (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(Arg(0), tradeSide - 1, 0, false).
Внутрішній код реалізації, не самостійний скрипт.
case "tradecheck":
// The compatibility reader uses participants 1/2; the legacy
// one/three-argument forms use checkbox indices 0/1.
int tradeSide = Arg(1);
return new InjectionValue(tradeSide is 1 or 2
? bridge.TradeCheck(Arg(0), tradeSide - 1, 0, false) : 0);Параметри: windowIndex (Any), checkbox (Any), stateValue (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeCheck. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCheck:bridge.TradeCheck(NumberConversions.ToInt(windowIndex), NumberConversions.ToInt(checkbox), NumberConversions.ToInt(stateValue), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
Внутрішній код реалізації, не самостійний скрипт.
public int TradeCheck(InjectionValue windowIndex, InjectionValue checkbox, InjectionValue stateValue)
=> bridge.TradeCheck(NumberConversions.ToInt(windowIndex), NumberConversions.ToInt(checkbox), NumberConversions.ToInt(stateValue), true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.TradeContainer(object? windowIndex);Повертає serial свого контейнера обміну як hex-рядок.
-
windowIndex— Ціле число: поточний індекс вікна від 0 до TradeCount()-1. Негативний чи відсутній індекс дає порожній результат. Це не serial.
string: hex виду "0x40000011"; "0x00000000" за відсутності вікна. Це ID свого контейнера, не bool і не пустий рядок.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TradeContainer(0);
UO.Print("TradeContainer: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.TradeContainer(0);
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeContainer(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "0x00000000";
}
return UO.TradeContainer(index);
}
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.
Параметри: windowIndex (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeContainer. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(bridge.TradeContainer(NumberConversions.ToInt(windowIndex))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeContainer:bridge.TradeContainer(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
Внутрішній код реалізації, не самостійний скрипт.
public string TradeContainer(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeContainer(NumberConversions.ToInt(windowIndex)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TradeCount();Повертає кількість відкритих вікон обміну.
Параметрів немає.
int: кількість вікон від 0. Ця кількість, а не bool; використовуйте > 0 для перевірки наявності.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TradeCount();
UO.Print("TradeCount: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.TradeCount();
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- before/after — два окремі знімки з інтервалом 500 мілісекунд. Пауза не чекає на конкретний обмін; між читаннями стан може змінитися кілька разів.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.TradeCount();
await Delay(500);
var after = UO.TradeCount();
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeState();
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeState()
{
return UO.TradeCount();
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeCount. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeCount:bridge.TradeCount().
Внутрішній код реалізації, не самостійний скрипт.
public int TradeCount() => bridge.TradeCount();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.TradeName(object? windowIndex);Повертає ім'я партнера із вікна обміну за індексом від нуля.
-
windowIndex— Ціле число: поточний індекс вікна від 0 до TradeCount()-1. Негативний чи відсутній індекс дає порожній результат. Це не serial.
string: збережене ім'я партнера; порожній рядок за відсутності вікна/імені. Назва предмета-контейнера не використовується.
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TradeName(0);
UO.Print("TradeName: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.TradeName(0);
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeName(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "";
}
return UO.TradeName(index);
}
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.
Параметри: windowIndex (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeName:bridge.TradeName(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
Внутрішній код реалізації, не самостійний скрипт.
public string TradeName(InjectionValue windowIndex) => bridge.TradeName(NumberConversions.ToInt(windowIndex));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.TradeOpponent(object? windowIndex);Повертає serial контейнер партнера як hex-рядок; це не ID персонажа.
-
windowIndex— Ціле число: поточний індекс вікна від 0 до TradeCount()-1. Негативний чи відсутній індекс дає порожній результат. Це не serial.
string: hex serial чужого контейнера ID2; "0x00000000" за відсутності вікна. Для ID персонажа використовуйте GetTradeOpponent(index + 1).
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумерують вікна з 1; TradeContainer/TradeOpponent/TradeName і всі форми TradeCheck — з 0. Це очевидна сумісність даного клієнта: зовнішні довідники різних двигунів застосовують різні початку відліку.
- Читання виконується на ігровому потоці живими вікнами поточного світу. Закриті вікна не рахуються. Виклики читання не надсилають пакетів і не чекають на відповідь. Порядок UI може змінюватися під час відкриття, закриття та перенесення вікна нагору; номер не є незмінним ідентифікатором.
- ConfirmTrade та запис свого TradeCheck відправляють пакет тільки при зміні згоди. Чужу згоду ставить сервер. CancelTrade відправляє скасування один раз. 1/true — локальний стан/обробка, а не гарантія завершення обміну. Імена та обидві згоди не доводять, що склад предметів не змінився.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.TradeOpponent(0);
UO.Print("TradeOpponent: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик зроблено один раз, результат збережено у value/result. 0 – перший індекс, 1 – перший номер (див. синтаксис цієї команди). HEX показує числовий serial; Convert.ToString — число чи рядок.
var value = UO.TradeOpponent(0);
UO.Print(Convert.ToString(value));Параметри та порядок виконання:
- total - знімок числа вікон; index – поточний індекс/номер. Приклад перебору нічого не підтверджує. У GetTradeContainer два виклики читають свій контейнер (1) та чужий (2) першого вікна (1).
return RunScenario();
object? RunScenario()
{
var total = UO.TradeCount();
for (int index = (int)(0); index <= total - 1; index += (int)(1))
{
var value = UO.TradeOpponent(index);
UO.Print(Convert.ToString(index) + ": " + Convert.ToString(value));
}
return null;
}Параметри та порядок виконання:
- Помічник наведений повністю і дійсно викликається з Main. Перевірки діапазону/ID знижують ризик помилки, але кілька викликів не атомарні: вікно може змінитися між ними. Для дії expectedPartner - збережений serial персонажа; це не є перевіркою ціни або вмісту обміну.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var value = ReadTradeValue(0);
UO.Print(Convert.ToString(value));
return null;
}
dynamic ReadTradeValue(dynamic index)
{
var total = UO.TradeCount();
if (Truth(index < 0) || Truth(index >= total + 0))
{
return "0x00000000";
}
return UO.TradeOpponent(index);
}
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.
Параметри: windowIndex (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.TradeOpponent. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(bridge.TradeOpponent(NumberConversions.ToInt(windowIndex))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TradeOpponent:bridge.TradeOpponent(NumberConversions.ToInt(windowIndex)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(windowIndex).
Внутрішній код реалізації, не самостійний скрипт.
public string TradeOpponent(InjectionValue windowIndex) => NumberConversions.ToHex(bridge.TradeOpponent(NumberConversions.ToInt(windowIndex)));ClassicUO — Bad Newbie & C# Scripts IDE