RU UO Topic shops vendors - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Магазины и продавцы

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

Покупка, продажа, списки магазина, задержки и цены личного торговца. AllPrice и MassPriceMove используют type предмета там, где это указано в их параметрах.

Покупка и продажа: порядок действий

Открыть полный каталог и примеры

Разделы

Тема Команды и пояснения
Buy UO.Buy
Sell UO.Sell
AutoBuy UO.AutoBuy
AutoSell UO.AutoSell
Shop List UO.GetShopList · UO.ClearShopList · UO.Shop
Prices UO.GetPrice · UO.AllPrice · UO.MassPriceMove
VendorMenu UO.VendorMenu
SendShopReply UO.SendShopReply

Все команды темы

Покупка/Продажа

UO.Buy · UO.Sell · UO.AutoBuy · UO.AutoBuyEx · UO.AutoSell · UO.Shop · UO.GetShopList · UO.ClearShopList · UO.VendorMenu · UO.SendShopReply

Цены

UO.GetPrice · UO.AllPrice · UO.MassPriceMove

Задержки

UO.GetAutoBuyDelay · UO.GetAutoSellDelay · UO.SetAutoBuyDelay · UO.SetAutoSellDelay

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

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

UO.AllPrice

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

UO.AllPrice(125);
UO.Print("Drop goods into your vendor inventory");

UO.MassPriceMove

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

UO.MassPriceMove(350, 50, 0, 125);
UO.Print("Drag one complete stack into your vendor bag");

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


UO.AllPrice

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

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

void UO.AllPrice();
void UO.AllPrice(object? price);
void UO.AllPrice(object? price, object? @type);

Включает автоматический ввод цены после помещения предмета в инвентарь своего вендора. Команда сама не переносит предметы. Сначала включите режим, затем перетащите предмет. Цена отправляется только после соответствующего запроса сервера. Второй параметр фильтрует TYPE предмета.

Параметры

  • price — Первый параметр — целая цена за весь выставляемый item/стек, от 0 до 2147483647. 125 означает цену 125. 0 — явно нулевая цена (бесплатно, если разрешено сервером), не выключение. Отрицательное значение выключает режим; рекомендуется UO.AllPrice() без аргументов.
  • type — Второй необязательный параметр — TYPE/Graphic от 0 до 65535, число либо hex-строка, например 0x0EED. 0 или отсутствие — любые типы. Serial предмета и имя объекта не подходят. Цвет не фильтруется.

Возвращает

void: значения нет. Activate AllPrice сообщает о включении. Строка sent price сообщает об отправленном ответе, не о подтверждённом сервером принятии цены.

Поведение

  • Режим действует на последующие переносы, пока его не выключат. Запрос цены, который уже висел до включения/переноса, автоматически не заполняется. Не отвечает на запросы переименования вендора/магазина.
  • Требуется известная клиенту принадлежность контейнера другому персонажу/NPC. Право управлять вендором и допустимость цены проверяет сервер. Обычный рюкзак персонажа, сундук на земле и земля не получают автоматическую цену.
  • Для стандартного вендора распознаётся запрос цены cliloc 1043303 независимо от языка клиента. Также поддержаны системные текстовые приглашения, начинающиеся с Type in a price, Enter a price, Enter the price, Введите цену или Введіть ціну. Неизвестное приглашение оставляется для ручного ответа.
  • Поддержаны ASCII и Unicode запросы сервера. Если приглашение не пришло за 10 секунд, отложенный ответ отменяется. При массовом переносе также останавливается очередь. Уже отправленные ответы не отзываются.
  • Предмет другого TYPE не получает цену. Если включён MassMove, следующая отправка ждёт обработки запроса цены; неизвестный или неподходящий запрос прекращает очередь, чтобы не перепутать предметы.
  • AllPrice() очищает отложенные цены и выключает режим. TerminateAll(), выход, смерть или смена карты также сбрасывают автоматическую цену. Эта команда не меняет цены уже выставленных товаров.

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

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

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

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

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

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

1. Одна цена для последующих предметов любого типа — прямой скрипт

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

  • price=125 — цена каждого item целиком. type отсутствует: подходят любые типы.
  • После запуска вручную положите товар в инвентарь своего вендора. На запрос цены клиент ответит 125. Каждый следующий предмет получает такую же цену до выключения.
  • Print только напоминает действие; эта процедура сама ничего не переносит.
UO.AllPrice(125);
UO.Print("Drop goods into your vendor inventory");

2. Автоматическая цена только для заданного типа — функция сценария

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

  • salePrice передаётся как price=250. itemType передаётся как type=0x0F7A, не serial отдельного товара.
  • Цена 250 относится к целой выставляемой стопке. Команда не умножает цену на число единиц внутри неё.
  • Другие типы остаются без автоматического ответа. Для них укажите цену вручную или включите AllPrice с другим фильтром.
return  RunScenario();
 object? RunScenario()
{
    var itemType = "0x0F7A";
    var salePrice = 250;
    UO.AllPrice(salePrice, itemType);
    return null;
}

3. Явно выставлять предметы бесплатно — класс сценария

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

  • price=0 — отправить серверу строку 0 как цену. Это не отмена диалога и не выключение.
  • type=0x0F7A ограничивает бесплатную цену этим типом. Поведение бесплатной продажи зависит от правил сервера.
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.AllPrice(0, "0x0F7A");
        return null;
    }
}

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

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

  • Аргументов нет: выключается режим и удаляются ожидающие ответы.
  • Уже установленная сервером цена не меняется. Следующий запрос цены пользователь заполняет сам.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

UO.AllPrice();

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

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

UO.AllPrice() — UO.AllPrice()

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

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

При вызове:

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

case "allprice":

                    bridge.AllPrice(arguments.Length > 0 ? NumberConversions.ToInt(arguments[0]) : -1,

                        arguments.Length > 1 ? ResolveType(arguments[1]) : 0);

                    break;

UO.AllPrice(price) — UO.AllPrice(Any)

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

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

При вызове:

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

case "allprice":

                    bridge.AllPrice(arguments.Length > 0 ? NumberConversions.ToInt(arguments[0]) : -1,

                        arguments.Length > 1 ? ResolveType(arguments[1]) : 0);

                    break;

UO.AllPrice(price, type) — UO.AllPrice(Any,Any)

Параметры: price (Any), type (Any)

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

При вызове:

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

case "allprice":

                    bridge.AllPrice(arguments.Length > 0 ? NumberConversions.ToInt(arguments[0]) : -1,

                        arguments.Length > 1 ? ResolveType(arguments[1]) : 0);

                    break;

UO.AutoBuy

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

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

void UO.AutoBuy(object? itemType, object? itemColor, object? quantity);

Создаёт, обновляет либо удаляет правило автоматической покупки в основном списке Default текущего профиля Bad Newbie. Команда настраивает будущую обработку предложения NPC-продавца; сама не произносит buy/sell, не открывает магазин и не подтверждает сделку. Полный порядок действий: списки магазина.

Параметры

  • itemType — Graphic товара 0..65535: например 0x0F7A — Black Pearl, 0x0F51 — кинжал. Это не serial продавца/предмета и не body персонажа. Отрицательное число или число больше 65535 отвергается. Здесь 0xFFFF — конкретный graphic, не маска всех товаров.
  • itemColor — Hue товара: отрицательное число либо 0xFFFF — любой; 0 — только неокрашенные предметы. Для точного hue используйте 0..65534. Цвета вне этого диапазона не используйте: положительное значение преобразуется к ushort. Обязателен.
  • quantity — Количество ЕДИНИЦ товара на одно полученное предложение магазина, не число стопок и не желаемый остаток в рюкзаке. Положительное ограничивается 65535. 0/отрицательное удаляет совпадающее правило type+color из Default; это не «всё количество». Обязателен.

Возвращает

void — значения нет. Вызывайте отдельной строкой, без var result = и без if. Окончание вызова означает окончание настройки, а не успешную сделку. При отсутствии профиля или недопустимом graphic правило не создаётся; числового результата ошибки нет. Фактическую сделку проверяйте по содержимому рюкзака, золоту и ответу сервера.

Поведение

  • Все 3 аргументов обязательны. Это настройка правила, не функция ожидания.
  • Ключ правила — graphic и маска hue в Default. Повторный вызов заменяет количество и остальные поля этого правила; он не добавляет ещё один лимит поверх предыдущего. Без цены/имени прежние ограничения этих полей снимаются.
  • Новое/обновлённое правило Enabled=true. Общий переключатель покупки/продажи устанавливается по наличию правил, профиль сохраняется. Сам выключенный Default-список автоматически не включается: в настройках должны быть включены и общий режим, и список. Другие именованные списки не изменяются.
  • Обработка начинается при поступлении списка товаров. Лимит расходуется суммарно по строкам, сопоставленным одному правилу. Для каждой позиции используется первое подходящее включённое правило. Повторное открытие магазина даёт новое предложение и новый лимит, пока правило активно.
  • Работает в Full с Bad Newbie; в Classic эта автоматизация отключена. Не подставляйте в параметры имя NPC или название сохранённого списка. AutoBuyEx добавляет фильтры цены/имени при покупке; ClearShopList сбрасывает обе автоматизации целиком.

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

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

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

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

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

