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

Примеры по теме

В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.

UO.RequestContextMenu

Параметры, результат и все сценарии

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

Параметры, результат и все сценарии

UO.WaitMenu("Craft", "Tools");

Полное описание команд


UO.AutoMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.AutoMenu(object? prompt, object? choice);

Регистрирует постоянный menu hook: при появлении серверного меню с подходящей подписью клиент выбирает подходящий пункт. Вызов не открывает меню и не ждёт его синхронно.

Параметры

  • prompt — подстрока заголовка серверного меню.
  • choice — подстрока подписи пункта меню.

Возвращает

void. Вызов только регистрирует hook и не сообщает, найдено ли меню или успешно ли выбран пункт.

Поведение

  • При каждом обновлении клиента hook ищет ещё не закрытое серверное меню, заголовок которого содержит prompt. Если найден пункт, подпись которого содержит choice, клиент выбирает его. Hook остаётся зарегистрированным после выбора, поэтому сработает и на последующих подходящих меню. Удалить hooks можно через UO.CancelMenu().

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.AutoMenu");
UO.AutoMenu("Choose material", "Copper");

1. Ожидать меню с заголовком "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.

UO.AutoMenu(prompt, choice) — UO.AutoMenu(Any,Any)

Параметры: prompt (Any), choice (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "automenu":

                    if (arguments.Length >= 2) bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true);

                    break;

UO.CancelAllMenuHooks

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.CancelAllMenuHooks();

Удаляет все зарегистрированные автоматические hooks старых серверных меню клиента.

Параметры

Параметров нет.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Вызывает ClearMenuHooks менеджера. Удаляются однократные и постоянные правила выбора, включая AutoMenu и WaitMenu. Уже открытые меню эта команда не закрывает; для этого служит CloseMenu.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.CancelAllMenuHooks");
UO.CancelAllMenuHooks();

1. Снять все hooks — прямой скрипт

Параметры и ход выполнения:

  • Удаление относится ко всему набору menu hooks клиента.
UO.CancelAllMenuHooks();

2. Ограничить действие AutoMenu — функция сценария

Параметры и ход выполнения:

  • Hook сразу удаляется; будущие совпавшие меню больше не выбираются автоматически.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoMenu("Choose material", "Iron");
    UO.CancelAllMenuHooks();
    return null;
}

3. Остановить автоматический выбор и закрыть меню — класс сценария

Параметры и ход выполнения:

  • Первая команда удаляет 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.

UO.CancelAllMenuHooks() — UO.CancelAllMenuHooks()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "cancelallmenuhooks": bridge.ClearMenuHooks(); return InjectionValue.Unit;

UO.CancelMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.CancelMenu();

Удаляет все зарегистрированные автоматические hooks старых серверных меню клиента.

Параметры

Параметров нет.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Вызывает ClearMenuHooks менеджера. Удаляются однократные и постоянные правила выбора, включая AutoMenu и WaitMenu. Уже открытые меню эта команда не закрывает; для этого служит CloseMenu.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.CancelMenu");
UO.CancelMenu();

1. Снять все hooks — прямой скрипт

Параметры и ход выполнения:

  • Удаление относится ко всему набору menu hooks клиента.
UO.CancelMenu();

2. Ограничить действие AutoMenu — функция сценария

Параметры и ход выполнения:

  • Hook сразу удаляется; будущие совпавшие меню больше не выбираются автоматически.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoMenu("Choose material", "Iron");
    UO.CancelMenu();
    return null;
}

3. Остановить автоматический выбор и закрыть меню — класс сценария

Параметры и ход выполнения:

  • Первая команда удаляет 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.

UO.CancelMenu() — UO.CancelMenu()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "cancelmenu": bridge.ClearMenuHooks(); break;

UO.ClearContextMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ClearContextMenu();

Удаляет текущую локальную модель контекстного меню.

Параметры

