Skip to content

RU UO Topic combat

Codex edited this page Oct 12, 2026 · 4 revisions

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

Бой

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

Атака, режим боя, оружейные способности и лечение бинтом. Запрос клиента и принятое сервером действие различаются.

Разделы

Тема Команды и пояснения
Attack UO.Attack
AttackNearest UO.AttackNearest
LastAttack UO.LastAttack
WarMode UO.WarMode
WarTarget UO.WarTargetID
Способности оружия UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility
Primary Ability UO.UsePrimaryAbility
Secondary Ability UO.UseSecondaryAbility
Special Moves UO.Specmove
BandageSelf UO.BandageSelf

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

Attack

UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID

Способности оружия

UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove

BandageSelf

UO.BandageSelf

Пользовательские классы экипировки

UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest

Названия групп и типы надетых вещей задаются скриптом; порядок имён через | задаёт приоритет.

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

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

UO.Attack

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

var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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;

UO.GetWeaponAbilities

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

var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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


UO.Attack

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

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

void UO.Attack(object? objID);

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

Параметры

  • objID — Serial mobile: int, десятичная/hex-строка либо разрешаемое имя объекта (например lasttarget или имя AddObject). Не graphic/type и не название класса. Обязательный аргумент; 0 не является командой остановки боя. Для выбора цели без её ID используйте поиск или игровой target.

Возвращает

void — значения нет. Пишите UO.Attack(enemy) отдельной строкой, не var result=UO.Attack(...). Завершение вызова не подтверждает попадание, урон или согласие сервера.

Поведение

  • Сам по себе вызов не отбрасывает мёртвых, далёких, self, союзников, пустой serial или предметы. Проверяйте выбранную цель; предпочтительнее отфильтрованный mobile из GetMobiles/FindMan.
  • Используется штатный GameActions.Attack: возможен вопрос о криминальной атаке при EnabledCriminalActionQuery. При обычном ходе обновляются LastAttack/NewTargetSystemSerial и отправляется пакет запроса атаки.
  • Команда не включает WarMode отдельно, не выполняет двойной клик мышью, не прокладывает маршрут, не запускает цикл повторных атак. Обработка боевого режима и дальнейшего боя зависит от сервера.
  • Для строки неизвестного объектного имени возможна ошибка разрешения. Проверка Exists доказывает наличие объекта, но не то, что это mobile; GetMobiles выдаёт именно mobiles.

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

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

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

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

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

UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());

1. Атаковать последнюю выбранную живую цель после проверки — прямой скрипт

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

  • lasttarget может быть предметом или дружественным персонажем. Список allowed исключает эти случаи; Attack вызывается максимум один раз.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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;

2. Сначала найти Enemy, затем атаковать при доступной высоте — функция сценария

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

  • FindMan возвращает serial и не атакует. Проверка IsDead добавлена отдельно, потому что у FindMan нет aliveOnly.
return  RunScenario();
 object? RunScenario()
{
    var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
    if (Truth(enemy == 0))
    {
        return null;
    }

    if (Truth(UO.IsDead(enemy) == 0))
    {
        UO.AddObject("enemy", enemy);
        UO.Attack(enemy);
    }

    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. Ближайшая цель с отдельной проверкой геометрии — класс сценария

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

  • GetMobiles уже упорядочен nearest=true. Если перед первой целью стена, проверяется следующая; наличие visibleOnly само по себе не заменяет CheckLOS. Серверная проверка может отличаться.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
        var i = 0;
        while (Truth(i < ArrayLength(targets)))
        {
            var enemy = targets[i];
            if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
            {
                UO.Attack(enemy);
                return null;
            }

            i += 1;
        }

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

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

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

UO.Attack(objID) — UO.Attack(Any)

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

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

При вызове:

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

case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;

UO.Attack(objID) — UO.Attack(Integer)

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

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

При вызове:

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

public void Attack(int id) => bridge.Attack(id);

UO.Attack(objID) — UO.Attack(String)

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

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

При вызове:

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

public void Attack(string id) => Attack(GetObject(id));

UO.AttackNearest

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

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

int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);

Выбирает одну подходящую боевую цель и передаёт её обработчику атаки. Фильтры ограничивают допустимых персонажей; пользовательский classMask задаёт экипировку и приоритет классов, nearest — выбор внутри класса.