UO.Print("Calling UO.AutoBuy");
UO.AutoBuy(0x0F7A, -1, 1);

1. Подготовить покупку одной единицы реагента — прямой скрипт

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

  • 0x0F7A — graphic реагента, не ID NPC. Количество — 1; цвет — любой. В этой форме потолок цены не задан. Сам скрипт ничего не произносит и не открывает магазин. Правило продолжает действовать при следующих предложениях, пока вы его не измените/отключите.
UO.AutoBuy(0x0F7A, -1, 1);

2. Настроить запас реагента на одно предложение магазина — функция сценария

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

  • 20 — максимум в одном ответе магазина, а не «довести количество до 20». У AutoBuy нет аргументов цены и имени. Если они нужны, используйте AutoBuyEx; его полный пример доступен по ссылке ниже. Отсутствие товара, деньги и правила сервера определяют итог.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoBuy(0x0F7A, 0, 20);
    return null;
}

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

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

  • Помощник принимает graphic. Удаляются только правила Default с AnyHue; отдельные правила hue=0 сохраняются. Это не отменяет сделку, уже отправленную серверу. Для удаления точного цвета передайте тот же hue, с которым создавалось правило.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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()
    {
        DisableReagentRule(0x0F7A);
        DisableReagentRule(0x0F84);
        return null;
    }

    void DisableReagentRule(dynamic itemType)
    {
        UO.AutoBuy(itemType, -1, 0);
    }
}

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

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

UO.AutoBuy(itemType, itemColor, quantity) — UO.AutoBuy(Any,Any,Any)

Параметры: itemType (Any), itemColor (Any), quantity (Any)

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

При вызове:

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

case "autobuy":

                    bridge.SetAutoBuyRule(Arg(0), Arg(1), Arg(2), 0, string.Empty); return InjectionValue.Unit;

UO.AutoBuyEx

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

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

void UO.AutoBuyEx(object? itemType, object? itemColor, object? quantity, object? price, object? name);

Создаёт, обновляет либо удаляет правило автоматической покупки в основном списке Default текущего профиля Bad Newbie. Команда настраивает будущую обработку предложения NPC-продавца; сама не произносит buy/sell, не открывает магазин и не подтверждает сделку. Полный порядок действий: списки магазина.

Параметры

  • itemType — Graphic товара 0..65535: например 0x0F7A — Black Pearl, 0x0F51 — кинжал. Это не serial продавца/предмета и не body персонажа. Отрицательное число или число больше 65535 отвергается. Здесь 0xFFFF — конкретный graphic, не маска всех товаров.
  • itemColor — Hue товара: отрицательное число либо 0xFFFF — любой; 0 — только неокрашенные предметы. Для точного hue используйте 0..65534. Цвета вне этого диапазона не используйте: положительное значение преобразуется к ushort. Обязателен.
  • quantity — Количество ЕДИНИЦ товара на одно полученное предложение магазина, не число стопок и не желаемый остаток в рюкзаке. Положительное ограничивается 65535. 0/отрицательное удаляет совпадающее правило type+color из Default; это не «всё количество». Обязателен.
  • price — Максимальная цена ОДНОЙ единицы, не всей сделки. 0/отрицательное — без потолка цены. Товар дороже положительного лимита пропускается. Цена не торгуется и не меняется на сервере. Обязателен.
  • name — Подстрока имени ТОВАРА без учёта регистра; пробелы по краям удаляются, пустая строка — без фильтра. Это не имя продавца и не название списка. Например "Black Pearl" проверяет текст позиции магазина, если сервер прислал именно такое имя. Обязателен.

Возвращает

void — значения нет. Вызывайте отдельной строкой, без var result = и без if. Окончание вызова означает окончание настройки, а не успешную сделку. При отсутствии профиля или недопустимом graphic правило не создаётся; числового результата ошибки нет. Фактическую сделку проверяйте по содержимому рюкзака, золоту и ответу сервера.

Поведение

  • Все 5 аргументов обязательны. Это настройка правила, не функция ожидания.
  • Ключ правила — graphic и маска hue в Default. Повторный вызов заменяет количество и остальные поля этого правила; он не добавляет ещё один лимит поверх предыдущего. Без цены/имени прежние ограничения этих полей снимаются.
  • Новое/обновлённое правило Enabled=true. Общий переключатель покупки/продажи устанавливается по наличию правил, профиль сохраняется. Сам выключенный Default-список автоматически не включается: в настройках должны быть включены и общий режим, и список. Другие именованные списки не изменяются.
  • Обработка начинается при поступлении списка товаров. Лимит расходуется суммарно по строкам, сопоставленным одному правилу. Для каждой позиции используется первое подходящее включённое правило. Повторное открытие магазина даёт новое предложение и новый лимит, пока правило активно.
  • Работает в Full с Bad Newbie; в Classic эта автоматизация отключена. Не подставляйте в параметры имя NPC или название сохранённого списка. AutoBuyEx добавляет фильтры цены/имени при покупке; ClearShopList сбрасывает обе автоматизации целиком.

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

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

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

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

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

UO.Print("Calling UO.AutoBuyEx");
UO.AutoBuyEx(0x0F7A, -1, 1, 5, "");

1. Подготовить покупку одной единицы реагента — прямой скрипт

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

  • 0x0F7A — graphic реагента, не ID NPC. Количество — 1; цвет — любой. Потолок цены 5 за единицу. Сам скрипт ничего не произносит и не открывает магазин. Правило продолжает действовать при следующих предложениях, пока вы его не измените/отключите.
UO.AutoBuyEx(0x0F7A, -1, 1, 5, "");

2. Настроить запас реагента на одно предложение магазина — функция сценария

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

  • 20 — максимум в одном ответе магазина, а не «довести количество до 20». 5 — цена за единицу, "Black Pearl" — подстрока имени товара. Если сервер называет реагент иначе, измените фильтр или передайте "". Отсутствие товара, деньги и правила сервера определяют итог.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoBuyEx(0x0F7A, 0, 20, 5, "Black Pearl");
    return null;
}

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

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

  • Помощник принимает graphic. Удаляются только правила Default с AnyHue; отдельные правила hue=0 сохраняются. Это не отменяет сделку, уже отправленную серверу. Для удаления точного цвета передайте тот же hue, с которым создавалось правило.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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()
    {
        DisableReagentRule(0x0F7A);
        DisableReagentRule(0x0F84);
        return null;
    }

    void DisableReagentRule(dynamic itemType)
    {
        UO.AutoBuyEx(itemType, -1, 0, 0, "");
    }
}

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

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

UO.AutoBuyEx(itemType, itemColor, quantity, price, name) — UO.AutoBuyEx(Any,Any,Any,Any,Any)

Параметры: itemType (Any), itemColor (Any), quantity (Any), price (Any), name (Any)

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

При вызове:

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

case "autobuyex":

                    bridge.SetAutoBuyRule(Arg(0), Arg(1), Arg(2), Arg(3), Text(4)); return InjectionValue.Unit;

UO.AutoSell

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

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

void UO.AutoSell(object? itemType, object? itemColor, object? quantity);

Создаёт, обновляет либо удаляет правило автоматической продажи в основном списке Default текущего профиля Bad Newbie. Команда настраивает будущую обработку предложения NPC-продавца; сама не произносит buy/sell, не открывает магазин и не подтверждает сделку. Полный порядок действий: списки магазина.

Параметры

  • itemType — Graphic товара 0..65535: например 0x0F7A — Black Pearl, 0x0F51 — кинжал. Это не serial продавца/предмета и не body персонажа. Отрицательное число или число больше 65535 отвергается. Здесь 0xFFFF — конкретный graphic, не маска всех товаров.
  • itemColor — Hue товара: отрицательное число либо 0xFFFF — любой; 0 — только неокрашенные предметы. Для точного hue используйте 0..65534. Цвета вне этого диапазона не используйте: положительное значение преобразуется к ushort. Обязателен.
  • quantity — Количество ЕДИНИЦ товара на одно полученное предложение магазина, не число стопок и не желаемый остаток в рюкзаке. Положительное ограничивается 65535. 0/отрицательное удаляет совпадающее правило type+color из Default; это не «всё количество». Обязателен.

Возвращает