Параметров нет.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Вызывает Dispose у ServerMenus.Context, если модель есть; новое серверное меню может появиться после следующего запроса. Это не CloseMenu.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ClearContextMenu");
UO.ClearContextMenu();

1. Очистить состояние — прямой скрипт

Параметры и ход выполнения:

  • Удаляет текущую локальную модель контекстного меню.
UO.ClearContextMenu();

2. Очистить после настройки — функция сценария

Параметры и ход выполнения:

  • Снять локальное контекстное меню после чтения снимка.
return  RunScenario();
 object? RunScenario()
{
    var entries = UO.GetContextMenu();
    UO.ClearContextMenu();
    return null;
}

3. Повторная очистка — класс сценария

Параметры и ход выполнения:

  • Очистка пустого набора допустима и не создаёт новую настройку.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ClearContextMenu();
        UO.ClearContextMenu();
        return null;
    }
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.ClearContextMenu() — UO.ClearContextMenu()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "clearcontextmenu": bridge.ClearContextMenu(); return InjectionValue.Unit;

UO.CloseMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.CloseMenu();

Отменяет все активные старые серверные меню через CancelForYoko.

Параметры

Параметров нет.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Перебирает снимок ServerMenus и отменяет каждую модель. Не удаляет автоматические menu hooks и не закрывает произвольные gump/interface окна.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.CloseMenu");
UO.CloseMenu();

1. Отменить открытые меню — прямой скрипт

Параметры и ход выполнения:

  • Отмена относится к старым MenuGump/серверным меню.
UO.CloseMenu();

2. Удалить hooks и отменить меню — функция сценария

Параметры и ход выполнения:

  • Набор автоматического выбора и открытые меню обрабатываются отдельными командами.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelAllMenuHooks();
    UO.CloseMenu();
    return null;
}

3. Отменить после просмотра — класс сценария

Параметры и ход выполнения:

  • Снимок списка сохраняется в 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.

UO.CloseMenu() — UO.CloseMenu()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "closemenu": bridge.CloseMenu(); return InjectionValue.Unit;

UO.ConsoleEntryReply

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ConsoleEntryReply(object? text);

Отвечает текстом на активный серверный prompt через MessageManager.SendServerPromptResponse.

Параметры

  • text — Значение, преобразуемое в строку. Пустая строка отправляется как пустой ответ.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Обе команды направляются в ReplyServerPrompt. Тип пакета ASCII/Unicode выбирается по сохранённому состоянию server prompt; имя команды не принуждает отдельную кодировку. При отсутствии активного prompt менеджер не отправляет ответ.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ConsoleEntryReply");
UO.ConsoleEntryReply("reply");

1. Ответ на prompt — прямой скрипт

Параметры и ход выполнения:

  • Отправка относится к текущему серверному запросу ввода.
UO.ConsoleEntryReply("reply");

2. Пустой ответ — функция сценария

Параметры и ход выполнения:

  • Пустой текст передаётся менеджеру как пустой ответ.
return  RunScenario();
 object? RunScenario()
{
    UO.ConsoleEntryReply("");
    return null;
}

3. Ответ из переменной — класс сценария

Параметры и ход выполнения:

  • Имя переменной не влияет на выбранный формат 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.

UO.ConsoleEntryReply(text) — UO.ConsoleEntryReply(Any)

