Repository navigation
RU UO Topic combat
Українська · Русский · 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 |
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
UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest
Названия групп и типы надетых вещей задаются скриптом; порядок имён через | задаёт приоритет.
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
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;Параметры, результат и все сценарии
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
Внутренний код реализации, не самостоятельный скрипт.
public void Attack(int id) => bridge.Attack(id);Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public void Attack(string id) => Attack(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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; имя персонажа больше не выдаёт его за определённый класс.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Сначала выбирается 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;
}Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Меняется только порядок меток: никаких новых таблиц одежды или названий в клиенте добавлять не требуется. Чтобы запретить 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.
Параметры: notoriety (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметры: notoriety (Any), distance (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметры: notoriety (Any), distance (Any), body (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactAttackNearest(values))Параметры: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactAttackNearest(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BandageSelf();Ставит персонажа в качестве UO.Wait-target и использует на себе бинт типа 0x0E21, выбранный из рюкзака. Операция отправляется клиентом и выполняется сервером асинхронно.
Параметров нет.
void. Метод не возвращает статус лечения и не ждёт завершения бинтования.
- Runtime задаёт цель
Self, затем ищет в рюкзаке ближайший подходящий предмет типа0x0E21с любым hue и использует его. Если бинт не найден, поиск сообщает об этом в системный журнал; результат поиска не возвращается вызывающему скрипту. Возможность и результат лечения зависят от серверного состояния персонажа.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.BandageSelf");
UO.BandageSelf();Параметры и ход выполнения:
- Однократно использовать найденный в рюкзаке бинт на себе.
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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
Внутренний код реализации, не самостоятельный скрипт.
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.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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, а не пустой набор обязательной одежды.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));Параметры и ход выполнения:
- Удаление не переключает оружие и не завершает бой. Оно меняет только дальнейшую классификацию.
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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Не передавайте удалённое имя: результат был бы 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
args => new InjectionValue(ClearClassMask(null))Параметры: name (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetAbilityID(object? abilityName);Разрешает имя способности оружия или числовую строку в ID каталога клиента.
-
abilityName— string: имя AbilityData, имя enum Ability или десятичный ID. Пробелы/пунктуация удаляются при сравнении имён, регистр не учитывается.
int 1..AbilityData.Abilities.Length — известная способность; 0 — неизвестное имя, пустая нормализованная строка или числовой ID вне каталога.
- ResolveClassicUOAbilityId сначала разбирает десятичный int, затем сравнивает нормализованные имена каталога и enum. Команда не активирует способность и не проверяет соответствие текущему оружию.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));Параметры и ход выполнения:
- Число обозначает ID каталога, а не применение способности.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));Параметры и ход выполнения:
- Строка 1 проходит числовой путь резолвера.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}Параметры и ход выполнения:
- Отсутствующее имя возвращает 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.
Параметры: abilityName (String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
Внутренний код реализации, не самостоятельный скрипт.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetAbilityName(object? abilityId);Возвращает имя способности оружия по её ID каталога.
-
abilityId— int: индексация ID начинается с 1; bridge читает AbilityData.Abilities[abilityId-1].
string имени каталога. Для ID меньше 1 или больше длины каталога возвращается пустая строка.
- Чтение локальное и не активирует способность. ID каталога не означает, что способность присутствует у текущего оружия.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));Параметры и ход выполнения:
- ID 1 соответствует первому элементу каталога.
var name = UO.GetAbilityName(1);
UO.Print(name);Параметры и ход выполнения:
- Имя возвращается по 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;Параметры и ход выполнения:
- 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.
Параметры: abilityId (Integer)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
Внутренний код реализации, не самостоятельный скрипт.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetActiveAbility();Читает имя активированной боевой способности своего персонажа.
Параметров нет.
string — английское имя активированной способности, например Armor Ignore. Строка "0", если ни одна способность не активирована или персонаж отсутствует. Это не int 0, не ID способности и не подтверждение успешного удара.
- Читаются флаги PrimaryAbility/SecondaryAbility текущего персонажа. Если активны оба, выбирается первичная способность. Флаг активности исключается из номера перед поиском имени.
- Данные читаются локально; сам getter не активирует способность и не расходует ману. После атаки сервер может снять активацию.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет; читается персонаж текущего клиента.
- При отсутствии активации печатается строка 0.
var name = UO.GetActiveAbility();
UO.Print(name);Параметры и ход выполнения:
- Сравнение выполняется со строкой 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetActiveAbility:bridge.GetActiveAbility().
Внутренний код реализации, не самостоятельный скрипт.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWeaponAbilities();Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке.
Параметров нет.
Array положительных int ID способностей текущего оружия. Старший флаг 0x80 снят; нулевые значения исключены. Без Player — пустой массив.
- Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке. Возвращает доступные ID, а не факт активного режима и не имена.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Bridge читает Player.Abilities, применяет ((byte)value & 0x7F), сохраняет положительные ID в исходном порядке.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
Внутренний код реализации, не самостоятельный скрипт.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 или другого действия объект и его флаги могут измениться.
- Не сообщает, кого атакует персонаж, и не включает боевой режим. Чтение чужого режима ограничено полученными от сервера данными.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));Параметры и ход выполнения:
- Аргумент 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: objID (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
Внутренний код реализации, не самостоятельный скрипт.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastAttack();Читает serial последней цели атаки.
Параметров нет.
int — сохранённый serial; 0 означает, что serial не установлен. Это не bool и не graphic/type; ненулевой ID может уже отсутствовать в мире.
- Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает serial последней цели атаки.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметры и ход выполнения:
- Источник поля: 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Внутренний код реализации, не самостоятельный скрипт.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Никаких стандартных таблиц одежды сервера нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Сначала выбирается 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;Параметры и ход выполнения:
- объявление переменной 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;
}Параметры и ход выполнения:
- Повторная регистрация заменяет копию правила. Старое имя остаётся тем же, поэтому строку приоритетов переписывать не нужно.
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.
Параметры: name (Any), required (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
args => new InjectionValue(SetClassMask(args))Параметры: name (Any), required (Any), forbidden (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
args => new InjectionValue(SetClassMask(args))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWarMode(object? value);Запрашивает боевой или мирный режим персонажа.
-
value— 0 — мирный режим; любое ненулевое целое — боевой режим.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- WarMode передаёт режим в GameActions.ToggleWarMode: 0 выключает, любое ненулевое значение включает. Без Player действия нет.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);Параметры и ход выполнения:
- Запрашивает боевой или мирный режим персонажа.
UO.SetWarMode(1);Параметры и ход выполнения:
- WarMode передаёт режим в GameActions.ToggleWarMode: 0 выключает, любое ненулевое значение включает. Без Player действия нет.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}Параметры и ход выполнения:
- 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.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 прекращает ожидание общим отказом. Подтверждение другой очередной команды не подтверждает этот шаг. Поворот без перемещения остаётся отдельным случаем.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Specmove");
UO.Specmove(0);Параметры и ход выполнения:
- Передаёт один запрос шага напрямую bridge.
UO.Specmove(0);Параметры и ход выполнения:
- ExecuteLegacyManualAlias вызывает bridge.Step(direction&7,running!=0), затем отбрасывает возвращаемый 1/0. Это один шаг, не путь к координате.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}Параметры и ход выполнения:
- Ветка не выполняет 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.
Параметры: direction (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Параметры: direction (Any), running (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));Параметры и ход выполнения:
- Запрашивает способность, доступную текущему оружию.
UO.Print(UO.UseAbility("Armor Ignore"));Параметры и ход выполнения:
- Строковая форма использует 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;Параметры и ход выполнения:
- Это принятие локального запроса, не подтверждение попадания, расхода 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.
Параметры: abilityId (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Внутренний код реализации, не самостоятельный скрипт.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);Параметры: abilityId (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Внутренний код реализации, не самостоятельный скрипт.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UsePrimaryAbility();Вызывает основную способность оружия.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- UsePrimaryAbility передаёт GameActions.UsePrimaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
- В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
- GameActions переключает бит выбора способности 0x80. Уже выбранная способность посылает ID 0 и снимает выбор; иначе очищаются оба бита выбора, посылается выбранный ID, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UsePrimaryAbility");
UO.UsePrimaryAbility();Параметры и ход выполнения:
- Вызывает основную способность оружия.
UO.UsePrimaryAbility();Параметры и ход выполнения:
- UsePrimaryAbility передаёт GameActions.UsePrimaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}Параметры и ход выполнения:
- В примерах 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
Внутренний код реализации, не самостоятельный скрипт.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSecondaryAbility();Вызывает дополнительную способность оружия.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- UseSecondaryAbility передаёт GameActions.UseSecondaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
- В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
- GameActions переключает бит выбора способности 0x80. Уже выбранная способность посылает ID 0 и снимает выбор; иначе очищаются оба бита выбора, посылается выбранный ID, затем локально ставится его бит. Поэтому повторный вызов может выключить способность. Локальное изменение не означает успешный удар или подтверждение сервера.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UseSecondaryAbility");
UO.UseSecondaryAbility();Параметры и ход выполнения:
- Вызывает дополнительную способность оружия.
UO.UseSecondaryAbility();Параметры и ход выполнения:
- UseSecondaryAbility передаёт GameActions.UseSecondaryAbility(_world) через Invoke. Возвращаемого признака принятия нет; активная способность проверяется отдельно.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}Параметры и ход выполнения:
- В примерах 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
Внутренний код реализации, не самостоятельный скрипт.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 запрос не выполняется.
- Не присваивайте результат формы с аргументом переменной. Немедленное повторное чтение не является сетевым подтверждением.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает или запрашивает боевой режим персонажа.
var active = UO.WarMode();
UO.Print(active);Параметры и ход выполнения:
- WarMode() читает Player.InWarMode локально. WarMode(mode) вызывает GameActions.ToggleWarMode с выбранным режимом; без Player запрос не выполняется.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
return null;
}Параметры и ход выполнения:
- Не присваивайте результат формы с аргументом переменной. Немедленное повторное чтение не является сетевым подтверждением.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
Внутренний код реализации, не самостоятельный скрипт.
public int WarMode() => bridge.WarMode();Параметры: mode (Integer)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
Внутренний код реализации, не самостоятельный скрипт.
public void WarMode(int mode) => bridge.WarMode(mode);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WarTargetID();Читает serial последней цели атаки.
Параметров нет.
int — сохранённый serial; 0 означает, что serial не установлен. Это не bool и не graphic/type; ненулевой ID может уже отсутствовать в мире.
- Источник поля: bridge.LastAttack. Команда не выбирает, не использует и не атакует объект.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает serial последней цели атаки.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Параметры и ход выполнения:
- Источник поля: 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Внутренний код реализации, не самостоятельный скрипт.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ClassicUO — Bad Newbie & C# Scripts IDE