void — значения нет. Вызывайте отдельной строкой, без var result = и без if. Окончание вызова означает окончание настройки, а не успешную сделку. При отсутствии профиля или недопустимом graphic правило не создаётся; числового результата ошибки нет. Фактическую сделку проверяйте по содержимому рюкзака, золоту и ответу сервера.

Поведение

  • Все 3 аргументов обязательны. Это настройка правила, не функция ожидания.
  • Ключ правила — graphic и маска hue в Default. Повторный вызов заменяет количество и остальные поля этого правила; он не добавляет ещё один лимит поверх предыдущего. Без цены/имени прежние ограничения этих полей снимаются.
  • Новое/обновлённое правило Enabled=true. Общий переключатель покупки/продажи устанавливается по наличию правил, профиль сохраняется. Сам выключенный Default-список автоматически не включается: в настройках должны быть включены и общий режим, и список. Другие именованные списки не изменяются.
  • Обработка начинается при поступлении списка товаров. Лимит расходуется суммарно по строкам, сопоставленным одному правилу. Для каждой позиции используется первое подходящее включённое правило. Повторное открытие магазина даёт новое предложение и новый лимит, пока правило активно.
  • Работает в Full с Bad Newbie; в Classic эта автоматизация отключена. Не подставляйте в параметры имя NPC или название сохранённого списка. AutoBuyEx добавляет фильтры цены/имени при покупке; ClearShopList сбрасывает обе автоматизации целиком.

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

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

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

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

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

UO.Print("Calling UO.AutoSell");
UO.AutoSell(0x0F51, -1, 1);

1. Разрешить продажу одного кинжала — прямой скрипт

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

  • 0x0F51 — graphic кинжала, любой hue, 1 — единица за одно предложение. Команда не выбирает конкретный serial и не проверяет полезность/ценность вещи. Выберите точный type/color своего товара.
UO.AutoSell(0x0F51, -1, 1);

2. Продавать только робу определённой окраски — функция сценария

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

  • 0x1F03 — пример стандартного graphic робы, 0x0044 — пример hue. Замените оба на свой товар. 5 — единицы, не цена; параметры минимальной цены и имени Sell/AutoSell не принимают. Сервер должен включить вещь в предложение продажи.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoSell(0x1F03, 0x0044, 5);
    return null;
}

3. Отключить продажу двух типов перед походом к NPC — класс сценария

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

  • Имя процедуры произвольное; itemType и hue — её параметры. Другие правила, покупка и пользовательские именованные списки сохраняются. Если другой включённый список тоже продаёт эти предметы, отключите соответствующее правило в нём через настройки.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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()
    {
        RemoveSaleRule(0x0F51, -1);
        RemoveSaleRule(0x1F03, 0x0044);
        return null;
    }

    void RemoveSaleRule(dynamic itemType, dynamic hue)
    {
        UO.AutoSell(itemType, hue, 0);
    }
}

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

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

UO.AutoSell(itemType, itemColor, quantity) — UO.AutoSell(Any,Any,Any)

Параметры: itemType (Any), itemColor (Any), quantity (Any)

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

При вызове:

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

case "autosell":

                    bridge.SetAutoSellRule(Arg(0), Arg(1), Arg(2)); return InjectionValue.Unit;

UO.Buy

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

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

void UO.Buy(object? @type);
void UO.Buy(object? @type, object? color);
void UO.Buy(object? @type, object? color, object? quantity);
void UO.Buy(object? @type, object? color, object? quantity, object? maxPrice);
void UO.Buy(object? @type, object? color, object? quantity, object? maxPrice, object? name);

Создаёт, обновляет либо удаляет правило автоматической покупки в основном списке Default текущего профиля Bad Newbie. Команда настраивает будущую обработку предложения NPC-продавца; сама не произносит buy/sell, не открывает магазин и не подтверждает сделку. Полный порядок действий: списки магазина.

Параметры

  • type — Graphic товара 0..65535: например 0x0F7A — Black Pearl, 0x0F51 — кинжал. Это не serial продавца/предмета и не body персонажа. Отрицательное число или число больше 65535 отвергается. Здесь 0xFFFF — конкретный graphic, не маска всех товаров.
  • color — Hue товара: отрицательное число либо 0xFFFF — любой; 0 — только неокрашенные предметы. Для точного hue используйте 0..65534. Цвета вне этого диапазона не используйте: положительное значение преобразуется к ushort. По умолчанию -1.
  • quantity — Количество ЕДИНИЦ товара на одно полученное предложение магазина, не число стопок и не желаемый остаток в рюкзаке. Положительное ограничивается 65535. 0/отрицательное удаляет совпадающее правило type+color из Default; это не «всё количество». По умолчанию 1.
  • maxPrice — Максимальная цена ОДНОЙ единицы, не всей сделки. 0/отрицательное — без потолка цены. Товар дороже положительного лимита пропускается. Цена не торгуется и не меняется на сервере. По умолчанию 0.
  • name — Подстрока имени ТОВАРА без учёта регистра; пробелы по краям удаляются, пустая строка — без фильтра. Это не имя продавца и не название списка. Например "Black Pearl" проверяет текст позиции магазина, если сервер прислал именно такое имя. По умолчанию пустая строка.

Возвращает

void — значения нет. Вызывайте отдельной строкой, без var result = и без if. Окончание вызова означает окончание настройки, а не успешную сделку. При отсутствии профиля или недопустимом graphic правило не создаётся; числового результата ошибки нет. Фактическую сделку проверяйте по содержимому рюкзака, золоту и ответу сервера.

Поведение

  • Buy принимает от 1 до 5 аргументов; пропущенные справа color=-1, quantity=1, maxPrice=0, name="".
  • Ключ правила — graphic и маска hue в Default. Повторный вызов заменяет количество и остальные поля этого правила; он не добавляет ещё один лимит поверх предыдущего. Без цены/имени прежние ограничения этих полей снимаются.
  • Новое/обновлённое правило Enabled=true. Общий переключатель покупки/продажи устанавливается по наличию правил, профиль сохраняется. Сам выключенный Default-список автоматически не включается: в настройках должны быть включены и общий режим, и список. Другие именованные списки не изменяются.
  • Обработка начинается при поступлении списка товаров. Лимит расходуется суммарно по строкам, сопоставленным одному правилу. Для каждой позиции используется первое подходящее включённое правило. Повторное открытие магазина даёт новое предложение и новый лимит, пока правило активно.
  • Работает в Full с Bad Newbie; в Classic эта автоматизация отключена. Не подставляйте в параметры имя NPC или название сохранённого списка. AutoBuyEx добавляет фильтры цены/имени при покупке; ClearShopList сбрасывает обе автоматизации целиком.

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

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

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

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

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

UO.Print("Calling UO.Buy");
UO.Buy(0x0F7A);

1. Подготовить покупку одной единицы реагента — прямой скрипт

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

  • 0x0F7A — graphic реагента, не ID NPC. Количество — 1; цвет — любой. В этой форме потолок цены не задан. Сам скрипт ничего не произносит и не открывает магазин. Правило продолжает действовать при следующих предложениях, пока вы его не измените/отключите.
UO.Buy(0x0F7A);

2. Настроить запас реагента на одно предложение магазина — функция сценария

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

  • 20 — максимум в одном ответе магазина, а не «довести количество до 20». 5 — цена за единицу, "Black Pearl" — подстрока имени товара. Если сервер называет реагент иначе, измените фильтр или передайте "". Отсутствие товара, деньги и правила сервера определяют итог.
return  RunScenario();
 object? RunScenario()
{
    UO.Buy(0x0F7A, 0, 20, 5, "Black Pearl");
    return null;
}

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

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

  • Помощник принимает graphic. Удаляются только правила Default с AnyHue; отдельные правила hue=0 сохраняются. Это не отменяет сделку, уже отправленную серверу. Для удаления точного цвета передайте тот же hue, с которым создавалось правило.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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()
    {
        DisableReagentRule(0x0F7A);
        DisableReagentRule(0x0F84);
        return null;
    }

    void DisableReagentRule(dynamic itemType)
    {
        UO.Buy(itemType, -1, 0);
    }
}

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

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

UO.Buy(type) — UO.Buy(Any)

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

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

При вызове:

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

case "buy":

                    bridge.SetAutoBuyRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1, arguments.Length > 3 ? Arg(3) : 0, arguments.Length > 4 ? Text(4) : string.Empty);

                    break;

UO.Buy(type, color) — UO.Buy(Any,Any)

Параметры: type (Any), color (Any)

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

При вызове:

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

case "buy":

                    bridge.SetAutoBuyRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1, arguments.Length > 3 ? Arg(3) : 0, arguments.Length > 4 ? Text(4) : string.Empty);

                    break;

UO.Buy(type, color, quantity) — UO.Buy(Any,Any,Any)

Параметры: type (Any), color (Any), quantity (Any)

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

При вызове:

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