Параметры

  • notoriety — Статус отношения к персонажу, полученный от сервера: 0 — неизвестный, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 — Invulnerable. Число означает один статус; "5|6" или массив чисел — любой из перечисленных. Это не цвет одежды и не класс. Отрицательное число (обычно -1), 0xFFFF, "any", пустая строка или пустой массив отдельно отключают этот фильтр. Некорректная строка без допустимых чисел не находит никого. Порядок статусов приоритет не задаёт. Фильтр 5 выбирает Enemy, а не автоматически любого NPC/монстра; реальные значения зависят от сервера.
  • distance — Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются.
  • body — Graphic тела персонажа/NPC, не ID конкретного персонажа и не type надетой брони. Число, hex-строка, строка "0x0190|0x0191" или массив чисел. 0x0190 (400) — мужчина-человек; 0x0191 (401) — женщина-человек. Маска объединяет оба тела. Список не включает автоматически другие расы, призраков или превращения; таблица стандартных графических типов тела. Отрицательное число (-1 по умолчанию), 0xFFFF, "any", пустая строка или пустой массив отдельно — любое тело. Неизвестный текст без допустимого числа даёт пустой результат.
  • maxZ — Максимум abs(Z цели - Z своего персонажа) включительно, в единицах Z мира. Это не число этажей и не клетки X/Y. maxZ=4 при Z игрока 10 допускает Z цели 6..14; 0 требует ровно одинаковую высоту. По умолчанию/при отрицательном числе берётся UO.FindVertical(). На лестнице равная Z может исключить нужную цель. Даже малая разность Z не доказывает доступность этажа.
  • nearest — true/1 по умолчанию выбирает ближайшего подходящего персонажа; равное расстояние разрешается меньшим serial. false/0 сохраняет первый подходящий объект в порядке списка клиента, не выбирает самого дальнего. При classMask сначала действует приоритет класса, затем расстояние внутри класса.
  • color — Hue самого mobile: int или числовая/hex-строка. Отрицательное число (-1 по умолчанию) и 0xFFFF — любой hue; 0 — именно hue 0, а не любое значение. Не цвет полоски notoriety и не оттенок одежды. Цвет надетой вещи этот параметр не проверяет.
  • classMask — Имена правил, заранее определённых UO.SetClassMask в этом же скриптовом runtime. Например "DTMH|охотник|запасной" — приоритет слева направо; также допускается массив строк. Названия любые, регистр не важен. Разделители строки: |, запятая или ;. Любое неизвестное имя/пустой элемент внутри списка отменяет выбор целиком: результат 0, атаки нет. Это не числовая битовая маска: 7 не значит три класса. Пропущенный аргумент, -1, "-1", "any", "all" или пустая строка отдельно отключают фильтр классов. Mage/Tank/Archer не встроены: без регистрации таких правил совпадений не будет.
  • aliveOnly — true/1 исключает mobiles с IsDead != 0; false/0 по умолчанию не добавляет это условие. Не сравнение HP с нулём, не поиск трупов-предметов и не гарантия, что цель останется живой после вызова.
  • visibleOnly — true/1 требует IsVisible=1 по текущему состоянию ClassicUO; false/0 по умолчанию не добавляет условие. Это видимость загруженного объекта клиенту, а не проверка стен/линии обзора. Для геометрической проверки есть отдельная UO.CheckLOS с координатами; сервер всё равно может отклонить действие.

Возвращает

int — serial выбранного mobile, либо 0, когда подходящей цели нет или classMask недействителен. Это не 1/0-флаг, не body/type, не расстояние и не подтверждение удара. Проверяйте enemy != 0; enemy == true недопустимо в C#: int не сравнивается с bool. При ненулевом ID обработчик ClassicUO ещё может показать подтверждение атаки Innocent; сервер может отклонить действие.

Поведение

  • Поиск локальный: только уже загруженные mobiles. Учитывается Ignore; self исключён, кроме явного includeSelf=true в поддерживающих его командах. Контейнеры и предметы не являются mobiles.
  • Условия применяются вместе (AND). Допустимые альтернативы внутри body/notoriety объединены через OR. Поиск не меняет FindItem, FindCount и GetFoundItems.
  • В body/notoriety маска с допустимыми числами использует именно их: "any|5" всё равно ограничивает значением 5. Пустые/неверные элементы рядом с допустимыми числами игнорируются. Для отсутствия ограничения передайте -1 отдельно. Не переносите это правило на classMask: неизвестное имя класса отклоняет весь список.
  • Команды не открывают область мира, не бегут к цели и не проверяют проходимость маршрута. Между выбором и обработкой сервером состояние мира может измениться.
  • Передача true и 1 равнозначна для флагов, false и 0 также. Другие ненулевые числа тоже преобразуются в true, но 8/9 не являются отдельными режимами; используйте понятные true/false.
  • Имя — пользовательская метка, а не серверная профессия. Можно назвать правило DTMH, моя_группа или любым другим словом. Движок не определяет навыки/класс на сервере по имени персонажа.
  • В required один type или плоский массив означает хотя бы одну вещь из списка. Массив групп означает: нужна хотя бы одна вещь из КАЖДОЙ группы. Например [кожа, посохи] требует кожу И посох. Это набор альтернатив, а не требование надеть весь перечисленный гардероб.
  • Любая надетая вещь из forbidden исключает персонажа из этого правила, даже при выполненных required. Кожа плюс запрещённый chain не проходит правило кожи. Другие правила продолжают проверяться.
  • Учитываются только загруженные вещи, надетые на слоях 1..24 кроме рюкзака 21. Содержимое рюкзака/сундука, маунт 25, магазин 26..28 и банк 29 не считаются одеждой. Сравнивается graphic/type; serial, имя и hue вещи здесь не используются.
  • Список без загруженной подходящей экипировки не совпадает. Отсутствие запрещённой вещи в локальных данных не доказывает её отсутствие на сервере, если сервер ещё не прислал экипировку. Клиент не угадывает скрытые данные.
  • Правила принадлежат одному runtime скрипта, включая его функции и Include; не передаются другим самостоятельным запускам и не сохраняются в профиль. При новом запуске определите их снова, например общей процедурой настройки. Повторный SetClassMask заменяет правило с тем же именем, только после полной проверки новых данных.
  • Массивы копируются при регистрации. Изменение исходного массива не меняет правило: повторите SetClassMask. Несколько совпавших правил разрешаются порядком имён в classMask. Никаких стандартных таблиц одежды сервера нет.
  • Поддерживаются 1..9 позиционных аргументов. Пропускать можно хвост; чтобы задать classMask, нужно передать первые шесть аргументов. Используйте именованные var, чтобы видеть смысл каждой позиции.
  • Выбирается одна цель, атака отправляется один раз. Это не автоматический цикл боя. Без classMask фильтр экипировки и чтение вещей не выполняются.
  • Сначала общие фильтры, затем приоритет слева направо, затем nearest. nearest=false всё равно сохраняет приоритет классов, но внутри первого подходящего класса выбирает первый mobile в списке клиента.
  • Старая попытка поиска подстроки в имени/титуле заменена правилами экипировки. Перенесите такие скрипты на явный SetClassMask; имя персонажа больше не выдаёт его за определённый класс.

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

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

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

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

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

