RU UO Topic menus context menus - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Старые меню, контекстные меню и ввод текста. Это отдельные механизмы; номер пункта берите из ответа нужного меню.
| Тема | Команды и пояснения |
|---|---|
| AutoMenu | UO.AutoMenu |
| WaitMenu | UO.WaitMenu |
| Menu Hooks | UO.MenuHookPresent · UO.CancelAllMenuHooks |
| Пункты меню | UO.GetMenuItems · UO.GetMenuItemsEx · UO.GetLastMenuItems |
| CancelMenu | UO.CancelMenu |
| Context Menu | UO.GetContextMenu · UO.ClearContextMenu |
| RequestContextMenu | UO.RequestContextMenu |
| Context Menu Hooks | UO.SetContextMenuHook |
UO.AutoMenu · UO.WaitMenu · UO.GetMenuItems · UO.GetMenuItemsEx · UO.GetLastMenuItems · UO.MenuHookPresent · UO.MenuPresent · UO.CancelAllMenuHooks · UO.CancelMenu · UO.CloseMenu · UO.WaitingForMenu · UO.WaitingMenu
UO.GetContextMenu · UO.RequestContextMenu · UO.SetContextMenuHook · UO.ClearContextMenu
UO.WaitTextEntry · UO.ConsoleEntryReply · UO.ConsoleEntryUnicodeReply
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.RequestContextMenu(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры, результат и все сценарии
UO.WaitMenu("Craft", "Tools");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.AutoMenu(object? prompt, object? choice);Регистрирует постоянный menu hook: при появлении серверного меню с подходящей подписью клиент выбирает подходящий пункт. Вызов не открывает меню и не ждёт его синхронно.
-
prompt— подстрока заголовка серверного меню. -
choice— подстрока подписи пункта меню.
void. Вызов только регистрирует hook и не сообщает, найдено ли меню или успешно ли выбран пункт.
- При каждом обновлении клиента hook ищет ещё не закрытое серверное меню, заголовок которого содержит
prompt. Если найден пункт, подпись которого содержитchoice, клиент выбирает его. Hook остаётся зарегистрированным после выбора, поэтому сработает и на последующих подходящих меню. Удалить hooks можно черезUO.CancelMenu().
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.AutoMenu");
UO.AutoMenu("Choose material", "Copper");Параметры и ход выполнения:
- Ожидать меню с заголовком "Choose material" и выбирать пункт с текстом "Copper".
UO.AutoMenu("Choose material", "Copper");2. Подстроки сравниваются без учёта регистра; hook действует и на последующие совпавшие меню. — функция сценария
Параметры и ход выполнения:
- Подстроки сравниваются без учёта регистра; hook действует и на последующие совпавшие меню.
return RunScenario();
object? RunScenario()
{
var menuCaption = "choose color";
var itemCaption = "blue";
UO.AutoMenu(menuCaption, itemCaption);
return null;
}3. Зарегистрировать hook на время этой задачи, затем удалить все hooks этого клиента. — класс сценария
Параметры и ход выполнения:
- Зарегистрировать hook на время этой задачи, затем удалить все hooks этого клиента.
- Другие действия скрипта могут выполняться до появления меню.
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.AutoMenu("Choose material", "Iron");
UO.CancelMenu();
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: prompt (Any), choice (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AddMenuHook:bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString().
Внутренний код реализации, не самостоятельный скрипт.
case "automenu":
if (arguments.Length >= 2) bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true);
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CancelAllMenuHooks();Удаляет все зарегистрированные автоматические hooks старых серверных меню клиента.
Параметров нет.
void — возвращаемого значения нет.
- Вызывает ClearMenuHooks менеджера. Удаляются однократные и постоянные правила выбора, включая AutoMenu и WaitMenu. Уже открытые меню эта команда не закрывает; для этого служит CloseMenu.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CancelAllMenuHooks");
UO.CancelAllMenuHooks();Параметры и ход выполнения:
- Удаление относится ко всему набору menu hooks клиента.
UO.CancelAllMenuHooks();Параметры и ход выполнения:
- Hook сразу удаляется; будущие совпавшие меню больше не выбираются автоматически.
return RunScenario();
object? RunScenario()
{
UO.AutoMenu("Choose material", "Iron");
UO.CancelAllMenuHooks();
return null;
}Параметры и ход выполнения:
- Первая команда удаляет hooks; вторая отдельно отменяет открытые старые меню.
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.CancelAllMenuHooks();
UO.CloseMenu();
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearMenuHooks:bridge.ClearMenuHooks().
Внутренний код реализации, не самостоятельный скрипт.
case "cancelallmenuhooks": bridge.ClearMenuHooks(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CancelMenu();Удаляет все зарегистрированные автоматические hooks старых серверных меню клиента.
Параметров нет.
void — возвращаемого значения нет.
- Вызывает ClearMenuHooks менеджера. Удаляются однократные и постоянные правила выбора, включая AutoMenu и WaitMenu. Уже открытые меню эта команда не закрывает; для этого служит CloseMenu.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CancelMenu");
UO.CancelMenu();Параметры и ход выполнения:
- Удаление относится ко всему набору menu hooks клиента.
UO.CancelMenu();Параметры и ход выполнения:
- Hook сразу удаляется; будущие совпавшие меню больше не выбираются автоматически.
return RunScenario();
object? RunScenario()
{
UO.AutoMenu("Choose material", "Iron");
UO.CancelMenu();
return null;
}Параметры и ход выполнения:
- Первая команда удаляет hooks; вторая отдельно отменяет открытые старые меню.
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.CancelMenu();
UO.CloseMenu();
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearMenuHooks:bridge.ClearMenuHooks().
Внутренний код реализации, не самостоятельный скрипт.
case "cancelmenu": bridge.ClearMenuHooks(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearContextMenu();Удаляет текущую локальную модель контекстного меню.
Параметров нет.
void — возвращаемого значения нет.
- Вызывает Dispose у ServerMenus.Context, если модель есть; новое серверное меню может появиться после следующего запроса. Это не CloseMenu.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ClearContextMenu");
UO.ClearContextMenu();Параметры и ход выполнения:
- Удаляет текущую локальную модель контекстного меню.
UO.ClearContextMenu();Параметры и ход выполнения:
- Снять локальное контекстное меню после чтения снимка.
return RunScenario();
object? RunScenario()
{
var entries = UO.GetContextMenu();
UO.ClearContextMenu();
return null;
}Параметры и ход выполнения:
- Очистка пустого набора допустима и не создаёт новую настройку.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.ClearContextMenu();
UO.ClearContextMenu();
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearContextMenu:bridge.ClearContextMenu().
Внутренний код реализации, не самостоятельный скрипт.
case "clearcontextmenu": bridge.ClearContextMenu(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CloseMenu();Отменяет все активные старые серверные меню через CancelForYoko.
Параметров нет.
void — возвращаемого значения нет.
- Перебирает снимок ServerMenus и отменяет каждую модель. Не удаляет автоматические menu hooks и не закрывает произвольные gump/interface окна.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CloseMenu");
UO.CloseMenu();Параметры и ход выполнения:
- Отмена относится к старым MenuGump/серверным меню.
UO.CloseMenu();Параметры и ход выполнения:
- Набор автоматического выбора и открытые меню обрабатываются отдельными командами.
return RunScenario();
object? RunScenario()
{
UO.CancelAllMenuHooks();
UO.CloseMenu();
return null;
}Параметры и ход выполнения:
- Снимок списка сохраняется в items даже после отмены меню.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetLastMenuItems();
UO.Print(Convert.ToString(ArrayLength(items)));
UO.CloseMenu();
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseMenu:bridge.CloseMenu().
Внутренний код реализации, не самостоятельный скрипт.
case "closemenu": bridge.CloseMenu(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ConsoleEntryReply(object? text);Отвечает текстом на активный серверный prompt через MessageManager.SendServerPromptResponse.
-
text— Значение, преобразуемое в строку. Пустая строка отправляется как пустой ответ.
void — возвращаемого значения нет.
- Обе команды направляются в ReplyServerPrompt. Тип пакета ASCII/Unicode выбирается по сохранённому состоянию server prompt; имя команды не принуждает отдельную кодировку. При отсутствии активного prompt менеджер не отправляет ответ.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ConsoleEntryReply");
UO.ConsoleEntryReply("reply");Параметры и ход выполнения:
- Отправка относится к текущему серверному запросу ввода.
UO.ConsoleEntryReply("reply");Параметры и ход выполнения:
- Пустой текст передаётся менеджеру как пустой ответ.
return RunScenario();
object? RunScenario()
{
UO.ConsoleEntryReply("");
return null;
}Параметры и ход выполнения:
- Имя переменной не влияет на выбранный формат server prompt.
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 reply = "New item name";
UO.ConsoleEntryReply(reply);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: text (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReplyServerPrompt:bridge.ReplyServerPrompt(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "consoleentryreply":
case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ConsoleEntryUnicodeReply(object? text);Отвечает текстом на активный серверный prompt через MessageManager.SendServerPromptResponse.
-
text— Значение, преобразуемое в строку. Пустая строка отправляется как пустой ответ.
void — возвращаемого значения нет.
- Обе команды направляются в ReplyServerPrompt. Тип пакета ASCII/Unicode выбирается по сохранённому состоянию server prompt; имя команды не принуждает отдельную кодировку. При отсутствии активного prompt менеджер не отправляет ответ.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ConsoleEntryUnicodeReply");
UO.ConsoleEntryUnicodeReply("reply");Параметры и ход выполнения:
- Отправка относится к текущему серверному запросу ввода.
UO.ConsoleEntryUnicodeReply("reply");Параметры и ход выполнения:
- Пустой текст передаётся менеджеру как пустой ответ.
return RunScenario();
object? RunScenario()
{
UO.ConsoleEntryUnicodeReply("");
return null;
}Параметры и ход выполнения:
- Имя переменной не влияет на выбранный формат server prompt.
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 reply = "New item name";
UO.ConsoleEntryUnicodeReply(reply);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: text (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReplyServerPrompt:bridge.ReplyServerPrompt(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "consoleentryreply":
case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetContextMenu();Читает строки пунктов текущей модели контекстного меню.
Параметров нет.
Array строк из ServerMenus.Context.GetYokoItems(); при отсутствии модели — пустой массив.
- Не отправляет RequestContextMenu и не ждёт серверный ответ. Чтобы получить новое меню, сначала отдельно запросите его и дождитесь появления модели. ClearContextMenu удаляет модель после чтения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetContextMenu();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читается уже имеющаяся модель.
var entries = UO.GetContextMenu();
for (int i = (int)(0); i <= ArrayLength(entries)-1; i += (int)(1))
{
UO.Print(entries[i]);
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметры и ход выполнения:
- 500 мс — пауза примера, не гарантия ответа сервера; пустой массив допустим.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.RequestContextMenu(UO.Self());
await Delay(500);
var entries = UO.GetContextMenu();
UO.Print(Convert.ToString(ArrayLength(entries)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Параметры и ход выполнения:
- Сохранённый массив не исчезает после очистки модели меню.
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 entries = UO.GetContextMenu();
UO.ClearContextMenu();
UO.Print(Convert.ToString(ArrayLength(entries)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetContextMenu()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetContextMenu:bridge.GetContextMenu().
Внутренний код реализации, не самостоятельный скрипт.
case "getcontextmenu": return StringArray(bridge.GetContextMenu());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLastMenuItems();Читает пункты уже открытого старого серверного меню.
Параметров нет.
Array строк. Строки имён/описаний пунктов GetYokoItems. Отсутствующее подходящее меню даёт пустой массив.
- Выбирается последнее меню снимка ServerMenus. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
- Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetLastMenuItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Пустой массив безопасно обрабатывается циклом.
var items = UO.GetLastMenuItems();
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
UO.Print(items[i]);
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметры и ход выполнения:
- Индекс 0 читается только после проверки размера.
return RunScenario();
object? RunScenario()
{
var items = UO.GetLastMenuItems();
if (Truth(ArrayLength(items) > 0))
{
UO.Print(items[0]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Массив остаётся доступен после отмены серверного меню.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetLastMenuItems();
UO.CloseMenu();
UO.Print(Convert.ToString(ArrayLength(items)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetLastMenuItems()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuItems:bridge.GetLastMenuItems().
Внутренний код реализации, не самостоятельный скрипт.
case "getlastmenuitems": return StringArray(bridge.GetLastMenuItems());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMenuItems(object? caption);Читает пункты уже открытого старого серверного меню.
-
caption— Подстрока заголовка старого серверного меню; поиск OrdinalIgnoreCase. Пустая строка соответствует любому заголовку.
Array строк. Строки имён/описаний пунктов GetYokoItems. Отсутствующее подходящее меню даёт пустой массив.
- Выбирается последнее не-Disposed меню с совпавшей подстрокой заголовка. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
- Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetMenuItems("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Пустой массив безопасно обрабатывается циклом.
var items = UO.GetMenuItems("");
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
UO.Print(items[i]);
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметры и ход выполнения:
- Индекс 0 читается только после проверки размера.
return RunScenario();
object? RunScenario()
{
var items = UO.GetMenuItems("");
if (Truth(ArrayLength(items) > 0))
{
UO.Print(items[0]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Массив остаётся доступен после отмены серверного меню.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetMenuItems("");
UO.CloseMenu();
UO.Print(Convert.ToString(ArrayLength(items)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: caption (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetMenuItems(Text(0), false)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMenuItems:bridge.GetMenuItems(Text(0), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getmenuitems": return StringArray(bridge.GetMenuItems(Text(0), false));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMenuItemsEx(object? caption);Читает пункты уже открытого старого серверного меню.
-
caption— Подстрока заголовка старого серверного меню; поиск OrdinalIgnoreCase. Пустая строка соответствует любому заголовку.
Array строк. Строки graphicHex|hueHex|index|name, например 0x0001|0x0000|1|choice. Отсутствующее подходящее меню даёт пустой массив.
- Выбирается последнее не-Disposed меню с совпавшей подстрокой заголовка. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
- Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetMenuItemsEx("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Пустой массив безопасно обрабатывается циклом.
var items = UO.GetMenuItemsEx("");
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
UO.Print(items[i]);
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметры и ход выполнения:
- Индекс 0 читается только после проверки размера.
return RunScenario();
object? RunScenario()
{
var items = UO.GetMenuItemsEx("");
if (Truth(ArrayLength(items) > 0))
{
UO.Print(items[0]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Массив остаётся доступен после отмены серверного меню.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetMenuItemsEx("");
UO.CloseMenu();
UO.Print(Convert.ToString(ArrayLength(items)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: caption (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetMenuItems(Text(0), true)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMenuItems:bridge.GetMenuItems(Text(0), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getmenuitemsex": return StringArray(bridge.GetMenuItems(Text(0), true));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.MenuHookPresent();Читает наличие зарегистрированных menu hooks.
Параметров нет.
Числовой флаг int: 1 — _manager.HasMenuHooks, 0 — hooks нет. Само меню может ещё отсутствовать.
- Читает наличие зарегистрированных menu hooks. Не ждёт меню, не проверяет наличие серверного gump и не расходует hook.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.MenuHookPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает наличие зарегистрированных menu hooks.
UO.Print(UO.MenuHookPresent());Параметры и ход выполнения:
- Читает наличие зарегистрированных menu hooks. Не ждёт меню, не проверяет наличие серверного gump и не расходует hook.
return RunScenario();
object? RunScenario()
{
UO.WaitMenu("Craft", "Tools");
UO.Print(UO.MenuHookPresent());
return null;
}Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.MenuHookPresent();
UO.Wait(500);
var after = UO.MenuHookPresent();
UO.Print(before);
UO.Print(after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MenuHookPresent:bridge.MenuHookPresent().
Внутренний код реализации, не самостоятельный скрипт.
case "menuhookpresent": return new InjectionValue(bridge.MenuHookPresent());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.MenuPresent();MenuPresent прямо вызывает WaitingMenu.
Параметров нет.
Числовой флаг int: 1 — есть server menu, 0 — нет.
- MenuPresent прямо вызывает WaitingMenu. Не проверяет GetGumpsCount, контекстные меню или зарегистрированные hooks.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.MenuPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- MenuPresent прямо вызывает WaitingMenu.
UO.Print(UO.MenuPresent());Параметры и ход выполнения:
- MenuPresent прямо вызывает WaitingMenu. Не проверяет GetGumpsCount, контекстные меню или зарегистрированные hooks.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.MenuPresent()))
{
UO.Print(UO.GetLastMenuItems());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.MenuPresent();
UO.Wait(500);
var after = UO.MenuPresent();
UO.Print(before);
UO.Print(after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MenuPresent:bridge.MenuPresent().
Внутренний код реализации, не самостоятельный скрипт.
case "menupresent": return new InjectionValue(bridge.MenuPresent());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RequestContextMenu(object? objID);Запрашивает контекстное меню объекта.
-
objID— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge вызывает GameActions.OpenPopupMenu. Ответ сохраняется отдельно и читается GetContextMenu; команда не выбирает строку меню.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.RequestContextMenu");
UO.RequestContextMenu(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Запрашивает контекстное меню объекта.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.RequestContextMenu(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Bridge вызывает GameActions.OpenPopupMenu. Ответ сохраняется отдельно и читается GetContextMenu; команда не выбирает строку меню.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.RequestContextMenu(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.RequestContextMenu(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.RequestContextMenu:bridge.RequestContextMenu(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "requestcontextmenu": bridge.RequestContextMenu(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetContextMenuHook(object? menuID, object? entryNumber);Регистрирует одноразовый выбор пункта контекстного меню.
-
menuID— Serial объекта меню, приводится к uint; 0 подходит любому serial. Это не server gump ID. -
entryNumber— Нулевой индекс пункта; отрицательное значение выключает ожидающий context hook. 0..GetArrayLength(UO.GetContextMenu())-1.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge передаёт данные _manager.SetContextMenuHook, где сохраняются _contextMenuSerial/_contextMenuEntry. Обработчик ProcessMenuHooks ждёт существующее подходящее context menu.
- Если SelectYokoItem успешен, поля очищаются до 0/-1. Меню не запрашивается этим setter: используйте RequestContextMenu отдельно. Сам вызов не блокирует и не подтверждает серверное действие.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetContextMenuHook");
UO.SetContextMenuHook(0, 0);Параметры и ход выполнения:
- Регистрирует одноразовый выбор пункта контекстного меню.
UO.SetContextMenuHook(0, 0);Параметры и ход выполнения:
- Bridge передаёт данные _manager.SetContextMenuHook, где сохраняются _contextMenuSerial/_contextMenuEntry. Обработчик ProcessMenuHooks ждёт существующее подходящее context menu.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
UO.SetContextMenuHook(UO.Hex2Int(id), 0);
UO.RequestContextMenu(id);
return null;
}Параметры и ход выполнения:
- Если SelectYokoItem успешен, поля очищаются до 0/-1. Меню не запрашивается этим setter: используйте RequestContextMenu отдельно. Сам вызов не блокирует и не подтверждает серверное действие.
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.SetContextMenuHook(0, -1);
UO.Print(UO.GetContextMenu());
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: menuID (Any), entryNumber (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetContextMenuHook:bridge.SetContextMenuHook(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "setcontextmenuhook": bridge.SetContextMenuHook(Arg(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.WaitMenu(object? menuCaption, object? elementCaption);
void UO.WaitMenu(object? prompt1, object? choice1, object? prompt2, object? choice2);
void UO.WaitMenu(object? prompt1, object? choice1, object? prompt2, object? choice2, object? prompt3, object? choice3);Регистрирует до трёх одноразовых menu hooks.
-
menuCaption / prompt1 / prompt2 / prompt3— Строка шаблона заголовка server menu. Пары передаются в порядке заголовок, элемент. -
menuCaption— Строка шаблона заголовка server menu. Пары передаются в порядке заголовок, элемент. -
prompt1— Строка шаблона заголовка server menu. Пары передаются в порядке заголовок, элемент. -
prompt2— Строка шаблона заголовка server menu. Пары передаются в порядке заголовок, элемент. -
prompt3— Строка шаблона заголовка server menu. Пары передаются в порядке заголовок, элемент. -
elementCaption / choice1 / choice2 / choice3— Строка выбора элемента для соответствующего заголовка. Не ID кнопки обычного gump. -
elementCaption— Строка выбора элемента для соответствующего заголовка. Не ID кнопки обычного gump. -
choice1— Строка выбора элемента для соответствующего заголовка. Не ID кнопки обычного gump. -
choice2— Строка выбора элемента для соответствующего заголовка. Не ID кнопки обычного gump. -
choice3— Строка выбора элемента для соответствующего заголовка. Не ID кнопки обычного gump.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Каждая пара передаётся _manager.AddMenuHook(prompt, choice, false). Зарегистрированные формы — 2/4/6 аргументов. false обозначает одноразовый hook; AutoMenu/двухаргументный VendorMenu используют постоянный hook.
- Не блокирует скрипт до появления меню. Hook расходуется менеджером при подходящем меню; результат выполнения сервером не возвращается. Для наличия меню используйте WaitingMenu, для hooks — MenuHookPresent.
- Для форм menu/choice менеджер выбирает первое меню, заголовок которого содержит prompt без учёта регистра; SessionMenu выбирает первый пункт, имя которого содержит choice так же без учёта регистра. Пустой текст подходит любому; числовой текст — фрагмент имени, не индекс. Успешный выбор отправляет ответ и закрывает локальное меню. Одноразовый hook удаляется только после успешного выбора, постоянный остаётся.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.WaitMenu");
UO.WaitMenu("Craft", "Tools");Параметры и ход выполнения:
- Регистрирует до трёх одноразовых menu hooks.
UO.WaitMenu("Craft", "Tools");Параметры и ход выполнения:
- Каждая пара передаётся _manager.AddMenuHook(prompt, choice, false). Зарегистрированные формы — 2/4/6 аргументов. false обозначает одноразовый hook; AutoMenu/двухаргументный VendorMenu используют постоянный hook.
return RunScenario();
object? RunScenario()
{
UO.WaitMenu("Craft", "Tools", "Tools", "Shovel");
return null;
}Параметры и ход выполнения:
- Не блокирует скрипт до появления меню. Hook расходуется менеджером при подходящем меню; результат выполнения сервером не возвращается. Для наличия меню используйте WaitingMenu, для hooks — MenuHookPresent.
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.WaitMenu("Craft", "Tools", "Tools", "Shovel", "Amount", "One");
UO.Print(UO.MenuHookPresent());
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: menuCaption (Any/String), elementCaption (Any/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitMenu:bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Внутренний код реализации, не самостоятельный скрипт.
case "waitmenu": bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()); return InjectionValue.Unit;Параметры: menuCaption (Any/String), elementCaption (Any/String)
Результат: void / Unit.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public void WaitMenu(string prompt, string choice)
=> bridge.WaitMenu(prompt, choice);Параметры: prompt1 (String), choice1 (String), prompt2 (String), choice2 (String)
Результат: void / Unit.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public void WaitMenu(string prompt1, string choice1, string prompt2, string choice2)
=> bridge.WaitMenu(prompt1, choice1, prompt2, choice2);
UO.WaitMenu(prompt1, choice1, prompt2, choice2, prompt3, choice3) — UO.WaitMenu(String,String,String,String,String,String)
Параметры: prompt1 (String), choice1 (String), prompt2 (String), choice2 (String), prompt3 (String), choice3 (String)
Результат: void / Unit.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public void WaitMenu(string prompt1, string choice1, string prompt2, string choice2, string prompt3, string choice3)
=> bridge.WaitMenu(prompt1, choice1, prompt2, choice2, prompt3, choice3);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.WaitTextEntry(object? value);Пытается записать текст в textentry текущего gump.
-
value— Текст через ToString; сохраняется как передан.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ExecuteClientApiCompatibility вызывает SetGumpValue(-1, "textentry", -1, Text(0)). key=-1 не является обычным нулевым индексом: запись возможна только если существующее поле сопоставляется с таким ID в реализации gump.
- Не ждёт будущий gump, не открывает prompt и не регистрирует hook. Если подходящего поля нет, SetGumpValue выводит сообщение. Для известного поля используйте SetGump с явным ID/индексом.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.WaitTextEntry");
UO.WaitTextEntry("Example");Параметры и ход выполнения:
- Пытается записать текст в textentry текущего gump.
UO.WaitTextEntry("Example");Параметры и ход выполнения:
- ExecuteClientApiCompatibility вызывает SetGumpValue(-1, "textentry", -1, Text(0)). key=-1 не является обычным нулевым индексом: запись возможна только если существующее поле сопоставляется с таким ID в реализации gump.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetGumpsCount() > 0))
{
UO.WaitTextEntry("Example");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Не ждёт будущий gump, не открывает prompt и не регистрирует hook. Если подходящего поля нет, SetGumpValue выводит сообщение. Для известного поля используйте SetGump с явным ID/индексом.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.WaitTextEntry("Example");
UO.Print("Check the target field in the current gump");
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetGumpValue:bridge.SetGumpValue(-1, "textentry", -1, Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "waittextentry": bridge.SetGumpValue(-1, "textentry", -1, Text(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WaitingForMenu(object? delay);
int UO.WaitingForMenu(object? delay, object? menuCount);
int UO.WaitingForMenu(object? delay, object? menuCount, object? blockMenu);
int UO.WaitingForMenu(object? delay, object? menuCount, object? blockMenu, object? menuName);
int UO.WaitingForMenu(object? delayValue, object? menuCountValue, object? blockMenuValue, object? menuNameValue, object? skillOrSerial);Ограниченно ждёт нужное количество появлений server menu.
-
delay— int timeout в миллисекундах, отрицательный становится 0. Даже при 0 выполняется одна проверка. -
delayValue— int timeout в миллисекундах, отрицательный становится 0. Даже при 0 выполняется одна проверка. -
menuCount— Необязательное число появлений, минимум 1; по умолчанию 1. Это не число пунктов меню. -
menuCountValue— Необязательное число появлений, минимум 1; по умолчанию 1. Это не число пунктов меню. -
blockMenu— Необязательное ненулевое число закрывает menu, когда условие достигнуто; 0 оставляет его. -
blockMenuValue— Необязательное ненулевое число закрывает menu, когда условие достигнуто; 0 оставляет его. -
menuName— Необязательный точный заголовок с учётом регистра; пустой допускает любой. -
menuNameValue— Необязательный точный заголовок с учётом регистра; пустой допускает любой. -
skillOrSerial— Необязательный последний аргумент: TriggerWaitAction может сначала использовать навык по имени либо объект по serial. По умолчанию 0 — без действия.
Числовой флаг int: 1 — замечены минимум menuCount разных появлений и последнее имеет нужный заголовок; 0 — timeout. Существующее меню может засчитываться сразу.
- После TriggerWaitAction читает GetLastMenuIdentity; новое identity увеличивает счётчик. Пустое identity сбрасывает память предыдущего, поэтому то же меню после закрытия/переоткрытия может засчитаться снова.
- Граница count проверяется только при новом identity. При совпадении и blockMenu закрывает menu. Между проверками UO.Wait до 25 ms; заголовок проверяется Ordinal, не substring.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.WaitingForMenu(3000);
UO.Print("WaitingForMenu: " + Convert.ToString(result));Параметры и ход выполнения:
- Ограниченно ждёт нужное количество появлений server menu.
UO.Print(UO.WaitingForMenu(3000));Параметры и ход выполнения:
- После TriggerWaitAction читает GetLastMenuIdentity; новое identity увеличивает счётчик. Пустое identity сбрасывает память предыдущего, поэтому то же меню после закрытия/переоткрытия может засчитаться снова.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.WaitingForMenu(3000, 1, 1, "Craft"));
return null;
}Параметры и ход выполнения:
- Граница count проверяется только при новом identity. При совпадении и blockMenu закрывает menu. Между проверками UO.Wait до 25 ms; заголовок проверяется Ordinal, не substring.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var found = UO.WaitingForMenu(3000, 1, 0, "Craft", "lasttarget");
if (Truth(found))
{
UO.Print(UO.GetLastMenuItems());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: delay (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero).
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingForMenu(InjectionValue delay) => WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);Параметры: delay (Any), menuCount (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero).
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount) => WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);Параметры: delay (Any), menuCount (Any), blockMenu (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero).
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu) => WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero);Параметры: delay (Any), menuCount (Any), blockMenu (Any), menuName (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, blockMenu, menuName, InjectionValue.Zero).
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu, InjectionValue menuName) => WaitingForMenu(delay, menuCount, blockMenu, menuName, InjectionValue.Zero);
UO.WaitingForMenu(delayValue, menuCountValue, blockMenuValue, menuNameValue, skillOrSerial) — UO.WaitingForMenu(Any,Any,Any,Any,Any)
Параметры: delayValue (Any), menuCountValue (Any), blockMenuValue (Any), menuNameValue (Any), skillOrSerial (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(delayValue). -
InjectionScript.Runtime.InjectionValue.ToString:menuNameValue.ToString(). -
InjectionScript.Runtime.InjectionApiUO.TriggerWaitAction:TriggerWaitAction(skillOrSerial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuIdentity:bridge.GetLastMenuIdentity(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuCaption:bridge.GetLastMenuCaption(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseMenu:bridge.CloseMenu(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Wait:bridge.Wait(Math.Min(25, Math.Max(1, delay))).
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingForMenu(InjectionValue delayValue, InjectionValue menuCountValue, InjectionValue blockMenuValue, InjectionValue menuNameValue, InjectionValue skillOrSerial)
{
int delay = Math.Max(0, NumberConversions.ToInt(delayValue));
int requiredMenuCount = Math.Max(1, NumberConversions.ToInt(menuCountValue));
bool blockMenu = NumberConversions.ToInt(blockMenuValue) != 0;
string expectedName = menuNameValue.ToString() ?? string.Empty;
DateTime deadline = timeSource.Now.AddMilliseconds(delay);
string previousIdentity = string.Empty;
int observedMenuCount = 0;
TriggerWaitAction(skillOrSerial);
do
{
string identity = bridge.GetLastMenuIdentity() ?? string.Empty;
if (identity.Length == 0)
{
// Reset between server menus so an identical menu opened again
// still counts as a new appearance.
previousIdentity = string.Empty;
}
else if (!identity.Equals(previousIdentity, StringComparison.Ordinal))
{
previousIdentity = identity;
observedMenuCount++;
string caption = bridge.GetLastMenuCaption() ?? string.Empty;
bool nameMatches = expectedName.Length == 0
|| caption.Equals(expectedName, StringComparison.Ordinal);
if (observedMenuCount >= requiredMenuCount && nameMatches)
{
if (blockMenu)
bridge.CloseMenu();
return 1;
}
}
if (timeSource.Now >= deadline)
break;
bridge.Wait(Math.Min(25, Math.Max(1, delay)));
}
while (true);
return 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WaitingMenu();Читает _world.ServerMenus.Snapshot().Length != 0.
Параметров нет.
Числовой флаг int: 1 — в ServerMenus есть хотя бы одно меню, 0 — нет. Это наличие меню, не ожидание скрипта.
- Читает _world.ServerMenus.Snapshot().Length != 0. Legacy server menus отделены от обычных серверных gumps и контекстного меню.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.WaitingMenu();
UO.Print("WaitingMenu: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает _world.ServerMenus.Snapshot().Length != 0.
UO.Print(UO.WaitingMenu());Параметры и ход выполнения:
- Читает _world.ServerMenus.Snapshot().Length != 0. Legacy server menus отделены от обычных серверных gumps и контекстного меню.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.WaitingMenu()))
{
UO.Print(UO.GetLastMenuItems());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WaitingMenu();
UO.Wait(500);
var after = UO.WaitingMenu();
UO.Print(before);
UO.Print(after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WaitingMenu. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitingMenu:bridge.WaitingMenu().
Внутренний код реализации, не самостоятельный скрипт.
public int WaitingMenu() => bridge.WaitingMenu();