case "buy":

                    bridge.SetAutoBuyRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1, arguments.Length > 3 ? Arg(3) : 0, arguments.Length > 4 ? Text(4) : string.Empty);

                    break;

UO.Buy(type, color, quantity, maxPrice) — UO.Buy(Any,Any,Any,Any)

Параметры: type (Any), color (Any), quantity (Any), maxPrice (Any)

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

При вызове:

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

case "buy":

                    bridge.SetAutoBuyRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1, arguments.Length > 3 ? Arg(3) : 0, arguments.Length > 4 ? Text(4) : string.Empty);

                    break;

UO.Buy(type, color, quantity, maxPrice, name) — UO.Buy(Any,Any,Any,Any,Any)

Параметры: type (Any), color (Any), quantity (Any), maxPrice (Any), name (Any)

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

При вызове:

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

case "buy":

                    bridge.SetAutoBuyRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1, arguments.Length > 3 ? Arg(3) : 0, arguments.Length > 4 ? Text(4) : string.Empty);

                    break;

UO.ClearShopList

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

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

void UO.ClearShopList();

Удаляет правила автоматической покупки и продажи активного профиля.

Параметры

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

Возвращает

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

Поведение

  • Очищает BackNewbieAutoBuyRules и BackNewbieAutoSellRules, выключает общие AutoBuy/AutoSell, обновляет OptionsGump и сохраняет профиль. Список лута не меняется; отсутствие профиля даёт пустое действие.

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

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

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

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

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

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

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

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

  • Удаляет правила автоматической покупки и продажи активного профиля.
UO.ClearShopList();

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

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

  • Удалить правило покупки бинтов вместе с остальными правилами торговли.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoBuy(0x0E21, -1, 10);
    UO.ClearShopList();
    return null;
}

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

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

  • Очистка пустого набора допустима и не создаёт новую настройку.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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.ClearShopList();
        UO.ClearShopList();
        return null;
    }
}

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

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

UO.ClearShopList() — UO.ClearShopList()

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

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

При вызове:

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

case "clearshoplist":

                    bridge.ClearAutoShopRules(); return InjectionValue.Unit;

UO.GetAutoBuyDelay

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

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

dynamic UO.GetAutoBuyDelay();

Читает текущую задержку автоматической покупки из профиля клиента.

Параметры

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

Возвращает

int — текущая задержка в миллисекундах. Значения, записанные setter, ограничены 0…65535. 0 означает отсутствие дополнительной задержки; это не ошибка. При отсутствии загруженного профиля возвращается 3. Чтение не возвращает количество товаров и не подтверждает сделку.

Поведение

  • Настройка общая для текущего профиля: изменения в другом скрипте или UI видны при следующем чтении. Ноль — действующая настройка, не признак отсутствия данных и не повод возвращать старый кэш скрипта.
  • Значение по умолчанию — 3 мс. После отправки автоматической операции менеджер задаёт время следующей разрешённой операции. Списки вендора, пришедшие раньше, не обрабатываются этим проходом; getter не запускает ожидание и сам не отправляет покупку/продажу.
  • Это не задержка MassMove, Drag/Drop или ручной торговли. Новое значение применяется при планировании следующей задержки; уже назначенный момент не пересчитывается.

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

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

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

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

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

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

1. Вывести действующую задержку — прямой скрипт

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

  • Аргументов нет. delay — время в миллисекундах.
  • Значение отражает профиль на момент вызова. Сохранённая var позже сама не обновится.
var delay = UO.GetAutoBuyDelay();
UO.Print("Delay ms: " + Convert.ToString(delay));

2. Изменить настройку и прочитать ограниченное значение — функция сценария

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

  • setter получает 70000 мс; допустимый максимум — 65535. Пример изменяет настройку профиля.
  • actual должен содержать 65535 при загруженном профиле. Getter возвращает фактическое ограниченное значение, а не исходный аргумент 70000.