var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));

1. Ближайший Enemy в пяти клетках: короткая форма — прямой скрипт

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

  • body=-1, maxZ=FindVertical(), nearest=true, color=-1, classMask отключён, aliveOnly=false, visibleOnly=false. Для обязательного исключения мёртвых используйте полную форму ниже.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
    return null;
}
UO.AddObject("combat_target", enemy);

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

2. Только заданные тела и та же высота: все флаги без классов — функция сценария

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

  • maxZ=0 полезен для строгого сравнения высоты, но может отсечь цель на ступеньке. visibleOnly не проверяет стену. Все девять аргументов подписаны; возвращается ID, не true.
return  RunScenario();
 object? RunScenario()
{
    var status = "5|6";
    var radius = 8;
    var bodies = "0x0190|0x0191";
    var heightTolerance = 0;
    dynamic chooseNearest = true;
    var bodyHue = -1;
    var equipmentClasses = -1;
    dynamic requireAlive = true;
    dynamic requireVisible = true;
    var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
    if (Truth(enemy != 0))
    {
        UO.AddObject("enemy_same_height", enemy);
    }

    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. Свои названия, свои вещи и порядок атаки — класс сценария

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

  • Сначала выбирается DTMH; только если подходящих DTMH нет — тяжёлый, затем охотник. DTMH на 10 клетках имеет приоритет над тяжёлым на 2 клетках. Для обратного порядка поменяйте строку classMask. Из двух DTMH выбирается ближайший.
  • Gear — полностью приведённая пользовательская функция C#, не отдельная команда UO. Два массива в Gear(leather, staves) образуют две обязательные группы. Добавление типа в leather расширяет альтернативы; не требует надевать две кожаные вещи.
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 leather = Gear(0x13C4, 0x13C7);
        var staves = Gear(0x0DF0, 0x0E81);
        var chain = Gear(0x13BF, 0x13C0);
        var plate = Gear(0x1415, 0x1411);
        var bows = Gear(0x13B2, 0x0F50);
        UO.SetClassMask("DTMH", Gear(leather, staves), chain);
        UO.SetClassMask("охотник", bows);
        UO.SetClassMask("тяжёлый", plate);
        var notoriety = "5|6";
        var distance = 12;
        var body = -1;
        var maxZ = 8;
        dynamic nearest = true;
        var color = -1;
        var classMask = "DTMH|тяжёлый|охотник";
        dynamic aliveOnly = true;
        dynamic visibleOnly = true;
        var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
        if (Truth(enemy == 0))
        {
            UO.Print("No matching enemy; no attack sent");
            return null;
        }

        UO.AddObject("selected_enemy", enemy);
        return null;
    }

    dynamic Gear(params dynamic[] values)
    {
        return values;
    }

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

4. nearest=false: первый в списке, а не самый дальний — прямой скрипт

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

  • 10 — радиус, 4 — допустимая разность Z, оба -1 после флага отключают color и classMask. Порядок списка клиента не гарантирован между обновлениями мира. Для предсказуемой близости используйте true.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
    return null;
}
UO.AddObject("current_enemy", target);

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

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

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

  • Меняется только порядок меток: никаких новых таблиц одежды или названий в клиенте добавлять не требуется. Чтобы запретить fallback на тяжёлого, удалите его из priority.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("охотник", bows);
    UO.SetClassMask("тяжёлый", plate);
    var priority = "охотник|DTMH|тяжёлый";
    var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("priority_enemy", enemy);
    }

    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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.AttackNearest(notoriety) — UO.AttackNearest(Any)

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

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance) — UO.AttackNearest(Any,Any)

Параметры: notoriety (Any), distance (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body) — UO.AttackNearest(Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ) — UO.AttackNearest(Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest) — UO.AttackNearest(Any,Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.BandageSelf

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

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

void UO.BandageSelf();

Ставит персонажа в качестве UO.Wait-target и использует на себе бинт типа 0x0E21, выбранный из рюкзака. Операция отправляется клиентом и выполняется сервером асинхронно.

Параметры

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

Возвращает

void. Метод не возвращает статус лечения и не ждёт завершения бинтования.

Поведение

  • Runtime задаёт цель Self, затем ищет в рюкзаке ближайший подходящий предмет типа 0x0E21 с любым hue и использует его. Если бинт не найден, поиск сообщает об этом в системный журнал; результат поиска не возвращается вызывающему скрипту. Возможность и результат лечения зависят от серверного состояния персонажа.

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

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

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

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

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

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

1. Однократно использовать найденный в рюкзаке бинт на себе. — прямой скрипт

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

  • Однократно использовать найденный в рюкзаке бинт на себе.
UO.BandageSelf();

2. Сначала проверить соединение, затем отправить действие; вызов не ждёт окончания лечения. — функция сценария

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

  • Сначала проверить соединение, затем отправить действие; вызов не ждёт окончания лечения.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.BandageSelf();
    }

    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. Процедура только отправляет использование бинта и не сообщает об успехе лечения. — класс сценария

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

  • Процедура только отправляет использование бинта и не сообщает об успехе лечения.
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()
    {
        ApplyBandage();
        return null;
    }

    void ApplyBandage()
    {
        UO.BandageSelf();
    }
}

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

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

