Repository navigation
RU UO Topic magic
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Заклинания, способности и перемещение магией. Для направленного действия заранее настройте цель и проверьте условия применения.
Открыть полный каталог и примеры
| Тема | Команды и пояснения |
|---|---|
| Cast | UO.Cast |
| CastToObject | UO.CastToObject |
| CastAbility | UO.CastAbility |
| Active Spell Ability | UO.IsActiveSpellAbility |
| Spell Timers | UO.TicksSpell |
UO.Cast · UO.CastToObject · UO.CastAbility · UO.IsActiveSpellAbility · UO.TicksSpell
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
UO.Print("Choose the character with the spell cursor");
}
else
{
UO.Print("Cure request rejected");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры, результат и все сценарии
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.AddGate(object? bookSerial);-
bookSerial— значение-идентификатор, которое совместимый скрипт сохраняет как запись legacy-списка. В текущем runtime значение сериализуется в строку; команда не проверяет наличие объекта в мире.
void. Команда не подтверждает наличие книги или создание игрового портала.
- Значение добавляется в список
AddGateтекущего состояния runtime. В ClassicUO этот compatibility-list не вызывает игровое действие и не имеет документированного публичного getter для чтения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.AddGate");
UO.AddGate("0x40012345");Параметры и ход выполнения:
- Сохранить идентификатор как legacy-данные, не открывая ворота.
UO.AddGate("0x40012345");Параметры и ход выполнения:
- Использовать значение из строки, переданное совместимому скрипту.
return RunScenario();
object? RunScenario()
{
var bookSerial = "0x40012345";
UO.AddGate(bookSerial);
return null;
}Параметры и ход выполнения:
- Записать значение в runtime-список AddGate.
- Вызов хранит compatibility-данные; он не использует книгу в мире.
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()
{
RememberGateBook("0x40012345");
return null;
}
void RememberGateBook(dynamic bookSerial)
{
UO.AddGate(bookSerial);
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: bookSerial (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Внутренний код реализации, не самостоятельный скрипт.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.AddRecall(object? bookSerial);-
bookSerial— значение-идентификатор, которое совместимый скрипт сохраняет как запись legacy-списка. Runtime сериализует переданное значение в строку.
void. Вызов не возвращает результат и не подтверждает наличие книги.
- Значение добавляется в список
AddRecallтекущего состояния runtime. В ClassicUO этот compatibility-list сам не отправляет игровые команды и не имеет документированного публичного getter для чтения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.AddRecall");
UO.AddRecall("0x40012345");Параметры и ход выполнения:
- Сохранить значение как compatibility-данные, не запускать Recall.
UO.AddRecall("0x40012345");Параметры и ход выполнения:
- Передать идентификатор через строковую переменную.
return RunScenario();
object? RunScenario()
{
var bookSerial = "0x40012345";
UO.AddRecall(bookSerial);
return null;
}Параметры и ход выполнения:
- Каждый вызов добавляет отдельную запись в AddRecall текущего runtime.
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.AddRecall("0x40012345");
UO.AddRecall("0x40012346");
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: bookSerial (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Внутренний код реализации, не самостоятельный скрипт.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Cast(object? spellName);Запрашивает применение заклинания по названию. Ровно один параметр: spellName, например UO.Cast("Heal"). Цель выбирается отдельно: мышкой появившимся прицелом либо через WaitTargetObject перед Cast. Принятие запроса не подтверждает успешный эффект.
-
spellName— Обязательная строка — английское название заклинания в кавычках: "Heal", "Cure", "Greater Heal". Имена не переводятся вместе с интерфейсом. Словарь также распознаёт встроенные алиасы и слова заклинаний. Числовой ID, включая строку "29", target, расстояние, notoriety, maxZ и ожидание не являются параметрами Cast. Все имена и школы.
int: 1/true — клиент принял запрос; 0/false — название не распознано либо запрос локально отклонён. Можно писать if UO.Cast("Heal") { ... } либо сравнивать с 1/true. Это не ID заклинания и не подтверждение лечения/урона. Отсутствующий или лишний аргумент вызывает ошибку. Прицел и завершение заклинания команда не ожидает.
- Единственная форма: UO.Cast(spellName). Второго и следующих аргументов нет. Поиск цели, подготовка ответа, ожидание и очистка выполняются отдельными командами.
- Для ручного выбора очистите свою прежнюю очередь CancelWaitTarget, вызовите Cast и щёлкните нужный объект прицелом. Сам Cast очередь не очищает: сценарий мог подготовить её заранее.
- Для автоматической цели сначала вызовите WaitTargetObject(serial/алиас), затем Cast(name). Такой порядок позволяет ответить на быстрый прицел сервера. Для заклинаний без прицела ответ не подготавливайте.
- Сервер определяет доступность заклинания, ресурсы, допустимую цель, дальность и эффект. Положительный результат подтверждает только локальное принятие запроса.
- Подготовленная очередь может остаться при отказе сервера без прицела. Удалите её CancelWaitTarget после ограниченного ожидания или локального отказа. Не запускайте параллельно другие сценарии с target.
- Принятый запрос обновляет TicksSpell. Cast не ждёт анимацию, лечение или изменение HP. Каталожный ID объясняет внутренний протокол, но не заменяет название в аргументе.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Cast("Cure");
UO.Print("Cast: " + Convert.ToString(result));Параметры и ход выполнения:
- Cure — единственный аргумент Cast. После запуска выберите персонажа игровым прицелом. Серверный отказ и результат проверяйте в игре.
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
UO.Print("Choose the character with the spell cursor");
}
else
{
UO.Print("Cure request rejected");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- self — аргумент WaitTargetObject; Heal — единственный аргумент Cast. 3000 — три секунды для прицела в этом примере, не гарантия завершения лечения. Finally удаляет оставшийся ответ и при отказе.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject("self");
if (Truth(UO.Cast("Heal")))
{
await Delay(3000);
}
}
finally
{
UO.CancelWaitTarget();
}
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;Параметры и ход выполнения:
- spellName, target, cleanupDelayMs — параметры вашей функции CastAtObject, не перегрузка UO.Cast. Внутри Cast принимает только spellName. ASC переводит строковый ID в число; 4000 — задержка очистки очереди. true означает принятие запроса, не успех лечения.
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 = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(await CastAtObject("Greater Heal", target, 4000)))
{
UO.Print("Request sent; verify healing in the game");
}
return null;
}
async Task<dynamic> CastAtObject(dynamic spellName, dynamic target, dynamic cleanupDelayMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(target <= 0) || !(Truth(UO.Exists(target))))
{
return false;
}
dynamic accepted = false;
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject(target);
accepted = UO.Cast(spellName);
if (Truth(accepted))
{
await Delay(cleanupDelayMs);
}
}
finally
{
UO.CancelWaitTarget();
}
return accepted;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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.
Параметры: spellName (String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Cast. -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\")."). -
InjectionScript.Runtime.InjectionApiUO.CastCore:CastCore(spellName).
Внутренний код реализации, не самостоятельный скрипт.
public int Cast(string spellName)
{
if (NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _))
{
SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\").");
return 0;
}
return CastCore(spellName) ? 1 : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.CastAbility(object? abilityId);Переключает выбранную способность текущего оружия через UseAbility: повторный вызов уже выбранной способности снимает выбор.
-
abilityId— Название способности или числовая строка, разрешаемая ResolveClassicUOAbilityId; неизвестное значение даёт 0.
int 1 — клиент вызвал текущую primary/secondary способность; 0 — нет персонажа, неизвестный ID или способность не соответствует текущему оружию.
- 1 описывает принятие клиентского запроса, а не успешный удар или списание ресурсов сервером. ID, не являющийся текущей primary/secondary способностью, возвращает 0 даже если есть в каталоге.
- GameActions.UsePrimaryAbility/UseSecondaryAbility проверяют бит 0x80. При выключенном бите снимают другой выбор и отправляют выбранную способность; при уже включённом отправляют ID 0 для отключения. Затем переключают бит. Возврат 1 подтверждает вызов этой клиентской ветки, включая отключение.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.CastAbility(UO.GetAbilityID("Armor Ignore"));
UO.Print("CastAbility: " + Convert.ToString(result));Параметры и ход выполнения:
- Наличие в каталоге отдельно от соответствия оружию.
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.CastAbility(id);
UO.Print(Convert.ToString(accepted));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Имя разрешается в ID и проверяется против текущего оружия.
return RunScenario();
object? RunScenario()
{
var accepted = UO.CastAbility("Armor Ignore");
UO.Print(Convert.ToString(accepted));
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 accepted = UO.CastAbility(0);
UO.Print(Convert.ToString(accepted));
return null;
}
}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 · 繁體中文 · 日本語 · 한국어
dynamic UO.CastToObject(object? spellName, object? objID);Ставит ожидающую объектную цель и отправляет заклинание по имени или числовому ID.
-
spellName— string с именем заклинания, в том числе underscore вместо пробела, либо числовой ID для bridge.Cast. -
objID— Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.
int/логический результат 1 — клиент принял запрос Cast; 0 — запрос отклонён. Успех заклинания сервером не подтверждается.
- Строковая форма идёт через CastAtTarget; числовая форма ставит WaitTargetObject, затем bridge.Cast. При отказе Cast отменяется ожидающая цель. При принятии обновляется ticksSpell.
- Bridge отклоняет неположительный spellId, отсутствие соединения и мёртвого персонажа. Таймер отмечает отправку, а не окончание кастования; результат воздействия на объект зависит от сервера.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.CastToObject("Heal", "self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Heal ставит self целью следующего серверного курсора.
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));Параметры и ход выполнения:
- Числовая форма передаёт ID 4 клиенту; 1 означает отправку запроса.
return RunScenario();
object? RunScenario()
{
var accepted = UO.CastToObject(4, UO.Self());
UO.Print(Convert.ToString(accepted));
return null;
}Параметры и ход выполнения:
- Локальная проверка существования помогает не использовать отсутствующий lasttarget.
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 target = UO.LastTarget();
if (Truth(UO.Exists(target)))
{
var accepted = UO.CastToObject("Greater Heal", target);
UO.Print(Convert.ToString(accepted));
}
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.
Параметры: spellName (Any), objID (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CastAtTarget:CastAtTarget(arguments[0], arguments[1]). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Cast:bridge.Cast(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelTarget:bridge.CancelTarget().
Внутренний код реализации, не самостоятельный скрипт.
case "casttoobject":
if (arguments[0].Kind == InjectionValueKind.String)
return CastAtTarget(arguments[0], arguments[1]) != 0 ? InjectionValue.True : InjectionValue.False;
WaitTargetObject(Arg(1));
int castAccepted = bridge.Cast(Arg(0));
if (castAccepted != 0)
{
ticksSpell = Timer();
return InjectionValue.True;
}
bridge.CancelTarget();
return InjectionValue.False;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.IsActiveSpellAbility(object? spellName);Проверяет, сообщил ли сервер об активном состоянии выбранной способности/заклинания. Полезна перед повторной активацией поддерживаемой способности. Сама ничего не включает, не кастует и не выбирает цель.
-
spellName— Единственный обязательный параметр: английское имя из каталога заклинаний или целый ID. Например, "Confidence" и 402 обозначают одно заклинание Bushido. Регистр не важен, подчёркивания в имени заменяются пробелами. Числовая строка тоже распознаётся. Не передавайте ID персонажа, type предмета или номер навыка.
int: 1 — сервер сообщил активное состояние этого ID; 0 — такого активного состояния сейчас нет. В C# проверяйте числовой результат: if (UO.IsActiveSpellAbility(402) != 0) { ... }. Это логический признак, а не количество, время или результат последнего каста. Неизвестное имя, ID вне 1…65535 и отсутствие полученного состояния тоже дают 0.
- Список обновляет пакет сервера 0xBF/0x25: включение добавляет ID, выключение убирает. Работает без графического окна и без кнопки заклинания на экране. Закрытие окна сохраняет состояние; разрыв соединения очищает его. Ответ 0 не доказывает, что персонаж не способен использовать заклинание. Сервер должен присылать этот статус; это не универсальная проверка всех баффов. Для мгновенных Heal/Recall такой пример не подтверждает успешный каст. Длительность, оставшаяся мана, доступность и успех заклинания этой командой не определяются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.IsActiveSpellAbility(402);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- 402 — ID Confidence. Переменная active содержит 1 либо 0; true здесь эквивалентен 1. Сообщение описывает полученный статус, не результат попытки каста.
var active = UO.IsActiveSpellAbility(402);
if (Truth(Truth(active) == true))
{
UO.Print("Confidence is active");
}
else
{
UO.Print("No active Confidence state received");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- "Confidence" — тот же ID 402. Cast принимает только название. Запрос отправляется один раз, если активного статуса нет; он не гарантирует успех на сервере. Не запускайте этот фрагмент в быстром цикле: ответ сервера может запаздывать.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsActiveSpellAbility("Confidence") == 0))
{
UO.Cast("Confidence");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- spell — название или ID; expected — true для включения, false для выключения; timeoutMs — предел ожидания в миллисекундах. Main ждёт до 500 мс с проверками каждые 25 мс и ничего не кастует. Функция возвращает true при совпадении, иначе false. Это ограниченное ожидание локального состояния, не доказательство причины его изменения; фактическое время может увеличиться при паузе скрипта или нагрузке.
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()
{
if (Truth(WaitAbilityState("Confidence", true, 500)))
{
UO.Print("Active state received");
}
else
{
UO.Print("No active state before timeout");
}
return null;
}
dynamic WaitAbilityState(dynamic spell, dynamic expected, dynamic timeoutMs)
{
var elapsed = 0;
while (Truth(elapsed < timeoutMs))
{
if (Truth((UO.IsActiveSpellAbility(spell) == 1) == expected))
{
return true;
}
UO.Wait(25);
elapsed = elapsed + 25;
}
return Truth((UO.IsActiveSpellAbility(spell) == 1) == expected);
}
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.
Параметры: spellName (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ConvertSpellName:ConvertSpellName(Text(0).Replace('_', ' ')). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsActiveSpell:bridge.IsActiveSpell(spellId.Value).
Внутренний код реализации, не самостоятельный скрипт.
case "isactivespellability":
{
int? spellId = arguments[0].Kind == InjectionValueKind.String
? ConvertSpellName(Text(0).Replace('_', ' '))
: (int?)Arg(0);
return new InjectionValue(spellId.HasValue ? bridge.IsActiveSpell(spellId.Value) : 0);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TicksSpell();Читает сохранённую отметку TicksSpell.
Параметров нет.
int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.
- Возвращает поле ticksSpell. Его обновляет успешно принятый Cast/CastAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.TicksSpell();
UO.Print("TicksSpell: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает сохранённую отметку TicksSpell.
var stamp = UO.TicksSpell();
UO.Print(stamp);Параметры и ход выполнения:
- Возвращает поле ticksSpell. Его обновляет успешно принятый Cast/CastAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksSpell();
var ageTenths = UO.Timer() - stamp;
UO.Print(ageTenths);
return null;
}Параметры и ход выполнения:
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
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.TicksSpell();
UO.Wait(250);
var after = UO.TicksSpell();
UO.Print(before = after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public int TicksSpell() => ticksSpell;ClassicUO — Bad Newbie & C# Scripts IDE