return  RunScenario();
 object? RunScenario()
{
    UO.SetAutoBuyDelay(70000);
    var actual = UO.GetAutoBuyDelay();
    UO.Print(Convert.ToString(actual));
    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()
    {
        var current = UO.GetAutoBuyDelay();
        if (Truth(current == 0))
        {
            UO.Print("No additional delay");
        }
        else
        {
            UO.Print("Delay: " + Convert.ToString(current) + " ms");
        }

        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.GetAutoBuyDelay() — UO.GetAutoBuyDelay()

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

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

При вызове:

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

case "getautobuydelay":

                    return new InjectionValue(bridge.GetAutoBuyDelay());

UO.GetAutoSellDelay

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

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

dynamic UO.GetAutoSellDelay();

Читает текущую задержку автоматической продажи из профиля клиента.

Параметры

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

Возвращает

int — текущая задержка в миллисекундах. Значения, записанные setter, ограничены 0…65535. 0 означает отсутствие дополнительной задержки; это не ошибка. При отсутствии загруженного профиля возвращается 3. Чтение не возвращает количество товаров и не подтверждает сделку.

Поведение

  • Настройка общая для текущего профиля: изменения в другом скрипте или UI видны при следующем чтении. Ноль — действующая настройка, не признак отсутствия данных и не повод возвращать старый кэш скрипта.
  • Значение по умолчанию — 3 мс. После отправки автоматической операции менеджер задаёт время следующей разрешённой операции. Списки вендора, пришедшие раньше, не обрабатываются этим проходом; getter не запускает ожидание и сам не отправляет покупку/продажу.
  • Это не задержка MassMove, Drag/Drop или ручной торговли. Новое значение применяется при планировании следующей задержки; уже назначенный момент не пересчитывается.

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

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

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

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

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

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

1. Вывести действующую задержку — прямой скрипт

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

  • Аргументов нет. delay — время в миллисекундах.
  • Значение отражает профиль на момент вызова. Сохранённая var позже сама не обновится.
var delay = UO.GetAutoSellDelay();
UO.Print("Delay ms: " + Convert.ToString(delay));

2. Изменить настройку и прочитать ограниченное значение — функция сценария

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

  • setter получает 70000 мс; допустимый максимум — 65535. Пример изменяет настройку профиля.
  • actual должен содержать 65535 при загруженном профиле. Getter возвращает фактическое ограниченное значение, а не исходный аргумент 70000.
return  RunScenario();
 object? RunScenario()
{
    UO.SetAutoSellDelay(70000);
    var actual = UO.GetAutoSellDelay();
    UO.Print(Convert.ToString(actual));
    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()
    {
        var current = UO.GetAutoSellDelay();
        if (Truth(current == 0))
        {
            UO.Print("No additional delay");
        }
        else
        {
            UO.Print("Delay: " + Convert.ToString(current) + " ms");
        }

        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.GetAutoSellDelay() — UO.GetAutoSellDelay()

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

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

При вызове:

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

case "getautoselldelay":

                    return new InjectionValue(bridge.GetAutoSellDelay());

UO.GetPrice

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

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

dynamic UO.GetPrice(object? objID);

Читает известную клиенту Item.Price для serial предмета.

Параметры

  • objID — Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.

Возвращает

int — unchecked-преобразование uint Item.Price в int. Отсутствующий предмет даёт 0; цены выше 2147483647 отображаются как отрицательное int.

Поведение

  • Команда не запрашивает предложение вендора. Значение зависит от ранее полученных клиентом данных. Ноль может обозначать неизвестную/нулевую цену или отсутствие предмета; для проверки объекта используйте Exists.

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

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

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

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

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

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

1. Цена выбранного предмета — прямой скрипт

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

  • Результат является кэшированным Item.Price.
var item = UO.LastTarget();
if (Truth(UO.Exists(item)))
{
    var price = UO.GetPrice(item);
    UO.Print(Convert.ToString(price));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Нулевой serial — функция сценария

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

  • Отсутствующий предмет даёт 0.
return  RunScenario();
 object? RunScenario()
{
    var price = UO.GetPrice(0);
    UO.Print(Convert.ToString(price));
    return null;
}

3. Снимок цены — класс сценария

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var item = UO.LastTarget();
        var before = UO.GetPrice(item);
        await Delay(500);
        var after = UO.GetPrice(item);
        UO.Print(Convert.ToString(before) + " " + Convert.ToString(after));
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.GetPrice(objID) — UO.GetPrice(Any)

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

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

При вызове:

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

case "getprice":

                    return new InjectionValue(bridge.GetPrice(Arg(0)));

UO.GetShopList

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

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

dynamic UO.GetShopList();

Читает товары последнего активного предложения NPC-продавца. Позволяет проверить тип, количество и цену перед покупкой или продажей.

Параметры

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

Возвращает

Array of string — массив строк, индексы от 0. Каждая строка: serial|graphic|hue|amount|price|name. Serial — ID конкретной позиции, graphic — тип, hue — цвет; первые три поля записаны в 0x-формате. Amount — доступные единицы за вычетом черновика в окне, price — цена одной единицы, name — имя. Это не список serial и не bool. Если предложения нет, массив пуст. Имя может содержать |: первые пять разделителей задают поля, остальное является именем.

Поведение

  • Сначала обычным игровым действием откройте покупку или продажу у нужного NPC и дождитесь предложения сервера. Эти команды сами не ищут продавца, не открывают торговлю, не задают цену личному vendor и не переносят вещи между сундуками. ID продавца параметром не передаётся: при нескольких предложениях используется последнее.
  • В менеджере предложение хранится в игровом сеансе. Закрытие графического клиента сохраняет предложение и черновик, открытие восстанавливает окно. Закрытие самого магазина, ответ, закрытие сервером или разрыв соединения убирают предложение. Автопокупка/автопродажа Bad Newbie может обработать его раньше скрипта.
  • Чтение не отправляет запросов серверу. Это снимок уже полученного предложения, не гарантия текущего запаса NPC. Поле количества отражает единицы, а не число строк/стопок. ArrayLength(rows) считает позиции. Цены здесь читает GetShopList; SendShopReply не принимает цену.
  • Явный список заменяет черновик, не прибавляется к нему. Повтор одного serial суммирует количество; итог ограничен полным количеством позиции в предложении. Неизвестный serial, неверное или неположительное количество отклоняют весь ответ до отправки, сохраняя предложение. При отсутствии предложения SendShopReply сообщает об ошибке. Строка "0" не является командой отмены; используйте "".

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

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

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

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

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

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

1. Разобрать первую позицию — прямой скрипт

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

  • GetWord использует индекс от 0: 0 — serial, 1 — graphic, 2 — hue, 3 — количество, 4 — цена. Перед rows[0] проверяется длина массива.
var rows = UO.GetShopList();
if (Truth(ArrayLength(rows) == 0))
{
    return null;
}
var serial = ReadField(rows[0], 0, "|");
var itemType = ReadField(rows[0], 1, "|");
var amount = Convert.ToInt32(ReadField(rows[0], 3, "|"));
var price = Convert.ToDouble(ReadField(rows[0], 4, "|"));
UO.Print(serial + " / " + itemType + " / " + Convert.ToString(amount) + " / " + Convert.ToString(price));

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;

string ReadField(object? row, int index, string separator) { string[] fields = (Convert.ToString(row) ?? "").Split(new[] { separator }, StringSplitOptions.None); return index >= 0 && index < fields.Length ? fields[index] : ""; }

2. Купить до десяти бинтов по ограниченной цене — функция сценария

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

  • Только для заранее открытого предложения ПОКУПКИ. 0x0E21 — бинты, 5 — максимальная цена единицы, 10 — нужное количество. Берётся первая подходящая позиция; точный serial читается из предложения. Код не начинает покупку сам.
return  RunScenario();
 object? RunScenario()
{
    var rows = UO.GetShopList();
    for (int i = (int)(0); i <= ArrayLength(rows) - 1; i += (int)(1))
    {
        var row = rows[i];
        if (Truth(ReadField(row, 1, "|") == "0x0E21"))
        {
            var price = Convert.ToDouble(ReadField(row, 4, "|"));
            var amount = Convert.ToInt32(ReadField(row, 3, "|"));
            if (Truth(price > 0) && Truth(price <= 5) && Truth(amount > 0))
            {
                if (Truth(amount > 10))
                {
                    amount = 10;
                }

                UO.SendShopReply(ReadField(row, 0, "|") + ":" + Convert.ToString(amount));
                return null;
            }
        }
    }

    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;
string ReadField(object? row, int index, string separator)
{
    string[] fields = (Convert.ToString(row) ?? "").Split(new[] { separator }, StringSplitOptions.None);
    return index >= 0 && index < fields.Length ? fields[index] : "";
}

3. Посчитать доступный запас выбранного типа — класс сценария

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

  • Вспомогательная функция приведена полностью: суммирует поле amount всех позиций указанного типа. При пустом предложении возвращает 0; это количество доступных единиц, не число животных или предметов на персонаже.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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 available = CountOfferedType("0x0E21");
        if (Truth(available < 10))
        {
            UO.Print("Bandage stock below 10: " + Convert.ToString(available));
        }

        return null;
    }

    dynamic CountOfferedType(dynamic itemType)
    {
        var total = 0;
        var rows = UO.GetShopList();
        for (int i = (int)(0); i <= ArrayLength(rows) - 1; i += (int)(1))
        {
            if (Truth(ReadField(rows[i], 1, "|") == itemType))
            {
                total = total + Convert.ToInt32(ReadField(rows[i], 3, "|"));
            }
        }

        return total;
    }

    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;
    string ReadField(object? row, int index, string separator)
    {
        string[] fields = (Convert.ToString(row) ?? "").Split(new[] { separator }, StringSplitOptions.None);
        return index >= 0 && index < fields.Length ? fields[index] : "";
    }
}

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

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

UO.GetShopList() — UO.GetShopList()

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

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

При вызове:

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

public InjectionValue GetShopList()

            => new InjectionValue((bridge.GetShopList() ?? Array.Empty<string>()).Select(item => new InjectionValue(item)).ToArray());

UO.MassPriceMove

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

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

void UO.MassPriceMove();
void UO.MassPriceMove(object? delay, object? quantity, object? @type, object? price);
void UO.MassPriceMove(object? delay, object? quantity, object? @type, object? price, object? destination);
void UO.MassPriceMove(object? delay, object? quantity, object? @type, object? price, object? destination, object? x, object? y, object? z);

Включает массовый перенос предметов одного TYPE с автоматическим назначением цены в инвентаре своего вендора. Источник определяется первым ручным переносом. Каждый стек переносится целиком и считается одним item; после его запроса цены клиент отвечает и только затем продолжает очередь.

Параметры

  • delay — Первый параметр — задержка между запросами переноса в миллисекундах, целое число от 0 до 2147483647. 350 означает 0,35 секунды. При 0 отправляется не более одного очередного переноса за игровой кадр. Задержка не добавляется к GrabDelay. Отрицательное значение выключает режим и очищает очередь; для выключения предпочтительна ясная запись UO.MassPriceMove().
  • quantity — Второй параметр — ОБЩИЙ предел отдельных предметов-объектов (items), включая первый ручной перенос. Один стек/стопка считается одним item независимо от количества внутри. 50 означает до 50 целых стопок либо 50 одиночных предметов. Стек по этому лимиту НЕ разделяется. 0 — все подходящие items. Отрицательные значения недопустимы.
  • type — Третий параметр — код типа предмета (Graphic/Type), целое 0..65535, например 0x0EED или строка "0x0EED" для золота. Это НЕ serial/ID и НЕ имя AddObject. 0 определяет тип по первому ручному переносу. При явном типе перетаскивание другого типа не активирует очередь; режим продолжает ждать подходящий предмет.
  • price — Четвёртый обязательный параметр — целая цена 0..2147483647 за каждый полный выставляемый item/стек. 0 означает бесплатно, не выключение. Отрицательная цена отклоняется.
  • destination — Пятый необязательный параметр — serial или сохранённое имя контейнера в инвентаре вашего вендора. При отсутствии берётся из ручного сброса. Обычный рюкзак, сундук на земле и destination=0 здесь отклоняются: на земле цену назначить невозможно.
  • x — Шестой параметр — X внутри контейнера вендора: -1 или 65535 для автоматического размещения, иначе 0..65535. Указывается только вместе с Y и Z.
  • y — Седьмой параметр — Y внутри контейнера вендора: -1/65535 для автоматического размещения, иначе 0..65535. Указывается только вместе с X и Z.
  • z — Восьмой параметр — высота -128..127, внутри контейнера обычно 0. Без явных X/Y/Z при заданном destination используются -1,-1,0; при ручном назначении берётся место сброса.

Возвращает

void: значения нет. Activate MassPriceMove включает ожидание ручного образца. Сообщения о переносе и цене означают отправленные запросы, а не гарантию принятия сервером.

Поведение

  • Формы с 0, 4, 5 или 8 аргументами. Точный порядок: delay, quantity, type, price, destination, x, y, z. Неполные тройки координат не поддерживаются.
  • Сначала вызовите команду, затем возьмите и перетащите подходящий предмет целиком. Тип 0 запоминает его TYPE; явный тип пропускает ручные переносы других типов. Источник всегда берётся из первого подходящего предмета.
  • Количество включает первый ручной item. 50 означает 50 полных стопок из 100, а не 50 единиц из стопки. 0 — все подходящие прямые предметы. Цвет не фильтруется, вложенные контейнеры не раскрываются.
  • Применяются правила распознавания запроса цены AllPrice, включая ASCII/Unicode и 10-секундное ожидание. Пауза delay — минимальный интервал: медленный сервер увеличивает его, чтобы не перепутать цены.
  • Общий режим AllPrice включать не требуется. Цена этой операции имеет приоритет над AllPrice. Изменять цену AllPrice или вручную перекладывать дополнительные товары во время очереди не рекомендуется: неизвестный ответ или отказ сервера прерывает очередь.
  • MassPriceMove() выключает текущую очередь переноса и отменяет ожидающий ответ цены; общий AllPrice, если он был включён отдельно, сохраняется. TerminateAll() выключает оба режима. Это одна общая очередь с MassMove: новая активация заменяет старую.
  • Если запрос цены не распознан, команда оставляет диалог для ручного ввода и прекращает дальнейшие переносы. Серверный отказ, смерть, смена карты и недоступный предмет/контейнер также прекращают работу.
  • Повторный корректный вызов этой же команды, пока режим ещё ждёт первого переноса мышью, выключает ожидание: Deactivate MassMove/MassPriceMove появляется прямо в игровом окне. Следующий вызов снова включает режим. После первого переноса для остановки оставшейся очереди используйте форму без аргументов. Уже отправленные запросы не откатываются.

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

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

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

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

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

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

1. Перенести 50 стопок с ценой, определяя тип мышью — прямой скрипт

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

  • delay=350 мс; quantity=50 отдельных items, включая первый ручной; type=0 запоминает TYPE образца; price=125 за каждый item целиком.
  • destination и координаты отсутствуют: перетащите образец именно в инвентарь своего вендора.
  • Если исходных стопок 100, переносятся максимум 50 полных стопок. Каждая получает цену 125 после запроса сервера.
UO.MassPriceMove(350, 50, 0, 125);
UO.Print("Drag one complete stack into your vendor bag");

2. Все предметы известного типа в выбранную сумку вендора — функция сценария

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

  • AddObject предлагает выбрать сумку вендора и сохраняет её как vendor_bag. Это ID назначения; type остаётся кодом 0x0F7A.
  • delay=500, quantity=0 без лимита, type=0x0F7A, price=250, destination=vendor_bag.
  • X/Y/Z отсутствуют: -1,-1,0. Для запуска очереди вручную перетащите один предмет соответствующего типа; из него определяется исходная сумка.
return  RunScenario();
 object? RunScenario()
{
    UO.AddObject("vendor_bag");
    UO.MassPriceMove(500, 0, "0x0F7A", 250, "vendor_bag");
    UO.Print("Now drag one matching item from the source");
    return null;
}

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

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

  • delay=350 мс; quantity=10 полных items; type=itemType=0x0EED; price=1000 за каждый полный стек.
  • destination=vendorBag — реальный ID сумки вашего вендора, замените пример. Это пятый параметр, а не четвёртый.
  • x=60, y=70 — место внутри этой сумки, z=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 itemType = "0x0EED";
        var vendorBag = "0x40005678";
        UO.MassPriceMove(350, 10, itemType, 1000, vendorBag, 60, 70, 0);
        return null;
    }
}

4. Отменить очередь и ожидающий ответ цены — прямой скрипт

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

  • Без аргументов команда выключает общую очередь массового переноса и очищает её отложенный ответ цены.
  • Цены и переносы, уже принятые сервером, не откатываются. Для остановки остальных процедур и отдельно включённого AllPrice используйте UO.TerminateAll().

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

UO.MassPriceMove();

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

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

UO.MassPriceMove() — UO.MassPriceMove()

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

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

При вызове:

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

case "masspricemove":

                    if (arguments.Length == 0) bridge.MassPriceMove(-1, 0, 0, 0, -1, -1, -1, 0);

                    else bridge.MassPriceMove(NumberConversions.ToInt(arguments[0]),

                        NumberConversions.ToInt(arguments[1]), ResolveType(arguments[2]),

                        NumberConversions.ToInt(arguments[3]),

                        arguments.Length > 4 ? ResolveTransferDestination(arguments[4], true) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : -1,

                        arguments.Length > 7 ? NumberConversions.ToInt(arguments[7]) : 0);

                    break;

UO.MassPriceMove(delay, quantity, type, price) — UO.MassPriceMove(Any,Any,Any,Any)

Параметры: delay (Any), quantity (Any), type (Any), price (Any)

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

При вызове:

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

case "masspricemove":

                    if (arguments.Length == 0) bridge.MassPriceMove(-1, 0, 0, 0, -1, -1, -1, 0);

                    else bridge.MassPriceMove(NumberConversions.ToInt(arguments[0]),

                        NumberConversions.ToInt(arguments[1]), ResolveType(arguments[2]),

                        NumberConversions.ToInt(arguments[3]),

                        arguments.Length > 4 ? ResolveTransferDestination(arguments[4], true) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : -1,

                        arguments.Length > 7 ? NumberConversions.ToInt(arguments[7]) : 0);

                    break;

UO.MassPriceMove(delay, quantity, type, price, destination) — UO.MassPriceMove(Any,Any,Any,Any,Any)

Параметры: delay (Any), quantity (Any), type (Any), price (Any), destination (Any)

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

При вызове:

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

case "masspricemove":

                    if (arguments.Length == 0) bridge.MassPriceMove(-1, 0, 0, 0, -1, -1, -1, 0);

                    else bridge.MassPriceMove(NumberConversions.ToInt(arguments[0]),

                        NumberConversions.ToInt(arguments[1]), ResolveType(arguments[2]),

                        NumberConversions.ToInt(arguments[3]),

                        arguments.Length > 4 ? ResolveTransferDestination(arguments[4], true) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : -1,

                        arguments.Length > 7 ? NumberConversions.ToInt(arguments[7]) : 0);

                    break;

UO.MassPriceMove(delay, quantity, type, price, destination, x, y, z) — UO.MassPriceMove(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: delay (Any), quantity (Any), type (Any), price (Any), destination (Any), x (Any), y (Any), z (Any)

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

При вызове:

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

case "masspricemove":

                    if (arguments.Length == 0) bridge.MassPriceMove(-1, 0, 0, 0, -1, -1, -1, 0);

                    else bridge.MassPriceMove(NumberConversions.ToInt(arguments[0]),

                        NumberConversions.ToInt(arguments[1]), ResolveType(arguments[2]),

                        NumberConversions.ToInt(arguments[3]),

                        arguments.Length > 4 ? ResolveTransferDestination(arguments[4], true) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : -1,

                        arguments.Length > 7 ? NumberConversions.ToInt(arguments[7]) : 0);

                    break;

UO.Sell

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

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

void UO.Sell(object? @type);
void UO.Sell(object? @type, object? color);
void UO.Sell(object? @type, object? color, object? quantity);

Создаёт, обновляет либо удаляет правило автоматической продажи в основном списке Default текущего профиля Bad Newbie. Команда настраивает будущую обработку предложения NPC-продавца; сама не произносит buy/sell, не открывает магазин и не подтверждает сделку. Полный порядок действий: списки магазина.

Параметры

  • type — Graphic товара 0..65535: например 0x0F7A — Black Pearl, 0x0F51 — кинжал. Это не serial продавца/предмета и не body персонажа. Отрицательное число или число больше 65535 отвергается. Здесь 0xFFFF — конкретный graphic, не маска всех товаров.
  • color — Hue товара: отрицательное число либо 0xFFFF — любой; 0 — только неокрашенные предметы. Для точного hue используйте 0..65534. Цвета вне этого диапазона не используйте: положительное значение преобразуется к ushort. По умолчанию -1.
  • quantity — Количество ЕДИНИЦ товара на одно полученное предложение магазина, не число стопок и не желаемый остаток в рюкзаке. Положительное ограничивается 65535. 0/отрицательное удаляет совпадающее правило type+color из Default; это не «всё количество». По умолчанию 1.

Возвращает

void — значения нет. Вызывайте отдельной строкой, без var result = и без if. Окончание вызова означает окончание настройки, а не успешную сделку. При отсутствии профиля или недопустимом graphic правило не создаётся; числового результата ошибки нет. Фактическую сделку проверяйте по содержимому рюкзака, золоту и ответу сервера.

Поведение

  • Sell принимает от 1 до 3 аргументов; пропущенные справа color=-1, quantity=1.
  • Ключ правила — graphic и маска hue в Default. Повторный вызов заменяет количество и остальные поля этого правила; он не добавляет ещё один лимит поверх предыдущего. Без цены/имени прежние ограничения этих полей снимаются.
  • Новое/обновлённое правило Enabled=true. Общий переключатель покупки/продажи устанавливается по наличию правил, профиль сохраняется. Сам выключенный Default-список автоматически не включается: в настройках должны быть включены и общий режим, и список. Другие именованные списки не изменяются.
  • Обработка начинается при поступлении списка товаров. Лимит расходуется суммарно по строкам, сопоставленным одному правилу. Для каждой позиции используется первое подходящее включённое правило. Повторное открытие магазина даёт новое предложение и новый лимит, пока правило активно.
  • Работает в Full с Bad Newbie; в Classic эта автоматизация отключена. Не подставляйте в параметры имя NPC или название сохранённого списка. AutoBuyEx добавляет фильтры цены/имени при покупке; ClearShopList сбрасывает обе автоматизации целиком.

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

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

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

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

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

UO.Print("Calling UO.Sell");
UO.Sell(0x0F51);

1. Разрешить продажу одного кинжала — прямой скрипт

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

  • 0x0F51 — graphic кинжала, любой hue, 1 — единица за одно предложение. Команда не выбирает конкретный serial и не проверяет полезность/ценность вещи. Выберите точный type/color своего товара.
UO.Sell(0x0F51);

2. Продавать только робу определённой окраски — функция сценария

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

  • 0x1F03 — пример стандартного graphic робы, 0x0044 — пример hue. Замените оба на свой товар. 5 — единицы, не цена; параметры минимальной цены и имени Sell/AutoSell не принимают. Сервер должен включить вещь в предложение продажи.
return  RunScenario();
 object? RunScenario()
{
    UO.Sell(0x1F03, 0x0044, 5);
    return null;
}

3. Отключить продажу двух типов перед походом к NPC — класс сценария

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

  • Имя процедуры произвольное; itemType и hue — её параметры. Другие правила, покупка и пользовательские именованные списки сохраняются. Если другой включённый список тоже продаёт эти предметы, отключите соответствующее правило в нём через настройки.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

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()
    {
        RemoveSaleRule(0x0F51, -1);
        RemoveSaleRule(0x1F03, 0x0044);
        return null;
    }

    void RemoveSaleRule(dynamic itemType, dynamic hue)
    {
        UO.Sell(itemType, hue, 0);
    }
}

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

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

UO.Sell(type) — UO.Sell(Any)

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

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

При вызове:

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

case "sell":

                    bridge.SetAutoSellRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1);