UO.BandageSelf() — UO.BandageSelf()

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

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

При вызове:

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

public void BandageSelf()

        {

            var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));

            if (foundBandages != string.Empty)

            {

                WaitTargetSelf();

                UseObject(foundBandages);

            }

            else

                SystemMessage("No bandages found.");

        }

UO.ClearClassMask

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

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

int UO.ClearClassMask();
int UO.ClearClassMask(object? name);

Удаляет одно пользовательское правило экипировки либо все правила текущего скриптового runtime. Полезно перед перенастройкой наборов или отключением временного приоритета.

Параметры

  • name — Необязательное имя, переданное SetClassMask. Регистр не важен. Без аргументов удаляются все правила этого runtime. Это не строка приоритетов: "mage|tank" здесь недопустимо; удаляйте по одному или вызовите без аргументов.

Возвращает

int — количество удалённых правил. С именем 1 означает удалено, 0 — такого правила не было. Без аргументов возвращается 0..N, не логический флаг. Поэтому общий результат сравнивайте с > 0, а не с true.

Поведение

  • Не отменяет уже отправленную атаку и не останавливает скрипт. Не изменяет экипировку персонажей.
  • После удаления имя остаётся неизвестным для следующего AttackNearest. Удалите его также из classMask или зарегистрируйте снова; неизвестное имя блокирует весь выбор.
  • Чужие runtime и их правила не затрагиваются. Для обычного поиска без классов используйте classMask=-1, а не пустой набор обязательной одежды.

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

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

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

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

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

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

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

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

  • Удаление не переключает оружие и не завершает бой. Оно меняет только дальнейшую классификацию.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("main_enemy", enemy);
}

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

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

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

  • removed — число удалённых правил. Новый набор создаётся в том же runtime, без перезапуска клиента.
return  RunScenario();
 object? RunScenario()
{
    UO.SetClassMask("старый_набор", 0x13B2);
    var removed = UO.ClearClassMask();
    UO.SetClassMask("новый_набор", 0x0F50);
    var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("new_enemy", enemy);
    }

    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. Сбросить правила и перейти к обычной ближайшей цели — класс сценария

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

  • Не передавайте удалённое имя: результат был бы 0. -1 отключает только одежду; остальные фильтры продолжают работать.
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.SetClassMask("по_одежде", 0x13C4);
        UO.ClearClassMask();
        var classes = -1;
        var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("enemy_without_classes", enemy);
        }

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

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

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

args => new InjectionValue(ClearClassMask(null))

UO.ClearClassMask(name) — UO.ClearClassMask(Any)

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

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))

UO.GetAbilityID

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

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

int UO.GetAbilityID(object? abilityName);

Разрешает имя способности оружия или числовую строку в ID каталога клиента.

Параметры

  • abilityName — string: имя AbilityData, имя enum Ability или десятичный ID. Пробелы/пунктуация удаляются при сравнении имён, регистр не учитывается.

Возвращает

int 1..AbilityData.Abilities.Length — известная способность; 0 — неизвестное имя, пустая нормализованная строка или числовой ID вне каталога.

Поведение

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

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

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

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

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

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

var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));

1. Разрешить имя — прямой скрипт

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

  • Число обозначает ID каталога, а не применение способности.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));

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

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

  • Строка 1 проходит числовой путь резолвера.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("1");
    UO.Print(Convert.ToString(id));
    return null;
}

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

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

  • Отсутствующее имя возвращает 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 id = UO.GetAbilityID("unknown-example-ability");
        UO.Print(Convert.ToString(id));
        return null;
    }
}

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

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

UO.GetAbilityID(abilityName) — UO.GetAbilityID(String)

Параметры: abilityName (String)

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

При вызове:

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

public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);

UO.GetAbilityName

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

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

string UO.GetAbilityName(object? abilityId);

Возвращает имя способности оружия по её ID каталога.

Параметры

  • abilityId — int: индексация ID начинается с 1; bridge читает AbilityData.Abilities[abilityId-1].

Возвращает

string имени каталога. Для ID меньше 1 или больше длины каталога возвращается пустая строка.

Поведение

  • Чтение локальное и не активирует способность. ID каталога не означает, что способность присутствует у текущего оружия.

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

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

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

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

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

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

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

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

  • ID 1 соответствует первому элементу каталога.
var name = UO.GetAbilityName(1);
UO.Print(name);

2. Обратное разрешение — функция сценария

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

  • Имя возвращается по ID, найденному резолвером.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("Armor Ignore");
    if (Truth(id > 0))
    {
        UO.Print(UO.GetAbilityName(id));
    }

    return null;
}

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

3. Неверный ID — класс сценария

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

  • ID 0 возвращает строку длины 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 name = UO.GetAbilityName(0);
        UO.Print(Convert.ToString(Len(name)));
        return null;
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}

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

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