Параметры: text (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "consoleentryreply":

                case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;

UO.ConsoleEntryUnicodeReply

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ConsoleEntryUnicodeReply(object? text);

Отвечает текстом на активный серверный prompt через MessageManager.SendServerPromptResponse.

Параметры

  • text — Значение, преобразуемое в строку. Пустая строка отправляется как пустой ответ.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Обе команды направляются в ReplyServerPrompt. Тип пакета ASCII/Unicode выбирается по сохранённому состоянию server prompt; имя команды не принуждает отдельную кодировку. При отсутствии активного prompt менеджер не отправляет ответ.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ConsoleEntryUnicodeReply");
UO.ConsoleEntryUnicodeReply("reply");

1. Ответ на prompt — прямой скрипт

Параметры и ход выполнения:

  • Отправка относится к текущему серверному запросу ввода.
UO.ConsoleEntryUnicodeReply("reply");

2. Пустой ответ — функция сценария

Параметры и ход выполнения:

  • Пустой текст передаётся менеджеру как пустой ответ.
return  RunScenario();
 object? RunScenario()
{
    UO.ConsoleEntryUnicodeReply("");
    return null;
}

3. Ответ из переменной — класс сценария

Параметры и ход выполнения:

  • Имя переменной не влияет на выбранный формат 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.

UO.ConsoleEntryUnicodeReply(text) — UO.ConsoleEntryUnicodeReply(Any)

Параметры: text (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "consoleentryreply":

                case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;

UO.GetContextMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.GetContextMenu();

Читает строки пунктов текущей модели контекстного меню.

Параметры

Параметров нет.

Возвращает

Array строк из ServerMenus.Context.GetYokoItems(); при отсутствии модели — пустой массив.

Поведение

  • Не отправляет RequestContextMenu и не ждёт серверный ответ. Чтобы получить новое меню, сначала отдельно запросите его и дождитесь появления модели. ClearContextMenu удаляет модель после чтения.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.GetContextMenu();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитать текущее меню — прямой скрипт

Параметры и ход выполнения:

  • Читается уже имеющаяся модель.
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;

2. Запросить и прочитать позже — функция сценария

Параметры и ход выполнения:

  • 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)));

3. Снимок перед очисткой — класс сценария

Параметры и ход выполнения:

  • Сохранённый массив не исчезает после очистки модели меню.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        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.

UO.GetContextMenu() — UO.GetContextMenu()

Параметры: Параметров нет.

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getcontextmenu": return StringArray(bridge.GetContextMenu());

UO.GetLastMenuItems

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.GetLastMenuItems();

Читает пункты уже открытого старого серверного меню.

Параметры

Параметров нет.

Возвращает

Array строк. Строки имён/описаний пунктов GetYokoItems. Отсутствующее подходящее меню даёт пустой массив.

Поведение

  • Выбирается последнее меню снимка ServerMenus. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
  • Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.GetLastMenuItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести все пункты — прямой скрипт

Параметры и ход выполнения:

  • Пустой массив безопасно обрабатывается циклом.
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;

2. Первый пункт — функция сценария

Параметры и ход выполнения:

  • Индекс 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;

3. Сохранить снимок перед закрытием — класс сценария

Параметры и ход выполнения:

  • Массив остаётся доступен после отмены серверного меню.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        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.

UO.GetLastMenuItems() — UO.GetLastMenuItems()

Параметры: Параметров нет.

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getlastmenuitems": return StringArray(bridge.GetLastMenuItems());

UO.GetMenuItems

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.GetMenuItems(object? caption);

Читает пункты уже открытого старого серверного меню.

Параметры

  • caption — Подстрока заголовка старого серверного меню; поиск OrdinalIgnoreCase. Пустая строка соответствует любому заголовку.

Возвращает

Array строк. Строки имён/описаний пунктов GetYokoItems. Отсутствующее подходящее меню даёт пустой массив.