                    break;

UO.Sell(type, color) — UO.Sell(Any,Any)

Параметры: type (Any), color (Any)

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

При вызове:

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

case "sell":

                    bridge.SetAutoSellRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1);

                    break;

UO.Sell(type, color, quantity) — UO.Sell(Any,Any,Any)

Параметры: type (Any), color (Any), quantity (Any)

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

При вызове:

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

case "sell":

                    bridge.SetAutoSellRule(Arg(0), arguments.Length > 1 ? Arg(1) : -1, arguments.Length > 2 ? Arg(2) : 1);

                    break;

UO.SendShopReply

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

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

void UO.SendShopReply(object? reply);

Отправляет выбор товаров последнему активному предложению NPC-продавца. Направление сделки определяется предложением: покупка у NPC или продажа ему.

Параметры

  • reply — Строка: "serial:quantity"; несколько позиций разделяются |, ; или запятой. Вместо : допустим =. Serial — ID позиции из GetShopList, десятичный или 0x, не graphic и не ID продавца. Quantity — положительное целое число единиц, не число стопок; без него берётся 1. "accept" без учёта регистра или "1" подтверждает черновик окна; пустая строка отменяет сделку пустым ответом.

Возвращает

void — возвращаемого значения нет: ни true/false, ни сумма, ни подтверждение покупки. Сервер решает, допустима ли сделка. После отправки проверьте обновлённые предметы, золото или сообщение сервера.