UO.GetAbilityName(abilityId) — UO.GetAbilityName(Integer)

Параметры: abilityId (Integer)

Результат: string / String.

При вызове:

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

public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);

UO.GetActiveAbility

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

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

dynamic UO.GetActiveAbility();

Читает имя активированной боевой способности своего персонажа.

Параметры

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

Возвращает

string — английское имя активированной способности, например Armor Ignore. Строка "0", если ни одна способность не активирована или персонаж отсутствует. Это не int 0, не ID способности и не подтверждение успешного удара.

Поведение

  • Читаются флаги PrimaryAbility/SecondaryAbility текущего персонажа. Если активны оба, выбирается первичная способность. Флаг активности исключается из номера перед поиском имени.
  • Данные читаются локально; сам getter не активирует способность и не расходует ману. После атаки сервер может снять активацию.

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

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

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

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

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

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

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

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

  • Аргументов нет; читается персонаж текущего клиента.
  • При отсутствии активации печатается строка 0.
var name = UO.GetActiveAbility();
UO.Print(name);

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

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

  • Сравнение выполняется со строкой 0. UsePrimaryAbility вызывается отдельно.
  • Это запрос активации, а не доказательство успешного удара. Доступность зависит от оружия и правил сервера.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.GetActiveAbility() == "0"))
    {
        UO.UsePrimaryAbility();
    }

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

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

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

     public object? RunScenario()
    {
        var name = UO.GetActiveAbility();
        if (Truth(name != "0"))
        {
            var id = UO.GetAbilityID(name);
            UO.Print("Ability ID: " + Convert.ToString(id));
        }

        return null;
    }

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

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

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

UO.GetActiveAbility() — UO.GetActiveAbility()

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

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

При вызове:

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

case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());

UO.GetWeaponAbilities

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

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

dynamic UO.GetWeaponAbilities();

Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке.

Параметры

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

Возвращает

Array положительных int ID способностей текущего оружия. Старший флаг 0x80 снят; нулевые значения исключены. Без Player — пустой массив.

Поведение

  • Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке. Возвращает доступные ID, а не факт активного режима и не имена.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

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

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

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

  • Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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

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

  • Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке. Возвращает доступные ID, а не факт активного режима и не имена.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.GetAbilityName(abilities[0]));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var before = UO.GetWeaponAbilities();
        UO.Wait(500);
        var after = UO.GetWeaponAbilities();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

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

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

UO.GetWeaponAbilities() — UO.GetWeaponAbilities()

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

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

При вызове:

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

public InjectionValue GetWeaponAbilities() => new InjectionValue(

            (bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());

UO.IsWarMode

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

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

int UO.IsWarMode(object? objID);

Проверяет боевую стойку mobile.

Параметры

  • objID — Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.

Возвращает

int 1 — загруженный mobile имеет признак InWarMode. int 0 — признак отсутствует, объект не является mobile, неизвестен или удалён. Не сообщает, кого атакует персонаж, и не включает боевой режим. Чтение чужого режима ограничено полученными от сервера данными.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • Не сообщает, кого атакует персонаж, и не включает боевой режим. Чтение чужого режима ограничено полученными от сервера данными.

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

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

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

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

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

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

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

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

  • Аргумент self явно выбирает своего персонажа. state — только 1/0.
  • Не сообщает, кого атакует персонаж, и не включает боевой режим. Чтение чужого режима ограничено полученными от сервера данными.
var state = UO.IsWarMode("self");
if (Truth(state))
{
    UO.Print("Combat stance is active");
}
else
{
    UO.Print("Combat stance is inactive");
}

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

2. Проверить выбранного mobile — функция сценария

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

  • IsNpc исключает предмет и неизвестный объект. target сохраняет один serial, а не живую ссылку на меняющийся lasttarget.
  • Результат относится к полю InWarMode. Данные обновляются только после получения соответствующего состояния клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsWarMode(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Сравнить состояние до и после паузы — класс сценария

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

  • UO.Wait(500) — пауза в миллисекундах. После неё отдельно проверяется, что mobile ещё существует.
  • Сравниваются два снимка. Промежуточные изменения могут быть пропущены, и это не непрерывная подписка на серверные события.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsWarMode(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsWarMode(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.IsWarMode(objID) — UO.IsWarMode(Any)

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

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

При вызове:

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

case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());

UO.LastAttack

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

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

dynamic UO.LastAttack();

Читает serial последней цели атаки.

Параметры

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

Возвращает

int — сохранённый serial; 0 означает, что serial не установлен. Это не bool и не graphic/type; ненулевой ID может уже отсутствовать в мире.

Поведение

  • Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

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

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

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

  • Читает serial последней цели атаки.
var id = UO.LastAttack();
UO.Print(Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

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

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

  • Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastAttack();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(id));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var before = UO.LastAttack();
        UO.Wait(500);
        var after = UO.LastAttack();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.LastAttack() — UO.LastAttack()

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

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

При вызове:

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

case "lastattack":

                case "wartargetid": return new InjectionValue(bridge.LastAttack);

UO.SetClassMask

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

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

int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);

Создаёт или заменяет собственный класс экипировки для classMask в UO.AttackNearest. Вы выбираете имя и graphic/type вещей; встроенные названия профессий не требуются.

Параметры

  • name — Непустая строка с вашим названием, например "DTMH", "моя_группа", "арчер_со_щитом". Регистр не важен, пробелы по краям убираются. | , ; запрещены: это разделители приоритетов. any/all/-1 зарезервированы для отключения фильтра.
  • required — Один type, плоский массив альтернатив или массив обязательных групп. Каждая группа — type либо плоский массив. Нужна хотя бы одна вещь из каждой группы; пустые обязательные группы недопустимы. Каждый type — int/числовая/hex-строка 1..65534. Вложенность глубже массива групп не принимается. Это graphic вещей, не serial и не body персонажа.
  • forbidden — Необязательный type или плоский массив запрещённых типов. По умолчанию запрещённых вещей нет; пустой массив тоже разрешён. Если любая такая вещь надета, правило не совпадает. Те же границы 1..65534; -1/any здесь не принимаются. Полностью запрещать все альтернативы обязательной группы нельзя.

Возвращает

int 1 — правило проверено и записано. Ошибочный тип/имя/пустая обязательная группа/противоречие вызывает ошибку скрипта, которую можно перехватить try/CATCH; прежнее правило сохраняется. Не возвращает serial или найденных персонажей, не начинает атаку.

Поведение

  • Имя — пользовательская метка, а не серверная профессия. Можно назвать правило DTMH, моя_группа или любым другим словом. Движок не определяет навыки/класс на сервере по имени персонажа.
  • В required один type или плоский массив означает хотя бы одну вещь из списка. Массив групп означает: нужна хотя бы одна вещь из КАЖДОЙ группы. Например [кожа, посохи] требует кожу И посох. Это набор альтернатив, а не требование надеть весь перечисленный гардероб.
  • Любая надетая вещь из forbidden исключает персонажа из этого правила, даже при выполненных required. Кожа плюс запрещённый chain не проходит правило кожи. Другие правила продолжают проверяться.
  • Учитываются только загруженные вещи, надетые на слоях 1..24 кроме рюкзака 21. Содержимое рюкзака/сундука, маунт 25, магазин 26..28 и банк 29 не считаются одеждой. Сравнивается graphic/type; serial, имя и hue вещи здесь не используются.
  • Список без загруженной подходящей экипировки не совпадает. Отсутствие запрещённой вещи в локальных данных не доказывает её отсутствие на сервере, если сервер ещё не прислал экипировку. Клиент не угадывает скрытые данные.
  • Правила принадлежат одному runtime скрипта, включая его функции и Include; не передаются другим самостоятельным запускам и не сохраняются в профиль. При новом запуске определите их снова, например общей процедурой настройки. Повторный SetClassMask заменяет правило с тем же именем, только после полной проверки новых данных.
  • Массивы копируются при регистрации. Изменение исходного массива не меняет правило: повторите SetClassMask. Несколько совпавших правил разрешаются порядком имён в classMask. Никаких стандартных таблиц одежды сервера нет.

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

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

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

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

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

var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));

