RU UO Topic mobiles - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Персонажи, NPC, монстры и питомцы, уже известные клиенту. Serial определяет конкретное существо, body/type — его графику; это разные значения.
| Тема | Команды и пояснения |
|---|---|
| Players | UO.GetMobiles · UO.FindMobile |
| NPC | UO.IsNpc · UO.FindMobile |
| Monsters | UO.FindType · UO.FindMobile |
| Pets | UO.GetPetsCurrent · UO.GetPetsMax |
| Followers | UO.GetFollowers · UO.GetFollowersMax |
| Name / Serial / Body | UO.GetName · UO.GetSerial · UO.GetType |
| Координаты | UO.GetX · UO.GetY · UO.GetZ |
| Distance | UO.GetDistance |
| Notoriety | UO.Notoriety |
| Status | UO.GetStatus · UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Paralyzed |
| Rename | UO.Rename |
UO.GetMobile · UO.GetMobiles · UO.IsNpc
UO.Followers · UO.GetFollowers · UO.FollowersMax · UO.GetFollowersMax · UO.PetsCurrent · UO.GetPetsCurrent · UO.PetsMax · UO.GetPetsMax
UO.Notoriety · UO.GetNotoriety
UO.CanChangeName · UO.MobileCanBeRenamed · UO.Rename · UO.RenameMobile
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);
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 value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.CanChangeName(object? id);Проверяет известный клиенту признак возможности переименовать mobile.
-
id— Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.
int 1 — загруженный mobile имеет признак IsRenamable. 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.CanChangeName("self");
UO.Print("CanChangeName: " + Convert.ToString(result));Параметры и ход выполнения:
- Аргумент self явно выбирает своего персонажа. state — только 1/0.
- Это последнее серверное разрешение, например для питомца. Команда не переименовывает объект и не гарантирует, что последующий запрос будет принят сервером.
var state = UO.CanChangeName("self");
if (Truth(state))
{
UO.Print("Rename permission flag is present");
}
else
{
UO.Print("Rename permission flag is absent");
}
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.
- Результат относится к полю IsRenamable. Данные обновляются только после получения соответствующего состояния клиентом.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.CanChangeName(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.CanChangeName(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.CanChangeName(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.
Параметры: id (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.CanChangeName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CanChangeName:bridge.CanChangeName(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public int CanChangeName(InjectionValue id) => bridge.CanChangeName(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Followers();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: занятые слоты управления питомцами.
Параметров нет.
int — занятые слоты управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.Followers, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsCurrent/Followers сообщает занятые слоты управления из своего статуса type >= 3. Один питомец может занимать несколько слотов; правила для призванных и приручённых существ задаёт сервер. Это не число видимых mobile, не список ID питомцев и не число животных рядом.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Followers();
UO.Print("Followers: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [Followers]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.FollowersMax();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: максимум слотов управления питомцами.
Параметров нет.
int — максимум слотов управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.FollowersMax, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsMax/FollowersMax сообщает общий разрешённый сервером предел слотов из статуса type >= 3, а не свободные слоты. Занятых слотов может быть больше предела. Свободную ёмкость считайте как maximum - current, заменяя отрицательный результат на 0. Команда ничего не отпускает, не приручает и не призывает.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.FollowersMax();
UO.Print("FollowersMax: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [FollowersMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersMaxСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetFollowers();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: занятые слоты управления питомцами.
Параметров нет.
int — занятые слоты управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.Followers, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsCurrent/Followers сообщает занятые слоты управления из своего статуса type >= 3. Один питомец может занимать несколько слотов; правила для призванных и приручённых существ задаёт сервер. Это не число видимых mobile, не список ID питомцев и не число животных рядом.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetFollowers();
UO.Print("GetFollowers: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.GetFollowers();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetFollowers]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetFollowersMax();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: максимум слотов управления питомцами.
Параметров нет.
int — максимум слотов управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.FollowersMax, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsMax/FollowersMax сообщает общий разрешённый сервером предел слотов из статуса type >= 3, а не свободные слоты. Занятых слотов может быть больше предела. Свободную ёмкость считайте как maximum - current, заменяя отрицательный результат на 0. Команда ничего не отпускает, не приручает и не призывает.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetFollowersMax();
UO.Print("GetFollowersMax: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.GetFollowersMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetFollowersMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersMaxСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMobile(object? id);Собирает компактную запись свойств по одному ID.
-
id— Serial/ID конкретного объекта: int, десятичная/hex-строка или установленный алиас self, backpack, lasttarget, lastobject либо имя AddObject. Это не graphic/type.
Array из 9 полей: [0] int serial, [1] string имя, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int notoriety, [8] int направление 0..7. Для неизвестного ID массив тоже имеет 9 полей: переданный ID сохраняется, имя пустое, недоступные числовые свойства равны 0. Это не полный Pascal record TMobile.
- Читаются данные, уже загруженные клиентом. Команда не открывает контейнер, не перемещает предметы и не загружает объекты со всего сервера.
- Array — массив с индексами от 0. Сохраняйте его в var, проверяйте ArrayLength перед доступом. Элементы могут исчезнуть из мира после создания снимка: перед действием проверяйте Exists(serial).
- Наличие девяти полей не подтверждает существование персонажа; используйте Exists. Команда сама не проверяет, что ID принадлежит именно Mobile. Для предмета могут вернуться его имя/координаты и нулевые свойства персонажа.
- HP/MaxHP другого персонажа зависят от присланной сервером шкалы. Z — высота, не слой экипировки.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetMobile("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- ID=self. [1] — имя, [5]/[6] — текущие и максимальные HP, а не Mana.
- Массив имеет фиксированные девять полей. Пустое имя и 0/0 возможны до входа в мир.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));Параметры и ход выполнения:
- lasttarget должен указывать на персонажа. [2]/[3]/[4] — X/Y/Z мира.
- Сначала проверяется наличие объекта. Если target — предмет в сумке, координаты относятся к его гампу.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var mobile = UO.GetMobile(target);
UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- [7] — значение notoriety, [8] — направление 0..7. Ни одно поле не является type.
- Команда читает известные данные, не направляет персонажа и не переключает боевой режим.
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.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var mobile = UO.GetMobile(target);
UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
UO.Print("Direction: " + Convert.ToString(mobile[8]));
}
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.
Параметры: id (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetHP:bridge.GetHP(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMaxHP:bridge.GetMaxHP(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(id).
Внутренний код реализации, не самостоятельный скрипт.
case "getmobile":
{
int id = Arg(0);
return new InjectionValue(new[]
{
new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),
new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),
new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))
});
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);Получает массив ID подходящих загруженных персонажей/NPC. Нужен, когда скрипту надо проверить несколько целей, выбрать свою, посчитать окружение или добавить собственное условие перед действием.
-
distance— Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются. -
notoriety— Статус отношения к персонажу, полученный от сервера: 0 — неизвестный, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 — Invulnerable. Число означает один статус; "5|6" или массив чисел — любой из перечисленных. Это не цвет одежды и не класс. Отрицательное число (обычно -1), 0xFFFF, "any", пустая строка или пустой массив отдельно отключают этот фильтр. Некорректная строка без допустимых чисел не находит никого. Порядок статусов приоритет не задаёт. Фильтр 5 выбирает Enemy, а не автоматически любого NPC/монстра; реальные значения зависят от сервера. -
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 по умолчанию сохраняет порядок клиента. Это не дополнительный радиус и не выбор одного объекта. -
includeSelf— true/1 позволяет включить self, если все остальные фильтры и Ignore это допускают. false/0 по умолчанию исключает self. Включение не гарантирует наличие self в результате. -
aliveOnly— true/1 исключает mobiles с IsDead != 0; false/0 по умолчанию не добавляет это условие. Не сравнение HP с нулём, не поиск трупов-предметов и не гарантия, что цель останется живой после вызова. -
visibleOnly— true/1 требует IsVisible=1 по текущему состоянию ClassicUO; false/0 по умолчанию не добавляет условие. Это видимость загруженного объекта клиенту, а не проверка стен/линии обзора. Для геометрической проверки есть отдельная UO.CheckLOS с координатами; сервер всё равно может отклонить действие.
Array — serial mobiles. Пустой массив означает отсутствие совпадений; проверяйте ArrayLength перед targets[0]. Не body/type, не суммарные HP, не 1/0. Форма без аргументов всё равно применяет FindDistance/FindVertical/Ignore и исключает self.
- Поиск локальный: только уже загруженные 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.
- Поддерживаются 0..8 позиционных аргументов. classMask и color в этой команде отсутствуют; не переносите сюда порядок аргументов AttackNearest.
- Массив — снимок ID. Цель может исчезнуть позднее; повторно проверьте Exists, если между поиском и действием было ожидание. Ничего не атакует самостоятельно.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- nearestFirst=true делает allies[0] ближайшим союзником. Follow включает фоновую ходьбу; останавливается UO.Follow(0). Название/класс союзника не определяются этой командой.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);
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;Параметры и ход выполнения:
- Здесь nearest=false уместен: важен счётчик. ArrayLength — число mobiles, не количество предметов в стопке. Alarm печатает уведомление в журнал.
return RunScenario();
object? RunScenario()
{
var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
var count = ArrayLength(enemies);
if (Truth(count == 1))
{
UO.Attack(enemies[0]);
}
else if (Truth(count > 1))
{
UO.Alarm();
}
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;Параметры и ход выполнения:
- distance=0 — одинаковые X/Y, maxZ=0 — одинаковый Z. body ограничен двумя graphic. includeSelf=true разрешает self, но он по-прежнему должен подходить по body и aliveOnly. Пример сообщает о других персонажах на той же клетке.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
var i = 0;
var others = 0;
while (Truth(i < ArrayLength(sameCell)))
{
if (Truth(sameCell[i] != UO.GetSerial("self")))
{
others += 1;
}
i += 1;
}
if (Truth(others > 0))
{
UO.Alarm();
}
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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Параметры: distance (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Параметры: distance (Any), notoriety (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Параметры: distance (Any), notoriety (Any), body (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Параметры: distance (Any), notoriety (Any), body (Any), maxZ (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Параметры: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf) — UO.GetMobiles(Any,Any,Any,Any,Any,Any)
Параметры: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)
Параметры: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)
Параметры: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => CompactGetMobiles(values)Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetNotoriety();
int UO.GetNotoriety(object? id);Читает репутацию персонажа из модели клиента.
-
id— Необязательный объект только в указанных однопараметрических формах: serial числом/hex-строкой, "self", "lasttarget" или имя AddObject. Это не graphic/type. Без аргумента читается собственный персонаж. Перед чтением другого объекта проверяйте UO.Exists; неизвестное имя не открывает прицел.
int — 0=unknown, 1=innocent, 2=ally, 3=gray, 4=criminal, 5=enemy, 6=murderer, 7=invulnerable. Это код состояния, а не hue, karma или fame. Неизвестный mobile даёт 0.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Репутацию персонажа сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Репутацию персонажа используется в показанном расчёте или условии.
- Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return RunScenario();
object? RunScenario()
{
var value = UO.GetNotoriety();
if (Truth(value == 3) || Truth(value == 4))
{
UO.Print("Gray or criminal notoriety");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Единственный аргумент выбирает объект lasttarget; его serial должен быть известен клиенту. Graphic/type сюда не передаётся.
- Данные другого объекта могут быть неизвестны даже при положительном Exists. Для координат предмета в сумке получается позиция контейнера, а не точка мира.
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(UO.Exists("lasttarget")))
{
var targetValue = UO.GetNotoriety("lasttarget");
UO.Print("Selected value: " + Convert.ToString(targetValue));
}
else
{
UO.Print("Target is not loaded");
}
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.RegisterCharacterGetterAliases [GetNotoriety]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetNotoriety(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Параметры: id (Any/Integer/String)
Результат: int / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));Параметры: id (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetNotoriety. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(id).
Внутренний код реализации, не самостоятельный скрипт.
public int GetNotoriety(int id) => bridge.GetNotoriety(id);Параметры: id (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetNotoriety. -
InjectionScript.Runtime.InjectionApiUO.GetNotoriety:GetNotoriety(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public int GetNotoriety(string id) => GetNotoriety(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetPetsCurrent();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: занятые слоты управления питомцами.
Параметров нет.
int — занятые слоты управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.Followers, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsCurrent/Followers сообщает занятые слоты управления из своего статуса type >= 3. Один питомец может занимать несколько слотов; правила для призванных и приручённых существ задаёт сервер. Это не число видимых mobile, не список ID питомцев и не число животных рядом.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetPetsCurrent();
UO.Print("GetPetsCurrent: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.GetPetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetPetsCurrent]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetPetsMax();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: максимум слотов управления питомцами.
Параметров нет.
int — максимум слотов управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.FollowersMax, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsMax/FollowersMax сообщает общий разрешённый сервером предел слотов из статуса type >= 3, а не свободные слоты. Занятых слотов может быть больше предела. Свободную ёмкость считайте как maximum - current, заменяя отрицательный результат на 0. Команда ничего не отпускает, не приручает и не призывает.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetPetsMax();
UO.Print("GetPetsMax: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.GetPetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetPetsMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.FollowersMaxСоздание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsNPC(object? objID);Проверяет загруженный mobile по явно переданному serial.
-
objID— Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Только у IsNpc также зарегистрирована форма без аргументов: используется self.
int 1 — загруженный, не удалённый mobile. int 0 — предмет, неизвестный serial или удалённый объект. Название IsNPC не означает «только неигровой персонаж»: собственный персонаж и другие игроки тоже дают 1.
Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.
- Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
- Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
- Игровой диспетчер обрабатывает IsNpc и IsNPC как варианты одного имени; в исходном коде C# используйте точное написание публичной формы. По этому результату нельзя надёжно отличить игрока от NPC; правила такого различения зависят от сервера.
В C# регистр символов имени значим: UO.IsNPC требует аргумент; форма UO.IsNpc() без аргументов выбирает self. Оба имени проверяют mobile, включая игроков, а не исключительно NPC.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsNPC(UO.Self());
UO.Print("IsNPC: " + Convert.ToString(result));Параметры и ход выполнения:
- Эта C#-форма требует аргумент. Собственный персонаж также даёт 1; это проверка mobile, а не исключительно NPC.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");Параметры и ход выполнения:
- Serial берётся из lasttarget. Координаты читаются только при наличии известного клиенту mobile.
return RunScenario();
object? RunScenario()
{
string target = UO.GetSerial("lasttarget");
if (UO.IsNPC(target) == 0)
return false;
UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
return true;
return null;
}Параметры и ход выполнения:
- Вошедший в мир персонаж является mobile, а рюкзак — предметом. Результат относится к моменту локального чтения.
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()
{
int character = UO.IsNPC(UO.Self());
int bag = UO.IsNPC(UO.Backpack());
UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: objID (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsNpc:bridge.IsNpc(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsNpc();
int UO.IsNpc(object? id);-
id— Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Только у IsNpc также зарегистрирована форма без аргументов: используется self.
int 1 — загруженный, не удалённый mobile. int 0 — предмет, неизвестный serial или удалённый объект. Название IsNPC не означает «только неигровой персонаж»: собственный персонаж и другие игроки тоже дают 1.
Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.
- Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
- Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
- Игровой диспетчер обрабатывает IsNpc и IsNPC как варианты одного имени; в исходном коде C# используйте точное написание публичной формы. По этому результату нельзя надёжно отличить игрока от NPC; правила такого различения зависят от сервера.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsNpc();
UO.Print("IsNpc: " + Convert.ToString(result));Параметры и ход выполнения:
- Форма без аргументов выбирает self. Результат 1/0 не является serial и не отличает NPC от игрока.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");Параметры и ход выполнения:
- Предварительно выберите lasttarget. Сначала проверяется загрузка объекта; классификация mobile не определяет его враждебность.
return RunScenario();
object? RunScenario()
{
string target = UO.GetSerial("lasttarget");
if (UO.Exists(target) == 0)
UO.Print("Target is not loaded");
else
UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
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()
{
string target = UO.GetSerial("lasttarget");
if (UO.IsNpc(target) != 0)
UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
InjectionScript.Runtime.InjectionApiUO.IsNpc:IsNpc(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутренний код реализации, не самостоятельный скрипт.
public int IsNpc() => IsNpc(bridge.Self);Параметры: id (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsNpc:bridge.IsNpc(id).
Внутренний код реализации, не самостоятельный скрипт.
public int IsNpc(int id) => bridge.IsNpc(id);Параметры: id (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
InjectionScript.Runtime.InjectionApiUO.IsNpc:IsNpc(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public int IsNpc(string id) => IsNpc(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MobileCanBeRenamed(object? mobID);Проверяет известный клиенту признак возможности переименовать mobile.
-
mobID— Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.
int 1 — загруженный mobile имеет признак IsRenamable. 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.MobileCanBeRenamed("self");
UO.Print("MobileCanBeRenamed: " + Convert.ToString(result));Параметры и ход выполнения:
- Аргумент self явно выбирает своего персонажа. state — только 1/0.
- Это последнее серверное разрешение, например для питомца. Команда не переименовывает объект и не гарантирует, что последующий запрос будет принят сервером.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
UO.Print("Rename permission flag is present");
}
else
{
UO.Print("Rename permission flag is absent");
}
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.
- Результат относится к полю IsRenamable. Данные обновляются только после получения соответствующего состояния клиентом.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.MobileCanBeRenamed(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.MobileCanBeRenamed(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.MobileCanBeRenamed(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.
Параметры: mobID (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CanChangeName:bridge.CanChangeName(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Notoriety();Читает репутацию персонажа из модели клиента.
Параметров нет.
int — 0=unknown, 1=innocent, 2=ally, 3=gray, 4=criminal, 5=enemy, 6=murderer, 7=invulnerable. Это код состояния, а не hue, karma или fame. Неизвестный mobile даёт 0.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Репутацию персонажа сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Репутацию персонажа используется в показанном расчёте или условии.
- Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return RunScenario();
object? RunScenario()
{
var value = UO.Notoriety();
if (Truth(value == 3) || Truth(value == 4))
{
UO.Print("Gray or criminal notoriety");
}
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(1000) даёт паузу в миллисекундах между снимками.
- Сравнивается изменение: репутацию персонажа. Пример ничего не изменяет в мире и не ждёт бесконечно. События внутри этой секунды могут быть пропущены.
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 before = UO.Notoriety();
await Delay(1000);
var after = UO.Notoriety();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Notoriety]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetNotoriety(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PetsCurrent();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: занятые слоты управления питомцами.
Параметров нет.
int — занятые слоты управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.Followers, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsCurrent/Followers сообщает занятые слоты управления из своего статуса type >= 3. Один питомец может занимать несколько слотов; правила для призванных и приручённых существ задаёт сервер. Это не число видимых mobile, не список ID питомцев и не число животных рядом.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PetsCurrent();
UO.Print("PetsCurrent: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
Внутренний код реализации, не самостоятельный скрипт.
case "petscurrent": return new InjectionValue(bridge.Followers);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PetsMax();Помогает заранее решить, хватит ли персонажу места для следующего приручённого или призванного существа. Followers показывает занятые слоты управления, FollowersMax — их общий предел. Это не число животных рядом и не команда движения Follow. Читает счётчик статуса своего персонажа: максимум слотов управления питомцами.
Параметров нет.
int — максимум слотов управления питомцами, 0..255 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.
- Например, занято 3 из 5 — свободно 2 слота. Значение 4 может означать четыре существа по одному слоту, одно на четыре либо другую комбинацию. Для существа на 2 слота проверки «занято < максимум» недостаточно: нужно maximum - current >= 2. Стоимость конкретного существа и лимит определяет сервер; не подставляйте постоянное 5 вместо FollowersMax.
- 0 не доказывает, что питомец потерян, умер или отпущен: это может быть пустой либо ещё не обновлённый статус. Увеличение счётчика — лишь дополнительный признак изменения контроля; оно не определяет, какое существо приручено. Проверяйте также сообщения сервера и самого питомца. Эти слоты не равны местам в конюшне.
- Команда не принимает аргументов. Используйте точные сигнатуры выше.
- Чтение в игровом потоке берёт Player.FollowersMax, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
- PetsMax/FollowersMax сообщает общий разрешённый сервером предел слотов из статуса type >= 3, а не свободные слоты. Занятых слотов может быть больше предела. Свободную ёмкость считайте как maximum - current, заменяя отрицательный результат на 0. Команда ничего не отпускает, не приручает и не призывает.
- CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
- Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
- Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PetsMax();
UO.Print("PetsMax: " + Convert.ToString(result));Параметры и ход выполнения:
- current — занято, maximum — предел, freeSlots — разница. При неизвестном/нулевом пределе или противоречивых данных пример прекращается, не утверждая, что место свободно. Команда только читает последний статус, не запрашивает новое обновление.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сначала выберите нужное животное, чтобы его ID был в lasttarget. requiredSlots=2 — настройка примера, замените её реальной стоимостью этого существа на вашем сервере. При нехватке места не ставится target и не вызывается навык. Иначе очередь цели готовится ДО единственного аргумента UseSkill("Animal Taming"). Начало попытки не гарантирует успеха: важны навык, дальность, приручаемость и ответ сервера.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- CanAddFollower — полностью объявленный пользовательский помощник, не новая UO-команда. Он возвращает 1/true при достаточном кэшированном лимите, иначе 0/false. Параметр extraSlots — стоимость ДОБАВЛЯЕМОГО существа, не его type/ID. 2 — пример; функция не приручает и не призывает. Проверку следует повторить непосредственно перед действием.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
Внутренний код реализации, не самостоятельный скрипт.
case "petsmax": return new InjectionValue(bridge.FollowersMax);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Rename(object? mobile, object? newName);Запрашивает изменение имени персонажа/питомца.
-
mobile— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект. -
newName— Текст через ToString; сохраняется как передан.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Порядок — serial, затем новое имя. Bridge.RenameMobile вызывает GameActions.Rename(serial, name). API не проверяет CanChangeName и не меняет локальное Name сам.
- Сервер проверяет право переименования. Для питомца сначала проверьте MobileCanBeRenamed; запрос не гарантирует принятия имени.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");Параметры и ход выполнения:
- Запрашивает изменение имени персонажа/питомца.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
UO.Rename(id, "Companion");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Порядок — serial, затем новое имя. Bridge.RenameMobile вызывает GameActions.Rename(serial, name). API не проверяет CanChangeName и не меняет локальное Name сам.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
{
UO.Rename(id, "Guardian");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сервер проверяет право переименования. Для питомца сначала проверьте MobileCanBeRenamed; запрос не гарантирует принятия имени.
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()
{
RenamePet(UO.GetSerial("lasttarget"), "Companion");
return null;
}
void RenamePet(dynamic id, dynamic name)
{
if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
{
UO.Rename(id, name);
}
}
int Len(object? value) => Convert.ToString(value)?.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.
Параметры: mobile (Any), newName (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RenameMobile:bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
Внутренний код реализации, не самостоятельный скрипт.
case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RenameMobile(object? mobID, object? newName);Запрашивает изменение имени персонажа/питомца.
-
mobID— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект. -
newName— Текст через ToString; сохраняется как передан.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Порядок — serial, затем новое имя. Bridge.RenameMobile вызывает GameActions.Rename(serial, name). API не проверяет CanChangeName и не меняет локальное Name сам.
- Сервер проверяет право переименования. Для питомца сначала проверьте MobileCanBeRenamed; запрос не гарантирует принятия имени.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");Параметры и ход выполнения:
- Запрашивает изменение имени персонажа/питомца.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
UO.RenameMobile(id, "Companion");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Порядок — serial, затем новое имя. Bridge.RenameMobile вызывает GameActions.Rename(serial, name). API не проверяет CanChangeName и не меняет локальное Name сам.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
{
UO.RenameMobile(id, "Guardian");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Сервер проверяет право переименования. Для питомца сначала проверьте MobileCanBeRenamed; запрос не гарантирует принятия имени.
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()
{
RenamePet(UO.GetSerial("lasttarget"), "Companion");
return null;
}
void RenamePet(dynamic id, dynamic name)
{
if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
{
UO.RenameMobile(id, name);
}
}
int Len(object? value) => Convert.ToString(value)?.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.
Параметры: mobID (Any), newName (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RenameMobile:bridge.RenameMobile(Arg(0), Text(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(1).
Внутренний код реализации, не самостоятельный скрипт.
case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;