Поведение

  • Сначала обычным игровым действием откройте покупку или продажу у нужного NPC и дождитесь предложения сервера. Эти команды сами не ищут продавца, не открывают торговлю, не задают цену личному vendor и не переносят вещи между сундуками. ID продавца параметром не передаётся: при нескольких предложениях используется последнее.
  • В менеджере предложение хранится в игровом сеансе. Закрытие графического клиента сохраняет предложение и черновик, открытие восстанавливает окно. Закрытие самого магазина, ответ, закрытие сервером или разрыв соединения убирают предложение. Автопокупка/автопродажа Bad Newbie может обработать его раньше скрипта.
  • Чтение не отправляет запросов серверу. Это снимок уже полученного предложения, не гарантия текущего запаса NPC. Поле количества отражает единицы, а не число строк/стопок. ArrayLength(rows) считает позиции. Цены здесь читает GetShopList; SendShopReply не принимает цену.
  • Явный список заменяет черновик, не прибавляется к нему. Повтор одного serial суммирует количество; итог ограничен полным количеством позиции в предложении. Неизвестный serial, неверное или неположительное количество отклоняют весь ответ до отправки, сохраняя предложение. При отсутствии предложения SendShopReply сообщает об ошибке. Строка "0" не является командой отмены; используйте "".

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

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

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

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

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

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

1. Выбрать до трёх единиц первой позиции — прямой скрипт

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

  • Выбираются до 3 единиц первой позиции; serial не захардкожен. Для предложения покупки это покупка, для предложения продажи — продажа. Проверьте, какое предложение вы открыли.
var rows = UO.GetShopList();
if (Truth(ArrayLength(rows) == 0))
{
    return null;
}
var amount = Convert.ToInt32(ReadField(rows[0], 3, "|"));
if (Truth(amount > 3))
{
    amount = 3;
}
if (Truth(amount > 0))
{
    UO.SendShopReply(ReadField(rows[0], 0, "|") + ":" + Convert.ToString(amount));
}

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;

string ReadField(object? row, int index, string separator) { string[] fields = (Convert.ToString(row) ?? "").Split(new[] { separator }, StringSplitOptions.None); return index >= 0 && index < fields.Length ? fields[index] : ""; }

2. Выбрать по одной позиции в пределах бюджета — функция сценария

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

  • Только для предложения ПОКУПКИ: бюджет 30, тип 0x0E21. Из каждой подходящей позиции выбирается одна единица, если цена положительная и укладывается в оставшийся бюджет. Строка объединяется через |; один SendShopReply отправляет весь выбор.
return  RunScenario();
 object? RunScenario()
{
    double budget = 30;
    var reply = "";
    var rows = UO.GetShopList();
    for (int i = (int)(0); i <= ArrayLength(rows) - 1; i += (int)(1))
    {
        var row = rows[i];
        if (Truth(ReadField(row, 1, "|") == "0x0E21"))
        {
            var price = Convert.ToDouble(ReadField(row, 4, "|"));
            var amount = Convert.ToInt32(ReadField(row, 3, "|"));
            if (Truth(price > 0) && Truth(price <= budget) && Truth(amount > 0))
            {
                if (Truth(reply != ""))
                {
                    reply = reply + "|";
                }

                reply = reply + ReadField(row, 0, "|") + ":1";
                budget = budget - price;
            }
        }
    }

    if (Truth(reply != ""))
    {
        UO.SendShopReply(reply);
    }

    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;
string ReadField(object? row, int index, string separator)
{
    string[] fields = (Convert.ToString(row) ?? "").Split(new[] { separator }, StringSplitOptions.None);
    return index >= 0 && index < fields.Length ? fields[index] : "";
}

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

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

  • Предварительно выберите количества в окне магазина. "accept" отправляет именно этот черновик; после закрытия игрового окна он сохраняется. Если ничего не выбрано, отправится пустой ответ. "1" — синоним подтверждения, не serial предмета.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SendShopReply("accept");
        return null;
    }
}

4. Отменить предложение — прямой скрипт

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

  • Пустая строка отправляет пустой ответ и закрывает активное предложение. Проверка GetShopList избегает вызова при отсутствии товаров, но пустое предложение отдельно от отсутствующего она не различает.

Shop lists / Списки покупки и продажи

Shop lists / Списки покупки и продажи