1. DTMH: своя кожа без chain — прямой скрипт

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

  • DTMH — только ваше имя. Значения в myLeather/forbiddenChain — примеры: замените/дополните реальными graphic вашего сервера. Плоский список означает OR, а не полный комплект.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("leather_enemy", enemy);
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

2. Свои названия, свои вещи и порядок атаки — функция сценария

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

  • Сначала выбирается DTMH; только если подходящих DTMH нет — тяжёлый, затем охотник. DTMH на 10 клетках имеет приоритет над тяжёлым на 2 клетках. Для обратного порядка поменяйте строку classMask. Из двух DTMH выбирается ближайший.
  • Gear — полностью приведённая пользовательская функция C#, не отдельная команда UO. Два массива в Gear(leather, staves) образуют две обязательные группы. Добавление типа в leather расширяет альтернативы; не требует надевать две кожаные вещи.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("охотник", bows);
    UO.SetClassMask("тяжёлый", plate);
    var notoriety = "5|6";
    var distance = 12;
    var body = -1;
    var maxZ = 8;
    dynamic nearest = true;
    var color = -1;
    var classMask = "DTMH|тяжёлый|охотник";
    dynamic aliveOnly = true;
    dynamic visibleOnly = true;
    var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
    if (Truth(enemy == 0))
    {
        UO.Print("No matching enemy; no attack sent");
        return null;
    }

    UO.AddObject("selected_enemy", enemy);
    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

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

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

  • объявление переменной required[1] создаёт два элемента с индексами 0 и 1. Две вложенные группы требуют torso И weapon; плоский [torsoType,weaponType] означал бы torso ИЛИ weapon.
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()
    {
        dynamic[] required = new dynamic[checked((int)(1) + 1)];
        dynamic[] torso = new dynamic[checked((int)(0) + 1)];
        dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
        torso[0] = 0x13C4;
        weapon[0] = 0x0DF0;
        required[0] = torso;
        required[1] = weapon;
        UO.SetClassMask("мой_комплект", required);
        var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("outfit_enemy", enemy);
        }

        return null;
    }

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

4. Изменить одежду в правиле перед следующей атакой — прямой скрипт

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

  • Повторная регистрация заменяет копию правила. Старое имя остаётся тем же, поэтому строку приоритетов переписывать не нужно.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("updated_outfit", enemy);
}

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.SetClassMask(name, required) — UO.SetClassMask(Any,Any)