Поведение

  • Выбирается последнее не-Disposed меню с совпавшей подстрокой заголовка. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
  • Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.GetMenuItems("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести все пункты — прямой скрипт

Параметры и ход выполнения:

  • Пустой массив безопасно обрабатывается циклом.
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;

2. Первый пункт — функция сценария

Параметры и ход выполнения:

  • Индекс 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;

3. Сохранить снимок перед закрытием — класс сценария

Параметры и ход выполнения:

  • Массив остаётся доступен после отмены серверного меню.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        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.

UO.GetMenuItems(caption) — UO.GetMenuItems(Any)

Параметры: caption (Any)

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getmenuitems": return StringArray(bridge.GetMenuItems(Text(0), false));

UO.GetMenuItemsEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.GetMenuItemsEx(object? caption);

Читает пункты уже открытого старого серверного меню.

Параметры

  • caption — Подстрока заголовка старого серверного меню; поиск OrdinalIgnoreCase. Пустая строка соответствует любому заголовку.

Возвращает

Array строк. Строки graphicHex|hueHex|index|name, например 0x0001|0x0000|1|choice. Отсутствующее подходящее меню даёт пустой массив.

Поведение

  • Выбирается последнее не-Disposed меню с совпавшей подстрокой заголовка. Команда не открывает меню, не ставит hook и не выбирает пункт. Это не контекстное меню и не обычный серверный gump.
  • Порядок соответствует пунктам модели. Список является снимком; последующие изменения меню не обновляют сохранённый массив.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.GetMenuItemsEx("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести все пункты — прямой скрипт

Параметры и ход выполнения:

  • Пустой массив безопасно обрабатывается циклом.
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;

2. Первый пункт — функция сценария

Параметры и ход выполнения:

  • Индекс 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;

3. Сохранить снимок перед закрытием — класс сценария

Параметры и ход выполнения:

  • Массив остаётся доступен после отмены серверного меню.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        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.

UO.GetMenuItemsEx(caption) — UO.GetMenuItemsEx(Any)

Параметры: caption (Any)

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getmenuitemsex": return StringArray(bridge.GetMenuItems(Text(0), true));

UO.MenuHookPresent

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.MenuHookPresent();

Читает наличие зарегистрированных menu hooks.

Параметры

Параметров нет.

Возвращает

Числовой флаг int: 1 — _manager.HasMenuHooks, 0 — hooks нет. Само меню может ещё отсутствовать.

Поведение

  • Читает наличие зарегистрированных menu hooks. Не ждёт меню, не проверяет наличие серверного gump и не расходует hook.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.MenuHookPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает наличие зарегистрированных menu hooks.
UO.Print(UO.MenuHookPresent());

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Читает наличие зарегистрированных menu hooks. Не ждёт меню, не проверяет наличие серверного gump и не расходует hook.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitMenu("Craft", "Tools");
    UO.Print(UO.MenuHookPresent());
    return null;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Читает текущее локальное состояние. Пакета, 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.

UO.MenuHookPresent() — UO.MenuHookPresent()

Параметры: Параметров нет.

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "menuhookpresent": return new InjectionValue(bridge.MenuHookPresent());

UO.MenuPresent

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.MenuPresent();

MenuPresent прямо вызывает WaitingMenu.

Параметры

Параметров нет.

Возвращает

Числовой флаг int: 1 — есть server menu, 0 — нет.

Поведение

  • MenuPresent прямо вызывает WaitingMenu. Не проверяет GetGumpsCount, контекстные меню или зарегистрированные hooks.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.MenuPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • MenuPresent прямо вызывает WaitingMenu.
UO.Print(UO.MenuPresent());

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Читает текущее локальное состояние. Пакета, 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.

UO.MenuPresent() — UO.MenuPresent()

Параметры: Параметров нет.

Результат: dynamic / Any.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "menupresent": return new InjectionValue(bridge.MenuPresent());

UO.RequestContextMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.RequestContextMenu(object? objID);

Запрашивает контекстное меню объекта.

Параметры

  • objID — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Bridge вызывает GameActions.OpenPopupMenu. Ответ сохраняется отдельно и читается GetContextMenu; команда не выбирает строку меню.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.RequestContextMenu");
UO.RequestContextMenu(UO.GetSerial("lasttarget"));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Запрашивает контекстное меню объекта.
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;

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • 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.

UO.RequestContextMenu(objID) — UO.RequestContextMenu(Any)

Параметры: objID (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "requestcontextmenu": bridge.RequestContextMenu(Arg(0)); return InjectionValue.Unit;

UO.SetContextMenuHook

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 отдельно. Сам вызов не блокирует и не подтверждает серверное действие.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.SetContextMenuHook");
UO.SetContextMenuHook(0, 0);

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Регистрирует одноразовый выбор пункта контекстного меню.
UO.SetContextMenuHook(0, 0);

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • 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;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Если 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.

UO.SetContextMenuHook(menuID, entryNumber) — UO.SetContextMenuHook(Any,Any)

Параметры: menuID (Any), entryNumber (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "setcontextmenuhook": bridge.SetContextMenuHook(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.WaitMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 удаляется только после успешного выбора, постоянный остаётся.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.WaitMenu");
UO.WaitMenu("Craft", "Tools");

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Регистрирует до трёх одноразовых menu hooks.
UO.WaitMenu("Craft", "Tools");

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Каждая пара передаётся _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;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Не блокирует скрипт до появления меню. 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.

UO.WaitMenu(menuCaption, elementCaption) — UO.WaitMenu(Any,Any)

Параметры: menuCaption (Any/String), elementCaption (Any/String)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "waitmenu": bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()); return InjectionValue.Unit;

UO.WaitMenu(menuCaption, elementCaption) — UO.WaitMenu(String,String)

Параметры: menuCaption (Any/String), elementCaption (Any/String)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void WaitMenu(string prompt, string choice)

            => bridge.WaitMenu(prompt, choice);

UO.WaitMenu(prompt1, choice1, prompt2, choice2) — UO.WaitMenu(String,String,String,String)

Параметры: 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);

UO.WaitTextEntry

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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/индексом.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.WaitTextEntry");
UO.WaitTextEntry("Example");

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Пытается записать текст в textentry текущего gump.
UO.WaitTextEntry("Example");

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Не ждёт будущий 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.

UO.WaitTextEntry(value) — UO.WaitTextEntry(Any)

Параметры: value (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "waittextentry": bridge.SetGumpValue(-1, "textentry", -1, Text(0)); return InjectionValue.Unit;

UO.WaitingForMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.WaitingForMenu(3000);
UO.Print("WaitingForMenu: " + Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Ограниченно ждёт нужное количество появлений server menu.
UO.Print(UO.WaitingForMenu(3000));

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • После TriggerWaitAction читает GetLastMenuIdentity; новое identity увеличивает счётчик. Пустое identity сбрасывает память предыдущего, поэтому то же меню после закрытия/переоткрытия может засчитаться снова.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.WaitingForMenu(3000, 1, 1, "Craft"));
    return null;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Граница 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.

UO.WaitingForMenu(delay) — UO.WaitingForMenu(Any)

Параметры: delay (Any)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int WaitingForMenu(InjectionValue delay) => WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount) — UO.WaitingForMenu(Any,Any)

Параметры: delay (Any), menuCount (Any)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount) => WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount, blockMenu) — UO.WaitingForMenu(Any,Any,Any)

Параметры: delay (Any), menuCount (Any), blockMenu (Any)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu) => WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount, blockMenu, menuName) — UO.WaitingForMenu(Any,Any,Any,Any)

Параметры: delay (Any), menuCount (Any), blockMenu (Any), menuName (Any)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

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.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

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;

        }

UO.WaitingMenu

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.WaitingMenu();

Читает _world.ServerMenus.Snapshot().Length != 0.

Параметры

Параметров нет.

Возвращает

Числовой флаг int: 1 — в ServerMenus есть хотя бы одно меню, 0 — нет. Это наличие меню, не ожидание скрипта.

Поведение

  • Читает _world.ServerMenus.Snapshot().Length != 0. Legacy server menus отделены от обычных серверных gumps и контекстного меню.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.WaitingMenu();
UO.Print("WaitingMenu: " + Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает _world.ServerMenus.Snapshot().Length != 0.
UO.Print(UO.WaitingMenu());

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Читает _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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Читает текущее локальное состояние. Пакета, 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.

UO.WaitingMenu() — UO.WaitingMenu()

Параметры: Параметров нет.

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int WaitingMenu() => bridge.WaitingMenu();
⚠️ **GitHub.com Fallback** ⚠️