Repository navigation
RU UO Topic items Part 2
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MoveItem(object? id);
int UO.MoveItem(object? id, object? amount);
int UO.MoveItem(object? id, object? amount, object? targetContainer);
int UO.MoveItem(object? item, object? amount, object? container, object? x);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y);
int UO.MoveItem(object? id, object? amount, object? targetContainer, object? x, object? y, object? z);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout, object? waitConfirmation);Переносит один конкретный предмет/стек по serial: захват и сброс в контейнер либо на землю.
-
id— Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists. -
item— Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists. -
amount— Количество единиц внутри одного стека. 0 или отрицательное значение означает весь стек; положительное ограничивается доступным количеством. Это НЕ число стопок, которое ограничивает MassMove. По умолчанию 0. -
targetContainer— Serial контейнера или установленное имя AddObject; backpack/self/my выбирают рюкзак, receiving/catchbag — SetCatchBag, а без него рюкзак. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, когда разрешаются в нужный контейнер. ground или 0 явно выбирает землю; -1 — прежний селектор рюкзака. Неизвестное или неустановленное имя вызывает ошибку до захвата предмета. Без аргумента назначения используется рюкзак. -
container— Serial контейнера или установленное имя AddObject; backpack/self/my выбирают рюкзак, receiving/catchbag — SetCatchBag, а без него рюкзак. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, когда разрешаются в нужный контейнер. ground или 0 явно выбирает землю; -1 — прежний селектор рюкзака. Неизвестное или неустановленное имя вызывает ошибку до захвата предмета. Без аргумента назначения используется рюкзак. -
x— При контейнере — X в гампе, по умолчанию 65535 (автоматически). При земле — мировая X, по умолчанию X персонажа. -
y— Y в гампе либо мировая Y; по умолчанию 65535 для контейнера или Y персонажа для земли. -
z— Высота, по умолчанию 0 в контейнере либо Z персонажа на земле. -
timeout— Седьмой аргумент: максимум ожидания в мс, по умолчанию 1000; отрицательное значение приравнивается к 0. Используется только с восьмым waitConfirmation=true. -
waitConfirmation— Восьмой аргумент: true/1 включает ожидание наблюдаемого изменения мира; false/0 (по умолчанию) возвращает результат отправки запроса.
int 1 — клиент принял запрос захвата и сброса; 0 — запрос выполнить не удалось. При waitConfirmation=true единица дополнительно требует наблюдаемого изменения контейнера/координат или уменьшения исходного стека. Это не serial нового стека и не число перенесённых items. Сервер может отказать в действии.
Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.
- Поддерживаются все длины от 1 до 8 аргументов. При заданном x можно опустить y/z: для них применяются описанные значения по умолчанию.
- Известное имя назначения разрешается до захвата. Для земли используйте явно ground/0; опечатка в имени не должна сбрасывать предмет на пол.
- Предмет может находиться в сундуке, сумке или рюкзаке: ground задаёт назначение на земле независимо от исходного контейнера. В первом аргументе указывается serial самого предмета, а не сундука и не type. Команда сама выполняет захват; предварительно брать предмет мышью не нужно.
- При включённом DropCheckCoord сброс на землю дальше двух клеток отклоняется. Сервер дополнительно проверяет доступность места. X/Y — клетки карты, а не пиксели гампа; Z — высота выбранной поверхности, в том числе отрицательная. Для контейнера X/Y по-прежнему означают место внутри его гампа.
- Ожидание подтверждения использует состояние мира клиента: для частичного стека — уменьшение количества, для целого — контейнер, для земли ещё X/Y/Z. Внутри контейнера точное место гампа этим ожиданием не подтверждается; исчезновение/слияние стека может осложнить проверку.
- Это не подтверждение отдельным transaction ID. Если предмет уже находился в том же контейнере, совпадение контейнера не доказывает новое перемещение внутри гампа.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.MoveItem("lasttarget");
UO.Print("MoveItem: " + Convert.ToString(result));Параметры и ход выполнения:
- loot — имя AddObject; amount отсутствует и равен 0, назначение — рюкзак.
- Переносится один предмет/стек, а не все предметы данного типа.
var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));Параметры и ход выполнения:
- amount=10 единиц одной стопки, chest — имя контейнера, x/y=60/70 внутри гампа, z=0.
- Количество не имеет значения «десять стопок», принятого у MassMove.
return RunScenario();
object? RunScenario()
{
var ok = UO.MoveItem("loot", 10, "chest", 60, 70, 0);
return null;
}Параметры и ход выполнения:
- ground явно выбирает землю; отсутствующие X/Y/Z берутся у персонажа.
- Для другой точки передайте её мировые координаты, учитывая дальность и DropCheckCoord.
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 ok = UO.MoveItem("loot", 0, "ground");
return null;
}
}Параметры и ход выполнения:
- ground_item — сохранённый serial выбранного предмета в открытом сундуке. Исходный сундук отдельным параметром не передаётся. amount=0 берёт весь стек; например, 10 возьмёт до десяти единиц этого стека.
- ground явно выбирает землю. x/y — абсолютные координаты клетки на одну клетку по X от персонажа; z берётся у персонажа и подходит, если соседняя поверхность на той же высоте. На лестнице, столе или другом этаже задайте фактическую Z нужной поверхности.
- sent=1 означает отправку запроса клиентом; без восьмого параметра подтверждение сервера не ожидается. Значение 0 означает, что запрос выполнить не удалось. Это числовой флаг int 1/0: проверяйте sent != 0 либо sent == 0; сравнение с bool недопустимо.
- Для сброса непосредственно под ноги достаточно UO.MoveItem('ground_item', 0, 'ground'): все три координаты будут взяты у персонажа. Для помещения внутрь сундука вместо ground укажите serial/имя сундука и координаты его гампа.
UO.AddObject("ground_item");
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
var sent = UO.MoveItem("ground_item", 0, "ground", x, y, z);
if (Truth(sent == 1))
{
UO.Print("Ground move request sent");
}
else
{
UO.Print("Ground move request was not sent");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- timeout=1500 мс используется, потому что waitConfirmation=true. x/y=-1 — автоматическое место.
- 0 может означать тайм-аут уже отправленного запроса. Не повторяйте перенос вслепую; сначала проверьте текущее состояние предмета.
return RunScenario();
object? RunScenario()
{
var ok = UO.MoveItem("loot", 0, "backpack", -1, -1, 0, 1500, true);
if (Truth(ok == 0))
{
UO.Print("Move was rejected or not confirmed");
}
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)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id }).
Внутренний код реализации, не самостоятельный скрипт.
public int MoveItem(InjectionValue id)
=> CompactMoveItem(new[] { id });Параметры: id (Any), amount (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount }).
Внутренний код реализации, не самостоятельный скрипт.
public int MoveItem(InjectionValue id, InjectionValue amount)
=> CompactMoveItem(new[] { id, amount });Параметры: id (Any), amount (Any), targetContainer (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount, targetContainer }).
Внутренний код реализации, не самостоятельный скрипт.
public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer)
=> CompactMoveItem(new[] { id, amount, targetContainer });Параметры: item (Any), amount (Any), container (Any), x (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactMoveItem(values))Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactMoveItem(values))Параметры: id (Any), amount (Any), targetContainer (Any), x (Any), y (Any), z (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount, targetContainer, x, y, z }).
Внутренний код реализации, не самостоятельный скрипт.
public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer, InjectionValue x, InjectionValue y, InjectionValue z)
=> CompactMoveItem(new[] { id, amount, targetContainer, x, y, z });Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactMoveItem(values))
UO.MoveItem(item, amount, container, x, y, z, timeout, waitConfirmation) — UO.MoveItem(Any,Any,Any,Any,Any,Any,Any,Any)
Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any), waitConfirmation (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactMoveItem(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.MoveItems(object? container, object? itemsType, object? itemsColor, object? moveIntoID, object? x, object? y, object? z, object? delayMS);Перекладывает все подходящие предметы непосредственно из одного контейнера в другой либо на землю. Предметы выбираются по graphic и hue; каждая стопка переносится целиком. Это перенос вещей, а не ходьба персонажа и не интерактивное включение MassMove.
-
container— Serial исходного контейнера, например backpack, "backpack", имя AddObject или hex-ID. Содержимое должно быть уже загружено. 0 не является допустимым источником; ground не выбирает вещи вокруг персонажа. Для рюкзака указывайте backpack, а не self. -
itemsType— Graphic предмета, например 0x0EED — золото. Не ID вещи и не тело mobile. Отрицательное число или 0xFFFF — все типы. Массив/маска типов не принимается. -
itemsColor— Hue вещи. -1 (либо другое отрицательное число) и 0xFFFF — любой; 0 — только hue 0. Не serial и не notoriety. -
moveIntoID— Serial контейнера назначения или объектный алиас. Для своего рюкзака — backpack. Для земли — число 0 (также ground/"ground"/UO.Ground()). Источник и назначение должны различаться. -1 не является сокращением backpack в этой команде. Self — serial mobile, а не автоматическая подстановка его рюкзака. -
x— При ненулевом контейнере — позиция ВНУТРИ его гампа; -1,-1 оставляют размещение серверу. При земле — мировые координаты 0..65535, обе обязательны и неотрицательны. Не экранные пиксели игрового мира и не конечная точка маршрута. -
y— При ненулевом контейнере — позиция ВНУТРИ его гампа; -1,-1 оставляют размещение серверу. При земле — мировые координаты 0..65535, обе обязательны и неотрицательны. Не экранные пиксели игрового мира и не конечная точка маршрута. -
z— Высота мира при выкладывании на землю; используйте реальную высоту места (протокольный диапазон -128..127). В контейнерном примере указывают 0. Это не индекс слоя экипировки. -
delayMS— Задержка между принятыми запросами в миллисекундах. Реально применяется max(GrabDelay, max(0, DelayMS)); ожидание есть также после последнего отправленного переноса. 350 не означает 350 предметов и не гарантирует подтверждение за 350 мс.
Регистрация object? фактически возвращает int 1/true, если принят хотя бы один запрос переноса, иначе 0/false. Это не количество предметов и не гарантия переноса ВСЕХ совпадений. Проверяйте содержимое после ответа сервера. Аварийная отмена прерывает процедуру и не обязана возвращать false.
- Все восемь аргументов обязательны. Однократно создаётся список прямых дочерних предметов исходного контейнера; рекурсивного обхода нет. Попавший в список вложенный мешок перемещается как один предмет вместе с содержимым, а не распаковывается.
- Берёт всю текущую стопку каждого совпадения. Предел количества предметов или единиц этой командой не задаётся; для таких сценариев смотрите UO.MassMove. Ignore не используется как дополнительный фильтр этой выборки.
- Перед каждым действием повторно проверяет, что предмет ещё в исходном контейнере. Запрет вложить контейнер в себя/потомка и недоступность предмета могут привести к пропуску. Очередь не является транзакцией: уже отправленные действия не откатываются.
- При source=0, одинаковых source/destination или земле с отрицательными X/Y возвращает 0 и сообщает ошибку. Сервер определяет разрешение, дальность, вместимость и окончательный результат. Не выполняйте одновременно другие операции с поднятыми вещами.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.MoveItems("lasttarget", 0x0EED, -1, "backpack", -1, -1, 0, 350);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- 0x0EED — type золота; -1 в ItemsColor — любой hue. -1,-1 после backpack — автоматическое положение в гампе, а не земля. 350 мс — минимальная желаемая задержка, с учётом GrabDelay. Все прямые стопки золота берутся целиком.
var source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || Truth(source == UO.Backpack()) || !(Truth(UO.Exists(source))))
{
return null;
}
var sent = UO.MoveItems(source, 0x0EED, -1, "backpack", -1, -1, 0, 350);
if (Truth(Truth(sent) == false))
{
UO.Print("No gold transfer request was accepted");
}
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- 0x0E21 — бинты, не тело человека. backpack — источник, destination — serial сундука. Все совпадения направляются в одну точку 30,40; сервер может объединить стопки или скорректировать положение.
return RunScenario();
object? RunScenario()
{
var destination = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(destination == 0) || Truth(destination == UO.Backpack()) || !(Truth(UO.Exists(destination))))
{
return null;
}
var sent = UO.MoveItems("backpack", 0x0E21, -1, destination, 30, 40, 0, 350);
if (Truth(sent != 0))
{
UO.Print("Transfer requested; verify the destination contents");
}
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- itemType задаёт тип, не количество; переносятся все его прямые стопки в рюкзаке. X+1/Y/Z — пример соседней точки на одной высоте: при склоне/стене выберите правильную координату. 0 назначения обязателен для мирового режима. true говорит только о принятом запросе, не об освобождённом рюкзаке.
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(DropTypeBesideMe(0x0EED))))
{
UO.Print("No ground drop request was accepted");
}
return null;
}
dynamic DropTypeBesideMe(dynamic itemType)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
return UO.MoveItems("backpack", itemType, -1, 0, x, y, z, 350);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
UO.MoveItems(container, itemsType, itemsColor, moveIntoID, x, y, z, delayMS) — UO.MoveItems(Any,Any,Any,Any,Any,Any,Any,Any)
Параметры: container (Any), itemsType (Any), itemsColor (Any), moveIntoID (Any), x (Any), y (Any), z (Any), delayMS (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MoveItems:bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[1]).
Внутренний код реализации, не самостоятельный скрипт.
case "moveitems": return new InjectionValue(bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.Name();Читает имя персонажа.
Параметров нет.
string — известное клиенту имя. Пустая строка означает пустое/неизвестное значение либо отсутствие объекта. Это не serial и не путь профиля. Игровое имя/титул не переводится по языку IDE.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Name();
UO.Print("Name: " + Convert.ToString(result));Параметры и ход выполнения:
- Параметров нет: читается self.
- Пустая строка обрабатывается явно; это не текст "0".
var text = UO.Name();
if (Truth(text != ""))
{
UO.Print(text);
}
else
{
UO.Print("Text is unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Читается свой персонаж, значение сохраняется строкой.
- Оператор + соединяет строки; Convert.ToString для этого результата не нужен.
return RunScenario();
object? RunScenario()
{
var text = UO.Name();
UO.Print("Player имя: " + text);
return null;
}Параметры и ход выполнения:
- Оба вызова относятся к self; 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 previous = UO.Name();
await Delay(1000);
var current = UO.Name();
if (Truth(previous != current))
{
UO.Print("Updated text: " + current);
}
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.
Параметры: Параметров нет.
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Name]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetName(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Picking();Проверяет, занят ли курсор клиента поднятым предметом.
Параметров нет.
int 1 — ItemHold.Enabled установлен; 0 — не установлен. Это состояние клиента, не ID и не подтверждение серверной доставки. Учитывается предмет, поднятый мышью или другим скриптом.
Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.
- Чтение не поднимает и не сбрасывает предмет.
- Для собственного переноса проверяйте также результат Drag/DragItem; чужой занятый курсор не означает, что нужный предмет успешно взят.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Picking();
UO.Print("Picking: " + Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет.
- Выводится 1 или 0.
UO.Print(Convert.ToString(UO.Picking()));Параметры и ход выполнения:
- Один аргумент Drag означает весь стек и timeout=0.
- Picking проверяет общий курсор клиента. Не запускайте два независимых переноса одновременно.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Picking() == 0))
{
if (Truth(UO.Drag("loot")))
{
var dropped = UO.DropItem("backpack", -1, -1, 0);
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Проверка повторяется до двадцати раз с паузами по 50 мс.
- Команда не освобождает курсор и не отменяет чужой перенос.
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 tries = 0;
while (Truth(UO.Picking()) && Truth(tries < 20))
{
await Delay(50);
tries = tries + 1;
}
if (Truth(UO.Picking()))
{
UO.Print("Cursor is still occupied");
}
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.Picking. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Picking:bridge.Picking().
Внутренний код реализации, не самостоятельный скрипт.
public int Picking() => bridge.Picking();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ReceiveObjectName(object? id);
void UO.ReceiveObjectName(object? id, object? timeout);Запрашивает имя объекта single-click запросом.
-
id— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект. -
timeout— Необязательный int, миллисекунды; по умолчанию 0. Отрицательное значение не добавляет ожидания.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge.ReceiveObjectName вызывает Click(id), затем ждёт до max(0,timeout), пока GetName(id) пусто; паузы не больше 25 ms. Уже известное имя завершает ожидание сразу.
- Без timeout выполняется только Click. Возвращаемого имени нет: прочитайте GetName отдельно; окончание ожидания может означать timeout.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ReceiveObjectName");
UO.ReceiveObjectName("lasttarget");Параметры и ход выполнения:
- Запрашивает имя объекта single-click запросом.
UO.ReceiveObjectName("lasttarget");Параметры и ход выполнения:
- Bridge.ReceiveObjectName вызывает Click(id), затем ждёт до max(0,timeout), пока GetName(id) пусто; паузы не больше 25 ms. Уже известное имя завершает ожидание сразу.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.ReceiveObjectName("lasttarget", 1000);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Без timeout выполняется только Click. Возвращаемого имени нет: прочитайте GetName отдельно; окончание ожидания может означать timeout.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.ReceiveObjectName(id, 1000);
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: id (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ReceiveObjectName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReceiveObjectName:bridge.ReceiveObjectName(GetObject(id), 0). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public void ReceiveObjectName(InjectionValue id) => bridge.ReceiveObjectName(GetObject(id), 0);Параметры: id (Any), timeout (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ReceiveObjectName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReceiveObjectName:bridge.ReceiveObjectName(GetObject(id), NumberConversions.ToInt(timeout)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout).
Внутренний код реализации, не самостоятельный скрипт.
public void ReceiveObjectName(InjectionValue id, InjectionValue timeout) => bridge.ReceiveObjectName(GetObject(id), NumberConversions.ToInt(timeout));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TicksUse();Читает сохранённую отметку TicksUse.
Параметров нет.
int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.
- Возвращает поле ticksUse. Его обновляет UseObject; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.TicksUse();
UO.Print("TicksUse: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает сохранённую отметку TicksUse.
var stamp = UO.TicksUse();
UO.Print(stamp);Параметры и ход выполнения:
- Возвращает поле ticksUse. Его обновляет UseObject; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksUse();
var ageTenths = UO.Timer() - stamp;
UO.Print(ageTenths);
return null;
}Параметры и ход выполнения:
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.TicksUse();
UO.Wait(250);
var after = UO.TicksUse();
UO.Print(before = after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public int TicksUse() => ticksUse;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UpdateObject(object? id);Запрашивает обновление уже загруженного объекта.
-
id— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Для Mobile вызывается RequestMobileStatus(..., true), для Item — SingleClick. Если serial отсутствует в обеих локальных таблицах, действия нет. Это не загрузка неизвестного объекта и не подтверждение обновления.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UpdateObject");
UO.UpdateObject(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Запрашивает обновление уже загруженного объекта.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Для Mobile вызывается RequestMobileStatus(..., true), для Item — SingleClick. Если serial отсутствует в обеих локальных таблицах, действия нет. Это не загрузка неизвестного объекта и не подтверждение обновления.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(id);
}
}
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)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UpdateObject. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UpdateObject:bridge.UpdateObject(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public void UpdateObject(InjectionValue id) => bridge.UpdateObject(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseFromGround(object? @type);
int UO.UseFromGround(object? @type, object? color);Ищет объект заданного graphic на земле/в мире и сразу вызывает его применение. Обычно используется для лежащих рядом предметов, например для открытия рюкзака. Важная особенность этого runtime: поиск основан на FindType и может найти также mobile с таким body; это не строго item-only выборка. Для предметов с явным радиусом и выбором ближайшего используйте UseType(..., ground, ...).
-
type— Обязательный graphic. Например 0x0E75 — рюкзак. Число или числовая hex-строка; отрицательное число/0xFFFF — любой graphic. Значения тела, например 0x0190 (мужчина) и 0x0191 (женщина), могут выбрать mobile; не подставляйте их вместо type предмета. Одновременно два типа этой формой не передаются. -
color— Необязательный hue, по умолчанию -1 (любой). Отрицательное число/0xFFFF — любой, 0 — только hue 0. Других параметров нет: container, distance, nearest и maxZ в эту команду не добавляют.
int — serial первого найденного объекта, переданного UseObject, либо 0. Это не число объектов, не graphic и не true/false. Объект может быть найден, но сервер может запретить применение. Проверяйте id != 0 и отдельно ожидаемый игровой эффект.
- Использует текущие FindDistance и FindVertical, учитывает Ignore. Контейнер поиска фиксирован как ground, вложенное содержимое не обходится. Mobiles исключают self; по жизни/видимости/notoriety отдельного ограничения нет.
- Обновляет FindItem/FindCount/GetFoundItems всеми совпадениями поиска, но применяет только первый результат. Ближайший не гарантирован; предметы мира проверяются раньше mobiles.
- Не подбирает предмет в рюкзак, не перемещает персонажа, не ждёт ответа сервера или окончания target. При отсутствии совпадения печатает сообщение. Для поиска без действия используйте UO.FindType.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.UseFromGround(0x0E75);
UO.Print("UseFromGround: " + Convert.ToString(result));Параметры и ход выполнения:
- Только type; любой hue. Используются текущие FindDistance/FindVertical. bag — ID первого результата, а не обязательно ближайшего. Содержимое откроется только если сервер разрешит.
var bag = UO.UseFromGround(0x0E75);
if (Truth(bag != 0))
{
UO.AddObject("ground_bag", bag);
}
else
{
UO.Print("No loaded ground backpack matches the search settings");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Поиск ограничен двумя клетками и одинаковой Z. Цвет 0x0044 дан для примера: замените на hue своей вещи. Настройки восстанавливаются даже при ошибке.
return RunScenario();
object? RunScenario()
{
var oldDistance = UO.FindDistance();
var oldZ = UO.FindVertical();
try
{
UO.FindDistance(2);
UO.FindVertical(0);
var bag = UO.UseFromGround(0x0E75, 0x0044);
if (Truth(bag != 0))
{
UO.AddObject("colored_ground_bag", bag);
}
}
finally
{
UO.FindDistance(oldDistance);
UO.FindVertical(oldZ);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- radius задаёт FindDistance, а не третий аргумент UseFromGround. 3000 мс — время просмотра примера, не подтверждение открытия; тип окна 3 — контейнер. В Find* остаются результаты этого поиска.
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 selected = OpenGroundBagWithin(2);
if (Truth(selected != 0))
{
await Delay(3000);
UO.CloseClientUIWindow(3, selected);
}
return null;
}
dynamic OpenGroundBagWithin(dynamic radius)
{
var previous = UO.FindDistance();
try
{
UO.FindDistance(radius);
return UO.UseFromGround(0x0E75, -1);
}
finally
{
UO.FindDistance(previous);
}
}
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.
Параметры: type (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseFromGround. -
InjectionScript.Runtime.InjectionApiUO.UseFromGround:UseFromGround(type, new InjectionValue(-1)).
Внутренний код реализации, не самостоятельный скрипт.
public int UseFromGround(InjectionValue type) => UseFromGround(type, new InjectionValue(-1));Параметры: type (Any), color (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseFromGround. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(id). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No matching item found on ground.").
Внутренний код реализации, не самостоятельный скрипт.
public int UseFromGround(InjectionValue type, InjectionValue color)
{
int id = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);
if (id != 0)
UseObject(id);
else
SystemMessage("No matching item found on ground.");
return id;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseItemOnMobile(object? itemSerial, object? targetSerial);Готовит цель персонажа и использует предмет.
-
itemSerial— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект. -
targetSerial— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ExecuteClientApiCompatibility сначала вызывает bridge.WaitTargetObject(TargetSerial), затем bridge.UseObject(ItemSerial). Аргументы не переставляются. Эти прямые bridge-вызовы не обновляют runtime TicksTarget/TicksUse.
- Не проверяет тип цели/предмета и не ждёт cursor. Подготовка цели раньше использования предотвращает пропуск быстро пришедшего target, но сервер всё равно определяет допустимость действия.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UseItemOnMobile");
UO.UseItemOnMobile("0x40001234", "self");Параметры и ход выполнения:
- Готовит цель персонажа и использует предмет.
UO.UseItemOnMobile("0x40001234", "self");Параметры и ход выполнения:
- ExecuteClientApiCompatibility сначала вызывает bridge.WaitTargetObject(TargetSerial), затем bridge.UseObject(ItemSerial). Аргументы не переставляются. Эти прямые bridge-вызовы не обновляют runtime TicksTarget/TicksUse.
return RunScenario();
object? RunScenario()
{
var item = UO.GetSerial("lastobject");
var mobile = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(item)) && Truth(UO.Exists(mobile)))
{
UO.UseItemOnMobile(item, mobile);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Не проверяет тип цели/предмета и не ждёт cursor. Подготовка цели раньше использования предотвращает пропуск быстро пришедшего target, но сервер всё равно определяет допустимость действия.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var item = UO.GetSerial("lastobject");
if (Truth(UO.Exists(item)))
{
UO.UseItemOnMobile(item, "self");
UO.Print(UO.Waiting());
}
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.
Параметры: itemSerial (Any), targetSerial (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0)).
Внутренний код реализации, не самостоятельный скрипт.
case "useitemonmobile": bridge.WaitTargetObject(Arg(1)); bridge.UseObject(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseObject(object? objID);Запрашивает использование объекта по serial. Bridge вызывает GameActions.DoubleClick; предмет не ищется по type.
-
objID— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- GetObject разрешает алиас; неизвестное имя даёт -1. После вызова runtime обновляет TicksUse значением UO.Timer; это момент запроса, а не подтверждение сервера.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UseObject");
UO.UseObject(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Запрашивает использование объекта по serial. Bridge вызывает GameActions.DoubleClick; предмет не ищется по type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- GetObject разрешает алиас; неизвестное имя даёт -1. После вызова runtime обновляет TicksUse значением UO.Timer; это момент запроса, а не подтверждение сервера.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseObject(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UseObject(id);
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "useobject": bridge.UseObject(Arg(0)); return InjectionValue.Unit;Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseObject. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(id). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
Внутренний код реализации, не самостоятельный скрипт.
public void UseObject(int id)
{
bridge.UseObject(id);
ticksUse = Timer();
}Параметры: objID (Any/Integer/String)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public void UseObject(string id) => UseObject(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseType(object? @type);
int UO.UseType(object? @type, object? color);
int UO.UseType(object? @type, object? color, object? container);
int UO.UseType(object? @type, object? color, object? container, object? distance);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest, object? maxZ);Находит один предмет нужного graphic/type и применяет его. Например, выпить зелье из рюкзака, открыть лежащий рядом рюкзак или использовать вещь из выбранного контейнера. Персонажа эта команда не ищет и не перемещает. Если предмет требует прицел, цель нужно подготовить отдельно.
-
type— Graphic предмета: число или hex-строка; например 0x0F0C — тип лечебного зелья, 0x0E75 — рюкзака. Это не serial и не body персонажа. Отрицательное число или 0xFFFF разрешают любой type; для осмысленного действия лучше точный graphic. -
color— Hue предмета, по умолчанию -1 (любой). Любое отрицательное число или 0xFFFF снимает фильтр; 0 выбирает именно неокрашенную вещь. Не notoriety и не цвет текста. -
container— По умолчанию -1: свой рюкзак и загруженные вложенные контейнеры. "my" означает то же. "backpack" либо явный serial контейнера задают корень рекурсивного обхода. ground/"ground"/UO.Ground(), числовые 0/1 обозначают только предметы мира. Self не является синонимом backpack; используйте явный рюкзак. Неизвестный/нулевой объектный алиас может разрешиться как рюкзак: передаваемый контейнер предварительно проверяйте через Exists. -
distance— Максимальная геометрическая дальность X/Y, не длина пути. По умолчанию или при отрицательном аргументе — FindDistance. 0 означает ту же клетку. У вещей в контейнере клиент учитывает расстояние до владельца. -
nearest— По умолчанию true: выбрать ближайшую вещь, при равенстве меньший serial. false: первый найденный при обходе без сортировки. Не число предметов и не режим бега. -
maxZ— Максимальная абсолютная разница мировой высоты Z с персонажем. По умолчанию или при отрицательном аргументе — FindVertical. 0 требует одинаковую Z. Для вещи в сумке используется высота внешнего контейнера на земле либо персонажа-владельца; внутренние координаты гампа не считаются мировыми. Это фильтр высоты, не проверка проходимости или линии обзора.
int — serial предмета, для которого вызван UseObject; 0, если совпадений нет. Даже регистрация с ReturnKind object? фактически возвращает число. Это не true/false и не подтверждение применения сервером: проверяйте used != 0, а не used == true. Для успеха эффекта нужна отдельная проверка состояния, содержимого или журнала.
- От 1 до 6 аргументов. Чтобы задать дальность, укажите также color и container. Чтобы задать maxZ, заполните все шесть позиций. Массив type, маска через | и дополнительные цели этой командой не принимаются.
- Обычные формы с int/string и расширенные формы используют CompactUseType: только items, Ignore, расстояние и высота; контейнеры обходятся рекурсивно по уже загруженному содержимому. Контейнер для загрузки автоматически не открывается. FindItem/FindCount/GetFoundItems этой ветвью не обновляются.
- Высота общих владельцев и контейнеров вычисляется один раз за вызов, чтобы не повторять обход для каждой стопки. Циклическая или чрезмерно глубокая цепочка контейнеров (128 звеньев без найденного корня) не используется как совпадение по высоте.
- Сохранена общая совместимая регистрация двух object?: она направляет вызов в bridge.UseType, использующий FindType по рюкзаку, обновляющий Find* и выбирающий первый результат. Для предсказуемой компактной формы используйте int/string, а не неявные преобразования неподходящих видов значений.
- UseObject отправляет действие применения, но команда не ждёт target, исцеления, выпивания, открытия окна или серверного отказа. Дальность поиска не расширяет допустимую сервером дальность использования.
- При отсутствии совпадения компактная форма печатает сообщение и возвращает 0. При отсутствии персонажа/связи результат не следует считать разрешением на действие. Для точного ID используйте UO.UseObject.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.UseType(0x0F0C);
UO.Print("UseType: " + Convert.ToString(result));Параметры и ход выполнения:
- 0x0F0C — пример стандартного типа лечебного зелья. Сервер может отклонить действие из-за состояния персонажа, задержки или собственных правил. Цвет и дальность отдельно не заданы: действуют defaults.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return null;
}
var used = UO.UseType(0x0F0C);
if (Truth(used == 0))
{
UO.Print("No matching healing potion in the loaded backpack");
}
else
{
UO.Print("Potion use requested; check health and the game message");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- 0x0E75 — type рюкзака, -1 — любой hue, ground — предметы мира. 2 — клетки X/Y, true — ближайший, 4 — разница Z. Возврат bag — ID. Доступ к содержимому определяет сервер; команда не подбирает рюкзак.
return RunScenario();
object? RunScenario()
{
var bag = UO.UseType(0x0E75, -1, "ground", 2, true, 4);
if (Truth(bag != 0))
{
UO.AddObject("nearby_bag", bag);
}
else
{
UO.Print("No suitable ground backpack within the selected bounds");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- itemType — graphic вещи, source — отдельный serial контейнера. Помощник возвращает serial/0 так же, как UseType. Даже найденную вещь сервер может запрещать использовать из чужого или удалённого контейнера.
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 source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || !(Truth(UO.Exists(source))))
{
return null;
}
UO.AddObject("supply", source);
var used = UseFromNamedSupply(0x0F0C);
if (Truth(used == 0))
{
UO.Print("Supply item was not found with these filters");
}
return null;
}
dynamic UseFromNamedSupply(dynamic itemType)
{
var source = Asc(UO.GetSerial("supply"), 0);
if (Truth(source == 0) || !(Truth(UO.Exists(source))))
{
return 0;
}
return UO.UseType(itemType, 0, source, 2, false, 16);
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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.
Параметры: type (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(type, -1).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(int type) => UseType(type, -1);Параметры: type (Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(string type) => UseType(ResolveType(type));Параметры: type (Any/Integer/String), color (Any/Integer/String)
Результат: int / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseType:bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
Внутренний код реализации, не самостоятельный скрипт.
case "usetype": return new InjectionValue(bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1));Параметры: type (Any/Integer/String), color (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(new[] { new InjectionValue(type), new InjectionValue(color) }).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(int type, int color) => CompactUseType(new[]
{
new InjectionValue(type),
new InjectionValue(color)
});Параметры: type (Any/Integer/String), color (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(type, NumberConversions.ToInt(color)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(int type, string color) => UseType(type, NumberConversions.ToInt(color));Параметры: type (Any/Integer/String), color (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type), color). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(string type, int color) => UseType(ResolveType(type), color);Параметры: type (Any/Integer/String), color (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type), NumberConversions.ToInt(color)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
Внутренний код реализации, не самостоятельный скрипт.
public int UseType(string type, string color) => UseType(ResolveType(type), NumberConversions.ToInt(color));Параметры: type (Any), color (Any), container (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactUseType(values))Параметры: type (Any), color (Any), container (Any), distance (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactUseType(values))Параметры: type (Any), color (Any), container (Any), distance (Any), nearest (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactUseType(values))Параметры: type (Any), color (Any), container (Any), distance (Any), nearest (Any), maxZ (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactUseType(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseWorldObject(object? serialOrName);Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
-
serialOrName— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- В metadata зарегистрирована прямо на UserObject. Это обычное использование serial, а не поиск во всём серверном мире.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UseWorldObject");
UO.UseWorldObject(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- В metadata зарегистрирована прямо на UserObject. Это обычное использование serial, а не поиск во всём серверном мире.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(id);
}
}
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.
Параметры: serialOrName (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UserObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(serialOrName)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serialOrName).
Внутренний код реализации, не самостоятельный скрипт.
public void UserObject(InjectionValue serialOrName)
=> UseObject(GetObject(serialOrName));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UserObject(object? serialOrName);Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
-
serialOrName— Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Тот же путь использования, что UO.UseWorldObject. Команда не создаёт пользовательский объект и не добавляет имя AddObject.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UserObject");
UO.UserObject(UO.GetSerial("lasttarget"));Параметры и ход выполнения:
- Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UserObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Тот же путь использования, что UO.UseWorldObject. Команда не создаёт пользовательский объект и не добавляет имя AddObject.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UserObject(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UserObject(id);
}
}
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.
Параметры: serialOrName (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UserObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(serialOrName)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serialOrName).
Внутренний код реализации, не самостоятельный скрипт.
public void UserObject(InjectionValue serialOrName)
=> UseObject(GetObject(serialOrName));ClassicUO — Bad Newbie & C# Scripts IDE