Параметры: name (Any), required (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

args => new InjectionValue(SetClassMask(args))

UO.SetClassMask(name, required, forbidden) — UO.SetClassMask(Any,Any,Any)

Параметры: name (Any), required (Any), forbidden (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

args => new InjectionValue(SetClassMask(args))

UO.SetWarMode

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

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

void UO.SetWarMode(object? value);

Запрашивает боевой или мирный режим персонажа.

Параметры

  • value — 0 — мирный режим; любое ненулевое целое — боевой режим.

Возвращает

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

Поведение

  • WarMode передаёт режим в GameActions.ToggleWarMode: 0 выключает, любое ненулевое значение включает. Без Player действия нет.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

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

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

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

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

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

UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);

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

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

  • Запрашивает боевой или мирный режим персонажа.
UO.SetWarMode(1);

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

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

  • WarMode передаёт режим в GameActions.ToggleWarMode: 0 выключает, любое ненулевое значение включает. Без Player действия нет.
return  RunScenario();
 object? RunScenario()
{
    UO.SetWarMode(0);
    return null;
}

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

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

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

     public object? RunScenario()
    {
        ApplyMode(1);
        return null;
    }

    void ApplyMode(dynamic mode)
    {
        UO.SetWarMode(mode);
    }
}

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

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

UO.SetWarMode(value) — UO.SetWarMode(Any)

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

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

При вызове:

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

case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;

UO.Specmove

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

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

void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);

Передаёт один запрос шага напрямую bridge.

Параметры

  • direction — int; direction & 7 даёт 0..7 N,NE,E,SE,S,SW,W,NW.
  • running — Необязательный Числовой флаг int: 0/отсутствие — ходьба, ненулевое — бег.

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias вызывает bridge.Step(direction & 7, running != 0) и отбрасывает весь код результата 0/2/3/4/5/7; наружу возвращается void. Это один шаг/поворот, не маршрут. Ожидание внутри Step до 10000 мс сохраняется, но скрипт не получает код подтверждения, отказа или тайм-аута.
  • Ветка не выполняет runtime-условия MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor из UO.Step. Сам bridge/Player.Walk и сервер всё равно проверяют движение.
  • QueueStep на игровом потоке проверяет игрока, соединение, направление, очередь, темп и локальную проходимость. Перед Player.Walk каждый вызов отдельно фиксирует поколения Confirm/Deny своего sequence и Walker; затем возвращает Result вместе с этим снимком. Step и ожидающий StepControlled проверяют только эту сохранённую пару, а не общие поля следующего запроса; замена игрока/Walker прекращает ожидание общим отказом. Подтверждение другой очередной команды не подтверждает этот шаг. Поворот без перемещения остаётся отдельным случаем.

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

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

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

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

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

UO.Print("Calling UO.Specmove");
UO.Specmove(0);

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

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

  • Передаёт один запрос шага напрямую bridge.
UO.Specmove(0);

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

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

  • ExecuteLegacyManualAlias вызывает bridge.Step(direction&7,running!=0), затем отбрасывает возвращаемый 1/0. Это один шаг, не путь к координате.
return  RunScenario();
 object? RunScenario()
{
    UO.Specmove(2, 1);
    return null;
}

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

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

  • Ветка не выполняет runtime-условия MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor из UO.Step. Сам bridge/Player.Walk и сервер всё равно проверяют движение.

Стандартная скорость движения

Минимальный интервал шага: пешком — ходьба 400 мс, бег 200 мс; верхом — ходьба 200 мс, бег 100 мс.

Это стандартные пределы клиента, а не автоматически определённые настройки вашего шарда. Серверные режимы скорости и полёт учитываются отдельно. Таймеры скрипта могут замедлить движение, но не уменьшить эти пределы.

Шаги, маршруты, Follow, управление мышью/клавишами и карта используют общую очередь персонажа. Замена маршрута, поворот или коррекция позиции сервером не отменяют оставшуюся паузу после запроса шага. После задержки нет ускоренной серии для компенсации пропущенных кадров. Ожидание подтверждения, препятствия и плохая связь могут замедлить движение.

return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var before = UO.GetX();
        UO.Specmove(2, 0);
        UO.Wait(500);
        UO.Print(UO.GetX() - before);
        return null;
    }
}

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

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

UO.Specmove(direction) — UO.Specmove(Any)

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

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

При вызове:

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.Specmove(direction, running) — UO.Specmove(Any,Any)

Параметры: direction (Any), running (Any)

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

При вызове:

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.UseAbility

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

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

int UO.UseAbility(object? abilityId);

Запрашивает способность, доступную текущему оружию.

Параметры

  • abilityId — Имя способности либо int ID 1..AbilityData.Abilities.Length. Имена нормализуются: сохраняются только буквы/цифры и сравниваются в верхнем регистре. Числовой текст означает ID.

Возвращает

Числовой флаг int: 1 — ID совпал с основной/дополнительной способностью текущего Player и соответствующий GameActions вызван; 0 — нет Player, неизвестный ID/имя либо способность не принадлежит текущему оружию.

Поведение

  • Строковая форма использует ResolveAbility; числовая сразу bridge.UseAbility. Bridge маскирует 0x80 у двух текущих способностей и сопоставляет ID, затем вызывает UsePrimaryAbility или UseSecondaryAbility.
  • Это принятие локального запроса, не подтверждение попадания, расхода mana или активации сервером. Доступные ID читаются GetWeaponAbilities, активное имя — GetActiveAbility.
  • GameActions переключает бит выбора способности 0x80. Уже выбранная способность посылает ID 0 и снимает выбор; иначе очищаются оба бита выбора, посылается выбранный ID, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.

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

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

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

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

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