if (Truth(ArrayLength(UO.GetShopList()) > 0))
{
    UO.SendShopReply("");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

UO.SendShopReply(reply) — UO.SendShopReply(Any)

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

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

При вызове:

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

public void SendShopReply(InjectionValue reply) => bridge.SendShopReply(reply.ToString());

UO.SetAutoBuyDelay

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

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

void UO.SetAutoBuyDelay(object? value);

Устанавливает задержку автоматической покупки и сохраняет текущий профиль.

Параметры

  • value — Обязательное число миллисекунд. Отрицательное значение ограничивается 0, значение больше 65535 — числом 65535. 0 отключает дополнительную задержку, но не отключает саму автоматическую торговлю.

Возвращает

void — нет возвращаемого значения. Вызывайте отдельной строкой, затем используйте GetAutoBuyDelay() для чтения действующей настройки. При отсутствии профиля setter ничего не сохраняет; getter в этом состоянии даёт стандартные 3 мс.

Поведение

  • Настройка общая для текущего профиля: изменения в другом скрипте или UI видны при следующем чтении. Ноль — действующая настройка, не признак отсутствия данных и не повод возвращать старый кэш скрипта.
  • Значение по умолчанию — 3 мс. После отправки автоматической операции менеджер задаёт время следующей разрешённой операции. Списки вендора, пришедшие раньше, не обрабатываются этим проходом; getter не запускает ожидание и сам не отправляет покупку/продажу.
  • Это не задержка MassMove, Drag/Drop или ручной торговли. Новое значение применяется при планировании следующей задержки; уже назначенный момент не пересчитывается.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SetAutoBuyDelay");
UO.SetAutoBuyDelay(350);

1. Установить интервал 350 мс — прямой скрипт

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

  • Value=350 — миллисекунды между разрешёнными автоматическими операциями.
  • Настройка сохраняется в текущем профиле и видна другим скриптам.
UO.SetAutoBuyDelay(350);
UO.Print(Convert.ToString(UO.GetAutoBuyDelay()));

2. Убрать дополнительную задержку — функция сценария

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

  • Value=0 имеет самостоятельный смысл; не подменяется предыдущим ненулевым значением.
  • Меняется только задержка. Правила, списки и общий выключатель автоматической торговли задаются отдельно.
return  RunScenario();
 object? RunScenario()
{
    UO.SetAutoBuyDelay(0);
    var actual = UO.GetAutoBuyDelay();
    if (Truth(actual == 0))
    {
        UO.Print("Delay disabled");
    }

    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. Применить рассчитанное значение — класс сценария

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

  • requested=70000 превышает максимум. applied читает профиль после ограничений setter.
  • При загруженном профиле получится 65535. Для возврата к стандартной задержке явно вызовите setter с 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 requested = 70000;
        UO.SetAutoBuyDelay(requested);
        var applied = UO.GetAutoBuyDelay();
        UO.Print("Requested: " + Convert.ToString(requested));
        UO.Print("Applied: " + Convert.ToString(applied));
        return null;
    }
}

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

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

UO.SetAutoBuyDelay(value) — UO.SetAutoBuyDelay(Any)

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

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

При вызове:

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

case "setautobuydelay":

                    state.AutoBuyDelay = Math.Max(0, Arg(0));

                    bridge.SetAutoBuyDelay(state.AutoBuyDelay);

                    return InjectionValue.Unit;

UO.SetAutoSellDelay

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

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

void UO.SetAutoSellDelay(object? value);

Устанавливает задержку автоматической продажи и сохраняет текущий профиль.

Параметры

  • value — Обязательное число миллисекунд. Отрицательное значение ограничивается 0, значение больше 65535 — числом 65535. 0 отключает дополнительную задержку, но не отключает саму автоматическую торговлю.

Возвращает

void — нет возвращаемого значения. Вызывайте отдельной строкой, затем используйте GetAutoSellDelay() для чтения действующей настройки. При отсутствии профиля setter ничего не сохраняет; getter в этом состоянии даёт стандартные 3 мс.

Поведение

  • Настройка общая для текущего профиля: изменения в другом скрипте или UI видны при следующем чтении. Ноль — действующая настройка, не признак отсутствия данных и не повод возвращать старый кэш скрипта.
  • Значение по умолчанию — 3 мс. После отправки автоматической операции менеджер задаёт время следующей разрешённой операции. Списки вендора, пришедшие раньше, не обрабатываются этим проходом; getter не запускает ожидание и сам не отправляет покупку/продажу.
  • Это не задержка MassMove, Drag/Drop или ручной торговли. Новое значение применяется при планировании следующей задержки; уже назначенный момент не пересчитывается.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SetAutoSellDelay");
UO.SetAutoSellDelay(350);

1. Установить интервал 350 мс — прямой скрипт

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

  • Value=350 — миллисекунды между разрешёнными автоматическими операциями.
  • Настройка сохраняется в текущем профиле и видна другим скриптам.
UO.SetAutoSellDelay(350);
UO.Print(Convert.ToString(UO.GetAutoSellDelay()));

2. Убрать дополнительную задержку — функция сценария

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

  • Value=0 имеет самостоятельный смысл; не подменяется предыдущим ненулевым значением.
  • Меняется только задержка. Правила, списки и общий выключатель автоматической торговли задаются отдельно.
return  RunScenario();
 object? RunScenario()
{
    UO.SetAutoSellDelay(0);
    var actual = UO.GetAutoSellDelay();
    if (Truth(actual == 0))
    {
        UO.Print("Delay disabled");
    }

    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. Применить рассчитанное значение — класс сценария

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

  • requested=70000 превышает максимум. applied читает профиль после ограничений setter.
  • При загруженном профиле получится 65535. Для возврата к стандартной задержке явно вызовите setter с 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 requested = 70000;
        UO.SetAutoSellDelay(requested);
        var applied = UO.GetAutoSellDelay();
        UO.Print("Requested: " + Convert.ToString(requested));
        UO.Print("Applied: " + Convert.ToString(applied));
        return null;
    }
}

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

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

UO.SetAutoSellDelay(value) — UO.SetAutoSellDelay(Any)

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

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

При вызове:

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

case "setautoselldelay":

                    state.AutoSellDelay = Math.Max(0, Arg(0));

                    bridge.SetAutoSellDelay(state.AutoSellDelay);

                    return InjectionValue.Unit;

UO.Shop

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

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

void UO.Shop();

Печатает локальный список торговых строк.

Параметры

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

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias читает bridge.GetShopList и соединяет строки через " | " для SystemMessage. Меню продавца не открывается, покупка/продажа не выполняется.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

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

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

  • Печатает локальный список торговых строк.
UO.Shop();

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

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

  • ExecuteLegacyManualAlias читает bridge.GetShopList и соединяет строки через " | " для SystemMessage. Меню продавца не открывается, покупка/продажа не выполняется.
return  RunScenario();
 object? RunScenario()
{
    UO.Shop();
    UO.Print(UO.GetArrayLength(UO.GetShopList()));
    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.Shop();
        UO.TextOpen();
        UO.TextPrint("Shop list was printed in the journal");
        return null;
    }
}

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

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

UO.Shop() — UO.Shop()

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

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

При вызове:

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

case "shop": SystemMessage(string.Join(" | ", bridge.GetShopList())); break;

UO.VendorMenu

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

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

void UO.VendorMenu(object? vendor);
void UO.VendorMenu(object? menu, object? choice);

Использует продавца либо регистрирует постоянный menu hook.

Параметры

  • vendor — Форма с одним аргументом: serial/алиас объекта продавца.
  • menu — Форма с двумя аргументами: заголовок и элемент menu, оба как текст. Это другая операция; первый аргумент не serial.
  • choice — Форма с двумя аргументами: заголовок и элемент menu, оба как текст. Это другая операция; первый аргумент не serial.

Возвращает

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

Поведение

  • Один аргумент вызывает bridge.UseObject. Два аргумента вызывают bridge.AddMenuHook(menu,choice,true), где true означает повторяемый hook.
  • Не выполняет покупку или продажу автоматически. Открытие и выбор меню определяются сервером; зарегистрированный hook действует на следующие подходящие меню до отмены.
  • Для форм menu/choice менеджер выбирает первое меню, заголовок которого содержит prompt без учёта регистра; SessionMenu выбирает первый пункт, имя которого содержит choice так же без учёта регистра. Пустой текст подходит любому; числовой текст — фрагмент имени, не индекс. Успешный выбор отправляет ответ и закрывает локальное меню. Одноразовый hook удаляется только после успешного выбора, постоянный остаётся.

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

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

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

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

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

UO.Print("Calling UO.VendorMenu");
UO.VendorMenu("lasttarget");

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

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

  • Использует продавца либо регистрирует постоянный menu hook.
if (Truth(UO.Exists("lasttarget")))
{
    UO.VendorMenu("lasttarget");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Один аргумент вызывает bridge.UseObject. Два аргумента вызывают bridge.AddMenuHook(menu,choice,true), где true означает повторяемый hook.
return  RunScenario();
 object? RunScenario()
{
    UO.VendorMenu("Vendor", "Buy");
    return null;
}

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

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

  • Не выполняет покупку или продажу автоматически. Открытие и выбор меню определяются сервером; зарегистрированный hook действует на следующие подходящие меню до отмены.
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.VendorMenu("Vendor", "Buy");
        UO.Print(UO.MenuHookPresent());
        UO.CancelMenu();
        return null;
    }
}

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

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

UO.VendorMenu(vendor) — UO.VendorMenu(Any)

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

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

При вызове:

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

case "vendormenu":

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

                    else bridge.UseObject(Arg(0, bridge.LastTarget));

                    break;

UO.VendorMenu(menu, choice) — UO.VendorMenu(Any,Any)

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

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

При вызове:

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

case "vendormenu":

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

                    else bridge.UseObject(Arg(0, bridge.LastTarget));

                    break;
⚠️ **GitHub.com Fallback** ⚠️