var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));

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

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

  • Запрашивает способность, доступную текущему оружию.
UO.Print(UO.UseAbility("Armor Ignore"));

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

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

  • Строковая форма использует ResolveAbility; числовая сразу bridge.UseAbility. Bridge маскирует 0x80 у двух текущих способностей и сопоставляет ID, затем вызывает UsePrimaryAbility или UseSecondaryAbility.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.UseAbility(abilities[0]));
    }

    return null;
}

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

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

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

  • Это принятие локального запроса, не подтверждение попадания, расхода mana или активации сервером. Доступные ID читаются GetWeaponAbilities, активное имя — GetActiveAbility.
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 id = UO.GetAbilityID("Armor Ignore");
        if (Truth(id > 0))
        {
            var accepted = UO.UseAbility(id);
            UO.Print(accepted);
            UO.Print(UO.GetActiveAbility());
        }

        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.UseAbility(abilityId) — UO.UseAbility(Integer)

Параметры: abilityId (Integer/String)

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

При вызове:

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

public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);

UO.UseAbility(abilityId) — UO.UseAbility(String)

Параметры: abilityId (Integer/String)

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

При вызове:

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

public int UseAbility(string abilityName)

        {

            int abilityId = bridge.ResolveAbility(abilityName);

            return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;

        }

UO.UsePrimaryAbility

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

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

void UO.UsePrimaryAbility();

Вызывает основную способность оружия.

Параметры

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

Возвращает

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

Поведение

  • UsePrimaryAbility передаёт GameActions.UsePrimaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
  • В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
  • GameActions переключает бит выбора способности 0x80. Уже выбранная способность посылает ID 0 и снимает выбор; иначе очищаются оба бита выбора, посылается выбранный ID, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.

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

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

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

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

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

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

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

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

  • Вызывает основную способность оружия.
UO.UsePrimaryAbility();

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

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

  • UsePrimaryAbility передаёт GameActions.UsePrimaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UsePrimaryAbility();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.UsePrimaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

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

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

UO.UsePrimaryAbility() — UO.UsePrimaryAbility()

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

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

При вызове:

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

case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;

UO.UseSecondaryAbility

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

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

void UO.UseSecondaryAbility();

Вызывает дополнительную способность оружия.

Параметры

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

Возвращает

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

Поведение

  • UseSecondaryAbility передаёт GameActions.UseSecondaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
  • В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
  • GameActions переключает бит выбора способности 0x80. Уже выбранная способность посылает ID 0 и снимает выбор; иначе очищаются оба бита выбора, посылается выбранный ID, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.

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

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

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

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

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

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

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

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

  • Вызывает дополнительную способность оружия.
UO.UseSecondaryAbility();

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

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

  • UseSecondaryAbility передаёт GameActions.UseSecondaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UseSecondaryAbility();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.UseSecondaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

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

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

UO.UseSecondaryAbility() — UO.UseSecondaryAbility()

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

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

При вызове:

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

case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;

UO.WarMode

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

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

int UO.WarMode();
void UO.WarMode(object? mode);

Читает или запрашивает боевой режим персонажа.

Параметры

  • mode — Необязательный int: 0 выключает, любое ненулевое значение включает. Форма без аргументов только читает.

Возвращает

Без аргументов Числовой флаг int: 1 — текущий Player в боевом режиме, 0 — мирный режим/нет Player. С mode — null, результата нет.

Поведение

  • WarMode() читает Player.InWarMode локально. WarMode(mode) вызывает GameActions.ToggleWarMode с выбранным режимом; без Player запрос не выполняется.
  • Не присваивайте результат формы с аргументом переменной. Немедленное повторное чтение не является сетевым подтверждением.

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

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

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

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

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

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

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

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

  • Читает или запрашивает боевой режим персонажа.
var active = UO.WarMode();
UO.Print(active);

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

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

  • WarMode() читает Player.InWarMode локально. WarMode(mode) вызывает GameActions.ToggleWarMode с выбранным режимом; без Player запрос не выполняется.
return  RunScenario();
 object? RunScenario()
{
    UO.WarMode(1);
    UO.Wait(250);
    UO.Print(UO.WarMode());
    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 before = UO.WarMode();
        UO.WarMode(0);
        UO.Print(before);
        return null;
    }
}

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

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

UO.WarMode() — UO.WarMode()

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

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

При вызове:

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

public int WarMode() => bridge.WarMode();

UO.WarMode(mode) — UO.WarMode(Integer)

Параметры: mode (Integer)

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

При вызове:

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

public void WarMode(int mode) => bridge.WarMode(mode);

UO.WarTargetID

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

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

dynamic UO.WarTargetID();

Читает serial последней цели атаки.

Параметры

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

Возвращает

int — сохранённый serial; 0 означает, что serial не установлен. Это не bool и не graphic/type; ненулевой ID может уже отсутствовать в мире.

Поведение

  • Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

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

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

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

  • Читает serial последней цели атаки.
var id = UO.WarTargetID();
UO.Print(Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

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

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

  • Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.WarTargetID();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(id));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var before = UO.WarTargetID();
        UO.Wait(500);
        var after = UO.WarTargetID();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.WarTargetID() — UO.WarTargetID()

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

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

При вызове:

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

case "lastattack":

                case "wartargetid": return new InjectionValue(bridge.LastAttack);

Clone this wiki locally