Repository navigation
RU UO Topic client ui
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Вывод сообщений, служебные окна, отображение объектов и открытие IDE. Эти действия не заменяют отправку речи серверу.
| Тема | Команды и пояснения |
|---|---|
| UO.Print | |
| ClientPrint | UO.ClientPrint |
| Info Window | UO.FillInfoWindow · UO.ClearInfoWindow · UO.FillNewWindow |
| Text Window | UO.TextOpen · UO.TextPrint · UO.TextClear · UO.TextClose |
| Простые Гампы | UO.CloseSimpleGump |
| Close UI Window | UO.CloseClientUIWindow |
| Circle Transparency | UO.CircleTrans |
| Show Z | UO.SetShowZ |
| Open IDE | UO.OpenIDE |
UO.Print · UO.ClientPrint · UO.ClientPrintEx · UO.CharPrint · UO.ColorPrint · UO.ConsolePrint · UO.ServerPrint · UO.SetSilentMode · UO.ConColor · UO.FontColor
UO.ClearInfoWindow · UO.FillInfoWindow · UO.FillNewWindow · UO.TextOpen · UO.TextClear · UO.TextClose · UO.TextPrint · UO.CloseSimpleGump · UO.CloseClientUIWindow · UO.ShowJournal · UO.OpenIDE · UO.HelpRequest · UO.ActivateHandle · UO.CloseHandle · UO.Snap
UO.Hide · UO.ClientHide · UO.ClientMarkChar · UO.CircleTrans · UO.SetShowZ · UO.Morph
UO.AddFigure · UO.UpdateFigure · UO.RemoveFigure · UO.ClearFigures
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);Параметры, результат и все сценарии
UO.FillInfoWindow("Status ready");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ActivateHandle();Передаёт Windows/SDL запрос поднять окно текущего клиента на передний план. Аргументов и результата нет. Это команда управления окном, а не применение предмета, навыка или цели; фактический фокус зависит от оконной системы.
Параметров нет.
void. Вызов только запрашивает активацию окна; он не подтверждает, что оконная система перевела его на передний план.
- Клиент поднимает окно игрового представления через SDL. Команда не отправляет игровой пакет и не выполняет действие в мире. Свернутое окно или ограничения оконной системы могут помешать фактическому фокусу.
- RequireGameView требует Client.Game. Если графическое окно ClassicUO не открыто, bridge выбрасывает InvalidOperationException. SDL_RaiseWindow запрашивает поднятие существующего окна; решение о фокусе остаётся у оконной системы.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ActivateHandle");
UO.ActivateHandle();Параметры и ход выполнения:
- Запросить вывод окна клиента на передний план.
UO.ActivateHandle();Параметры и ход выполнения:
- Не запрашивать фокус окна до подключения к игре.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.Connected()))
{
UO.ActivateHandle();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Обернуть действие окном в повторно используемую процедуру.
- Выполнить запрос через вспомогательную процедуру.
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()
{
RunAction();
return null;
}
void RunAction()
{
UO.ActivateHandle();
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.AddFigure(object? arg0);Добавляет локальную фигуру на карту мира ClassicUO и возвращает её идентификатор. Фигура хранится на стороне клиента, игровой сервер не уведомляется.
int — положительный ID добавленной фигуры. 0 возвращается при неверных данных фигуры или отказе карты добавить её. Передавайте полученный ID в UO.UpdateFigure или UO.RemoveFigure.
- Создаёт локальную фигуру для
WorldMapGump. Поддерживаются линия, эллипс, прямоугольник, стрелка направления и текст. КоординатыfcWorldследуют преобразованию и масштабу карты;fcScreenотсчитываются относительно окна карты. Отображаются фигуры для выбранного facet.
Формат массива: [kind, coord, x1, y1, x2, y2, brushColor, brushStyle, color, worldNum, text]. kind: 0 линия, 1 эллипс, 2 прямоугольник, 3 стрелка направления, 4 текст. coord: 0 world, 1 screen. color использует порядок байтов Delphi TColor (0x00BBGGRR). Для стрелки с мировыми координатами и x2=0,y2=0 начальной точкой служит текущий персонаж. Исторические brushColor и brushStyle принимаются для совместимости; визуальная заливка не гарантирует полного совпадения с Delphi.
Фигура остаётся в клиентской коллекции до удаления/очистки или завершения процесса. Смена facet только скрывает фигуры, относящиеся к другому facet.
- Принимается минимум 9 полей. Если worldNum отсутствует, используется текущая карта; без text берётся пустая строка. kind ограничен 0..4, coord — 0..1; другие значения дают 0. Отрицательный worldNum разрешает отображение на любом facet. Счётчик ID увеличивается до проверки SetYokoMapFigure, поэтому отвергнутая фигура может оставить пропуск в ID. Коллекция WorldMapGump статическая в процессе; обычные скрипты одного manager используют общее persistent runtime state.
- brushColor и brushStyle сохраняются в записи, но текущий renderer их не использует. Линия и прямоугольник рисуются контуром; эллипс состоит из 32 отрезков. Подпись text рисуется только для kind=4; другие kind не выводят её. color задаёт контур в формате COLORREF 0x00BBGGRR.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- kind=2 рисует красный контур. Поле text со значением Area сохраняется, но для этого kind подпись не рисуется; текст выводит kind=4.
dynamic[] fig = new dynamic[checked((int)(11) + 1)];
fig[0] = 2;
fig[1] = 0;
fig[2] = UO.GetX("self")-3;
fig[3] = UO.GetY("self")-3;
fig[4] = UO.GetX("self")+3;
fig[5] = UO.GetY("self")+3;
fig[6] = 0;
fig[7] = 1;
fig[8] = 255;
fig[9] = UO.WorldNum();
fig[10] = "Area";
var figureId = UO.AddFigure(fig);Параметры и ход выполнения:
- При world-координатах и x2=0,y2=0 начало стрелки берётся из положения персонажа при отрисовке. text со значением East для kind=3 не выводится.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
dynamic[] dirFig = new dynamic[checked((int)(11) + 1)];
dirFig[0] = 3;
dirFig[1] = 0;
dirFig[2] = UO.GetX("self") + 10;
dirFig[3] = UO.GetY("self");
dirFig[4] = 0;
dirFig[5] = 0;
dirFig[6] = 0;
dirFig[7] = 1;
dirFig[8] = 65280;
dirFig[9] = UO.WorldNum();
dirFig[10] = "East";
var arrowId = UO.AddFigure(dirFig);
return null;
}Параметры и ход выполнения:
- Создать синюю линию между двумя точками текущего facet.
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()
{
dynamic[] lineFig = new dynamic[checked((int)(11) + 1)];
lineFig[0] = 0;
lineFig[1] = 0;
lineFig[2] = UO.GetX("self");
lineFig[3] = UO.GetY("self");
lineFig[4] = UO.GetX("self") + 8;
lineFig[5] = UO.GetY("self");
lineFig[6] = 0;
lineFig[7] = 1;
lineFig[8] = 16711680;
lineFig[9] = UO.WorldNum();
lineFig[10] = "";
var lineId = UO.AddFigure(lineFig);
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CharPrint(object? arg0, object? arg1);
void UO.CharPrint(object? arg0, object? arg1, object? arg2);Создаёт видимую только вам надпись над загруженным объектом: например, пометку выбранной цели или предупреждение над своим персонажем. Это не речь персонажа и не сообщение внизу игрового окна.
-
id— Serial объекта, а не graphic/type или координата. UO.CharPrint в форме с тремя аргументами понимает также self, lasttarget и сохранённые имена объектов. Для SenderID в UO.ClientPrintEx используйте число, например UO.Hex2Int(UO.GetSerial("self")); строковые псевдонимы там не разрешаются как объекты. -
color— UO hue, а не RGB. Берутся младшие 16 бит числа; 0x0044 — пример. -1 превращается в 0xFFFF, а не означает «любой цвет». Цвет ConColor здесь не используется.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Объект должен существовать в загруженном мире и не быть удалённым; пустой текст или отсутствующая цель не рисуются. Команда не загружает объект с сервера. Сервер и другие игроки эту надпись не получают. Без игрового окна надпись невозможно увидеть в мире; это не замена системному журналу менеджера.
- UO.CharPrint(color, msg) выбирает своего персонажа. UO.CharPrint(id, color, msg) выбирает указанный объект. Обе формы используют шрифт 3. UO.ClientPrintEx требует все четыре аргумента в порядке SenderID, Color, Font, Text.
- Номер шрифта UO, не размер в пунктах и не имя Windows-шрифта. Число ограничивается диапазоном 0..255; наличие конкретного шрифта зависит от файлов игры. В примере 3 — обычный номер шрифта.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
- UO.Print · UO.CharPrint · UO.ClientPrintEx · UO.AddToSystemJournalEx
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CharPrint");
UO.CharPrint(0x0044, "Ready");Параметры и ход выполнения:
- Первая форма CharPrint помещает Ready над своим персонажем. ClientPrintEx получает его serial через UO.Hex2Int(UO.GetSerial("self")) и явно передаёт шрифт 3. Надпись не включает никакой игровой режим.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
UO.CharPrint(0x0044, "Ready");Параметры и ход выполнения:
- target — serial последней цели. Ноль означает, что в этом примере отмечать некого. Selected target — только локальная подпись: цель не атакуется и активный серверный таргет не заполняется.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
if (Truth(target != 0))
{
UO.CharPrint(target, 0x0044, "Selected target");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- ShowWeightWarning полностью объявлена ниже. Она сравнивает вес с положительным известным пределом и пишет над своим персонажем только при перегрузе; ничего не выбрасывает. Convert.ToString превращает вес в текст.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
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()
{
ShowWeightWarning(UO.Weight(), UO.MaxWeight());
return null;
}
void ShowWeightWarning(dynamic weight, dynamic maximum)
{
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.CharPrint(UO.Hex2Int(UO.GetSerial("self")), 0x0044, "Too heavy: " + Convert.ToString(weight));
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.CircleTrans();
void UO.CircleTrans(object? arg0);Читает или меняет настройку круга прозрачности активного профиля.
-
enabled— int: 0 выключает, любое ненулевое значение включает. Без аргумента настройка только читается.
Без аргумента int 1/0; форма с аргументом возвращает null.
- Чтение при отсутствии профиля даёт 0. Запись при отсутствии профиля печатает ошибку; при наличии профиля меняет UseCircleOfTransparency и сохраняет профиль. Это визуальная настройка клиента.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.CircleTrans();
UO.Print("CircleTrans: " + Convert.ToString(result));Параметры и ход выполнения:
- Чтение не меняет профиль.
var enabled = UO.CircleTrans();
UO.Print(Convert.ToString(enabled));Параметры и ход выполнения:
- Запись сохраняет включённый круг прозрачности.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.CircleTrans(1);
return null;
}Параметры и ход выполнения:
- Сохранённый флаг восстанавливается после временной смены настройки.
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.CircleTrans();
UO.CircleTrans(0);
UO.CircleTrans(previous);
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearFigures();Удаляет все пользовательские фигуры карты и их записи runtime.
Параметров нет.
void — возвращаемого значения нет.
- Очищает WorldMapGump.ClearYokoMapFigures и state.MapFigures. Базовая карта и UserStatics не изменяются.
- ClearYokoMapFigures очищает статическую коллекцию WorldMapGump в процессе, затем команда очищает MapFigures своего runtime state. Эта область очистки определяется общей клиентской коллекцией, а не только именем вызывающего скрипта.
- Обычные пользовательские метки карты (userMarkers.usr) сохраняются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ClearFigures");
UO.ClearFigures();Параметры и ход выполнения:
- Удаляет все пользовательские фигуры карты и их записи runtime.
UO.ClearFigures();Параметры и ход выполнения:
- Создать локальную фигуру текущей карты, затем удалить все пользовательские фигуры.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
dynamic[] figure = new dynamic[checked((int)(9) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = figure[2] + 1;
figure[5] = figure[3] + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
var figureId = UO.AddFigure(figure);
UO.ClearFigures();
return null;
}Параметры и ход выполнения:
- Очистка пустого набора допустима и не создаёт новую настройку.
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()
{
UO.ClearFigures();
UO.ClearFigures();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearInfoWindow();Очищает строки клиентского текстового окна.
Параметров нет.
void — возвращаемого значения нет.
- TextClear очищает буфер; если окно было открыто, обновляет его пустым содержимым. Окно не обязательно закрывается.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ClearInfoWindow");
UO.ClearInfoWindow();Параметры и ход выполнения:
- Очищает строки клиентского текстового окна.
UO.ClearInfoWindow();Параметры и ход выполнения:
- Очистить ранее добавленную строку текстового окна.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.FillInfoWindow("status");
UO.ClearInfoWindow();
return null;
}Параметры и ход выполнения:
- Очистка пустого набора допустима и не создаёт новую настройку.
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()
{
UO.ClearInfoWindow();
UO.ClearInfoWindow();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ClientHide(object? arg0);Скрывает по serial загруженный предмет или другого персонажа только в отображении ClassicUO, включая контейнеры, paperdoll и надетые вещи.
-
ObjID— Serial конкретного загруженного объекта: int либо hex/десятичная строка. Это не graphic/type. Для сохранённого имени используйте GetSerial(name). Параметр обязателен; прицел не появляется.
int 1 после передачи команды bridge. Исторический результат не подтверждает наличие объекта: даже для неизвестного serial или self bridge выводит отказ, а runtime возвращает 1. Не используйте это значение как проверку успешного скрытия. В метаданных совместимости указан object?.
- Требуется ровно один аргумент. Для выбора мышью используйте UO.Hide().
- Hide(serial) действует сразу на известный загруженный объект. Передавайте serial конкретной стопки/предмета, а не graphic/type. Выбранная стопка скрывается целиком независимо от Amount.
- Предмет остаётся в контейнере: количество, владелец, содержимое и серверное состояние не меняются. FindType/GetContent по-прежнему могут его найти. Скрытие не является фильтром поиска, переносом, удалением, навыком Hiding или серверной невидимостью.
- Обычный контейнер, торговое окно и сетка добычи не рисуют скрытый предмет и не принимают по нему клики/перетаскивание. Флаг сохраняется при перестройке и повторном открытии окна, пока используется тот же загруженный объект.
- Надетая вещь исчезает с paperdoll, из маленького слота и с изображения персонажа. Она остаётся надетой: слой, броня и состояние на сервере не меняются. Скрытая роба больше не перекрывает нижнюю одежду. Изображение персонажа в менеджере обновляется по тому же флагу; список настоящей экипировки остаётся доступным.
- Собственного персонажа, землю и статику Hide не скрывает. Несуществующий serial даёт сообщение. Если скрыть саму сумку, это не закрывает уже открытое окно её содержимого и не скрывает каждый вложенный предмет автоматически.
- Отдельной команды Unhide в текущем API нет. Скрытие принадлежит загруженному экземпляру объекта: его удаление из мира клиента и новая загрузка (например, при переподключении) сбрасывают флаг. Простое закрытие/открытие сундука не является гарантированным способом вернуть предмет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.ClientHide(0x40001234);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- ObjID — конкретный предмет, не его type. Он исчезает из отображения, оставаясь в своём контейнере.
var item = 0x40001234;
if (Truth(UO.Exists(item)))
{
UO.ClientHide(item);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- FindType ищет graphic 0x0EED любого цвета в backpack. В ClientHide передаётся возвращённый serial; вся стопка скрывается целиком.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
UO.ClientHide(item);
UO.Print("Amount is still: " + Convert.ToString(UO.GetQuantity(item)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- GetSerial разрешает ранее сохранённое имя decoration. Предмет нужно предварительно загрузить, например открыть его контейнер.
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 item = UO.GetSerial("decoration");
if (Truth(UO.Exists(item)) && Truth(item != UO.GetSerial("self")))
{
UO.ClientHide(item);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClientMarkChar(object? arg0, object? arg1);Обновляет клиентские метки LastTarget и/или LastAttack.
-
actionIndex— int: 1 — LastTarget; 2 — LastAttack; 3 — обе. Другие значения печатают ошибку. -
id— Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.
void — возвращаемого значения нет.
- ClientMarkChar изменяет сохранённые цели, не отправляя атаку и не отвечая на серверный target. Последующие команды могут использовать новую метку.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ClientMarkChar");
UO.ClientMarkChar(1, "self");Параметры и ход выполнения:
- Сохранённой целью становится собственный персонаж.
UO.ClientMarkChar(1,"self");Параметры и ход выполнения:
- Последняя цель используется для обеих клиентских меток.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var target = UO.LastTarget();
if (Truth(UO.Exists(target)))
{
UO.ClientMarkChar(3, target);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Ноль не входит в набор действий и приводит к сообщению об ошибке.
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()
{
UO.ClientMarkChar(0, "self");
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClientPrint(object? arg0);Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
-
UO.Printдобавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации. - Используется цвет системных сообщений данного скриптового runtime: первоначально 0x0440, изменяется UO.ConColor. Это локальная запись; имя команды не означает отправку серверу.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой и не возвращает значение (void). Текст сообщения указан прямо в вызове.
UO.ClientPrint("Hello from C#");Параметры и ход выполнения:
- processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.ClientPrint("Processed item entries: " + Convert.ToString(processed));Параметры и ход выполнения:
- Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При weight >= maximum печатается одна строка и Main завершается; предметы не выбрасываются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ClientPrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Main запоминает вес, ждёт 1000 миллисекунд и вызывает полностью объявленный ReportWeight. Помощник печатает только если вес изменился и возвращает новый вес для следующей проверки. Сам он не создаёт бесконечный цикл.
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.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.ClientPrint("Weight changed: " + Convert.ToString(current));
}
return current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClientPrintEx(object? arg0, object? arg1, object? arg2, object? arg3);Создаёт видимую только вам надпись над загруженным объектом: например, пометку выбранной цели или предупреждение над своим персонажем. Это не речь персонажа и не сообщение внизу игрового окна.
-
SenderID— Serial объекта, а не graphic/type или координата. UO.CharPrint в форме с тремя аргументами понимает также self, lasttarget и сохранённые имена объектов. Для SenderID в UO.ClientPrintEx используйте число, например UO.Hex2Int(UO.GetSerial("self")); строковые псевдонимы там не разрешаются как объекты. -
Color— UO hue, а не RGB. Берутся младшие 16 бит числа; 0x0044 — пример. -1 превращается в 0xFFFF, а не означает «любой цвет». Цвет ConColor здесь не используется. -
Font— Номер шрифта UO, не размер в пунктах и не имя Windows-шрифта. Число ограничивается диапазоном 0..255; наличие конкретного шрифта зависит от файлов игры. В примере 3 — обычный номер шрифта.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Объект должен существовать в загруженном мире и не быть удалённым; пустой текст или отсутствующая цель не рисуются. Команда не загружает объект с сервера. Сервер и другие игроки эту надпись не получают. Без игрового окна надпись невозможно увидеть в мире; это не замена системному журналу менеджера.
- UO.CharPrint(color, msg) выбирает своего персонажа. UO.CharPrint(id, color, msg) выбирает указанный объект. Обе формы используют шрифт 3. UO.ClientPrintEx требует все четыре аргумента в порядке SenderID, Color, Font, Text.
- Номер шрифта UO, не размер в пунктах и не имя Windows-шрифта. Число ограничивается диапазоном 0..255; наличие конкретного шрифта зависит от файлов игры. В примере 3 — обычный номер шрифта.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
- UO.Print · UO.CharPrint · UO.ClientPrintEx · UO.AddToSystemJournalEx
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ClientPrintEx");
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");Параметры и ход выполнения:
- Первая форма CharPrint помещает Ready над своим персонажем. ClientPrintEx получает его serial через UO.Hex2Int(UO.GetSerial("self")) и явно передаёт шрифт 3. Надпись не включает никакой игровой режим.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");Параметры и ход выполнения:
- target — serial последней цели. Ноль означает, что в этом примере отмечать некого. Selected target — только локальная подпись: цель не атакуется и активный серверный таргет не заполняется.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
if (Truth(target != 0))
{
UO.ClientPrintEx(target, 0x0044, 3, "Selected target");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- ShowWeightWarning полностью объявлена ниже. Она сравнивает вес с положительным известным пределом и пишет над своим персонажем только при перегрузе; ничего не выбрасывает. Convert.ToString превращает вес в текст.
- GetSerial возвращает hex-строку. Hex2Int превращает её в int перед сравнением с числом 0; строку "0x00000000" нельзя проверять как число 0.
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()
{
ShowWeightWarning(UO.Weight(), UO.MaxWeight());
return null;
}
void ShowWeightWarning(dynamic weight, dynamic maximum)
{
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Too heavy: " + Convert.ToString(weight));
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CloseClientUIWindow(object? arg0, object? arg1);Закрывает локальное окно клиента заданного вида для конкретного объекта. Например, можно убрать бумажную куклу персонажа, его статус или окно рюкзака. Команда не закрывает игровой клиент и не отвечает на кнопки серверного gump.
-
UIWindowType— Обязательный числовой код окна: 0 — paperdoll (экипировка), 1 — статус персонажа, 2 — профиль, 3 — контейнер. Это отдельный список из четырёх кодов, не graphic/type тела и не ID серверного gump. Другие числа не находят окно. -
ID— Serial объекта, которому принадлежит окно: self/serial персонажа для типов 0..2, backpack/serial контейнера для типа 3. Принимаются число, hex-строка или разрешаемый объектный алиас. Это не номер окна в списке InfoGumps. Неизвестный объектный алиас преобразуется в 0.
void — значения нет. Вызов пишется отдельной строкой, без var result = и без if UO.CloseClientUIWindow(...). Если подходящего открытого окна нет, ничего не происходит; команда не возвращает true/false.
- Оба параметра обязательны. Сравниваются и класс окна, и LocalSerial. Вызов с (3, self) не означает рюкзак: для рюкзака нужен backpack.
- Обход затрагивает открытые, ещё не уничтоженные окна данного типа/serial; все совпавшие окна закрываются на игровом потоке. Остальные окна остаются открытыми.
- Закрывается интерфейс, предметы из контейнера не удаляются, персонаж не исчезает из мира. Повторять безопасно: если окно уже закрыто, совпадения нет.
- Для серверных диалогов изучите UO.CloseSimpleGump и UO.NumGumpButton; коды 0..3 этой команды там не применяются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CloseClientUIWindow");
UO.CloseClientUIWindow(0, "self");Параметры и ход выполнения:
- Закрывается только окно экипировки своего персонажа; его статус, профиль и рюкзак остаются отдельными окнами.
UO.CloseClientUIWindow(0, "self");Параметры и ход выполнения:
- Если рюкзак не был открыт, действие ничего не изменит. Эта команда не перемещает предметы и не возвращает результат.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.Connected()) && Truth(UO.Exists("backpack")))
{
UO.CloseClientUIWindow(3, "backpack");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- 1 — статус, 2 — профиль. id — serial выбранного mobile. ASC(text,0) здесь разбирает строковый serial в число с запасным 0. Пользовательская процедура ничего не обещает про наличие окна; оба вызова имеют Unit.
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 = Asc(UO.GetSerial("lasttarget"), 0);
CloseMobilePanels(selected);
return null;
}
void CloseMobilePanels(dynamic id)
{
if (Truth(id == 0) || !(Truth(UO.Exists(id))))
{
return;
}
UO.CloseClientUIWindow(1, id);
UO.CloseClientUIWindow(2, id);
}
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;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CloseHandle();Запрашивает выход текущего приложения клиента через Client.Game.Exit.
Параметров нет.
void — возвращаемого значения нет.
- CloseUO направляется в тот же bridge.CloseHandle. Exit выполняется на игровом потоке; если Client.Game отсутствует, действие отсутствует. Команда не является закрытием отдельного gump.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CloseHandle");
UO.CloseHandle();Параметры и ход выполнения:
- Вызов запрашивает завершение приложения клиента.
UO.CloseHandle();Параметры и ход выполнения:
- Пример показывает управляемое условие; значение 0 сохраняет клиент открытым.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var finishClient = 0;
if (Truth(finishClient))
{
UO.CloseHandle();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Полностью объявленный helper допускает явное включение выхода.
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()
{
FinishClient(0);
return null;
}
void FinishClient(dynamic enabled)
{
if (Truth(enabled))
{
UO.CloseHandle();
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CloseSimpleGump(object? arg0);Локально закрывает разрешённый к закрытию серверный гамп по строгому индексу.
-
GumpIndex— Обязательный int — индекс активного серверного гампа, от 0 до GetGumpsCount()-1. Это не GumpID/serial. Отрицательное число и индекс вне списка недействительны. Открытие, закрытие и изменение порядка окон могут изменить индекс; перед действием проверяйте GetGumpID/GetGumpSerial.
void — ничего не возвращает. Нельзя интерпретировать результат как подтверждение сервера или bool.
- Работает с активными серверными гампами. Рюкзак, карта, настройки и другие локальные окна не входят в этот список. Один вызов читает данные в игровом потоке; разные вызовы могут увидеть разные состояния списка.
- Недействительный индекс и NoClose ничего не меняют. Команда не отправляет ответ кнопки серверу. Для такого ответа используйте SendGumpSelect.
- Закрытие изменяет список и индексы. Для массового закрытия обходите список от последнего индекса к первому.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CloseSimpleGump");
UO.CloseSimpleGump(0);Параметры и ход выполнения:
- 0 — индекс, а не ID. Если окно запрещает закрытие, оно остаётся открытым.
UO.CloseSimpleGump(0);Параметры и ход выполнения:
- Обратный обход уменьшает влияние сдвига индексов после закрытия. При параллельном открытии новых окон повторно проверьте список.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var i = UO.GetGumpsCount() - 1;
while (Truth(i >= 0))
{
UO.CloseSimpleGump(i);
i = i - 1;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- info[1] — сохранённый GumpID. Действие ничего не возвращает, поэтому результат не присваивается переменной.
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 info = UO.GetGumpInfo(0);
if (Truth(ArrayLength(info) == 5))
{
UO.CloseSimpleGump(0);
UO.Print(Hex(info[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ColorPrint(object? arg0, object? arg1);Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.
-
color— UO hue, не RGB. Число или hex-строка; мост использует младшие 16 бит. Не путайте с graphic/type. 0x0044 в примере — выбранный hue. Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
-
UO.Printдобавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации. - Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой и не возвращает значение (void). Текст сообщения указан прямо в вызове.
UO.ColorPrint(0x0044, "Hello from C#");Параметры и ход выполнения:
- processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.ColorPrint(0x0044, "Processed item entries: " + Convert.ToString(processed));Параметры и ход выполнения:
- Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При weight >= maximum печатается одна строка и Main завершается; предметы не выбрасываются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ColorPrint(0x0044, "Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Main запоминает вес, ждёт 1000 миллисекунд и вызывает полностью объявленный ReportWeight. Помощник печатает только если вес изменился и возвращает новый вес для следующей проверки. Сам он не создаёт бесконечный цикл.
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.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.ColorPrint(0x0044, "Weight changed: " + Convert.ToString(current));
}
return current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ConColor(object? arg0);Задаёт UO hue для последующих системных сообщений данного скриптового runtime.
-
color— UO hue, не RGB. Число или hex-строка; мост использует младшие 16 бит. Не путайте с graphic/type. 0x0044 в примере — выбранный hue.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Влияет на последующие UO.ClientPrint, UO.AddToJournal и UO.AddToSystemJournal. Не перекрашивает прежние строки, не меняет SpeechHue профиля и не меняет цвет UO.Print без аргумента цвета. Getter прежнего цвета здесь отсутствует: храните выбранный обычный hue в своей переменной.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ConColor");
UO.ConColor(0x0044);Параметры и ход выполнения:
- 0x0044 становится цветом следующей системной строки. Сам ConColor ничего не печатает.
UO.ConColor(0x0044);
UO.AddToSystemJournal("Notice");Параметры и ход выполнения:
- Обычный Print сохраняет свой цвет 0x03B2, а AddToJournal использует заданный 0x0044. Оба сообщения локальные.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.ConColor(0x0044);
UO.Print("Normal Print color");
UO.AddToJournal("System color");
return null;
}Параметры и ход выполнения:
- usualHue=0x0440 — явно выбранный обычный цвет, а не прочитанное старое значение. В try используется временный 0x0035;
finallyвозвращает usualHue, затем следующая строка снова печатается обычным цветом.
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 usualHue = 0x0440;
UO.ConColor(usualHue);
try
{
UO.ConColor(0x0035);
UO.AddToSystemJournal("Temporary warning");
}
finally
{
UO.ConColor(usualHue);
}
UO.AddToSystemJournal("Normal messages again");
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ConsolePrint(object? arg0);Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
-
UO.Printдобавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации. - Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
- Несмотря на Console в имени, это тот же локальный игровой вывод, а не отдельный терминал Windows.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой и не возвращает значение (void). Текст сообщения указан прямо в вызове.
UO.ConsolePrint("Hello from C#");Параметры и ход выполнения:
- processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.ConsolePrint("Processed item entries: " + Convert.ToString(processed));Параметры и ход выполнения:
- Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При weight >= maximum печатается одна строка и Main завершается; предметы не выбрасываются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ConsolePrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Main запоминает вес, ждёт 1000 миллисекунд и вызывает полностью объявленный ReportWeight. Помощник печатает только если вес изменился и возвращает новый вес для следующей проверки. Сам он не создаёт бесконечный цикл.
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.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.ConsolePrint("Weight changed: " + Convert.ToString(current));
}
return current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.FillInfoWindow(object? arg0);Добавляет одну строку в текстовое окно и показывает его.
-
S— Текст строки; значение преобразуется в string.
void — возвращаемого значения нет.
- Ранее накопленные строки сохраняются до ограничения MaxTextWindowLines.
- TextPrint добавляет строку и сам показывает YokoTextWindowGump; TextOpen закрепляет открытое состояние. При переполнении буфера удаляются старейшие строки. Это отдельное текстовое окно, не серверный gump и не UO.GetInfo.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.FillInfoWindow");
UO.FillInfoWindow("Status ready");Параметры и ход выполнения:
- Текст передаётся в клиентское текстовое окно.
UO.FillInfoWindow("Status ready");Параметры и ход выполнения:
- Строка формируется из локального текущего HP.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var status = "HP: " + Convert.ToString(UO.GetHP());
UO.FillInfoWindow(status);
return null;
}Параметры и ход выполнения:
- Вторая команда добавляет second после first.
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()
{
UO.FillInfoWindow("first");
UO.FillInfoWindow("second");
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.FillNewWindow(object? arg0);Очищает текстовое окно, добавляет одну строку и показывает его.
-
S— Текст строки; значение преобразуется в string.
void — возвращаемого значения нет.
- Перед TextPrint выполняется TextClear; ранее накопленные строки удаляются.
- TextPrint добавляет строку и сам показывает YokoTextWindowGump; TextOpen закрепляет открытое состояние. При переполнении буфера удаляются старейшие строки. Это отдельное текстовое окно, не серверный gump и не UO.GetInfo.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.FillNewWindow");
UO.FillNewWindow("Status ready");Параметры и ход выполнения:
- Текст передаётся в клиентское текстовое окно.
UO.FillNewWindow("Status ready");Параметры и ход выполнения:
- Строка формируется из локального текущего HP.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var status = "HP: " + Convert.ToString(UO.GetHP());
UO.FillNewWindow(status);
return null;
}Параметры и ход выполнения:
- Вторая команда заменяет содержимое: остаётся second.
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()
{
UO.FillNewWindow("first");
UO.FillNewWindow("second");
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.FontColor(object? arg0);Устанавливает hue последующих локальных UO.UOAMessage данного скрипта. Не меняет цвет речи персонажа, обычного UO.Print, InfoFindList или тему IDE.
-
color— Обязательный числовой индекс hue 0..65535, например 0x0044. Это не RGB. Внутри хранится int, при выводе приводится к ushort; -1 НЕ означает сброс и превращается в 65535. Начальное значение нового runtime — 0x03B2. Формы без аргумента нет.
void: нет результата, старого цвета или признака успеха. Чтобы позже вернуть свою настройку, храните выбранный hue в переменной скрипта.
- Изменяет только state.FontColor, не печатает сообщение и не отправляет сетевой пакет.
- Действует до следующего FontColor в том же runtime. Другой самостоятельный скрипт имеет своё состояние. UO.Print(text,color) задаёт цвет непосредственно и не читает FontColor.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.FontColor");
UO.FontColor(0x0021);Параметры и ход выполнения:
- 0x0021 — индекс hue; итоговый оттенок зависит от файлов hues клиента. Сообщение видно локально; его не произносит персонаж.
UO.FontColor(0x0021);
var first = UO.FindList("0x0EED", "backpack");
if (Truth(first == ""))
{
UO.UOAMessage("No gold in the loaded backpack");
}
else
{
UO.UOAMessage("Gold units: " + Convert.ToString(UO.FindFullQuantity()));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Полная Notice принимает текст и hue. Последний установленный hue остаётся для следующего UOAMessage этого runtime. Встроенного FontColor() для чтения здесь нет.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
Notice("Supplies checked", 0x0044);
Notice("Restock needed", 0x0021);
return null;
}
void Notice(dynamic text, dynamic hue)
{
UO.FontColor(hue);
UO.UOAMessage(text);
}Параметры и ход выполнения:
- 0x03B2 — начальное значение FontColor нового runtime. Finally возвращает именно выбранную базу при обычном завершении/обрабатываемой ошибке; оно не восстанавливает неизвестное прежнее значение.
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 baseHue = 0x03B2;
try
{
UO.FontColor(0x0021);
UO.UOAMessage("Check the route before moving");
}
finally
{
UO.FontColor(baseHue);
}
UO.UOAMessage("Ready");
UO.Print("Regular Print keeps its own color");
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.HelpRequest();Запрашивает серверное меню помощи.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ExecuteClientApiCompatibility вызывает HelpRequest, который через Invoke передаёт GameActions.RequestHelp. Содержание меню определяется сервером.
- В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.HelpRequest");
UO.HelpRequest();Параметры и ход выполнения:
- Запрашивает серверное меню помощи.
UO.HelpRequest();Параметры и ход выполнения:
- ExecuteClientApiCompatibility вызывает HelpRequest, который через Invoke передаёт GameActions.RequestHelp. Содержание меню определяется сервером.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.IsOnline()))
{
UO.HelpRequest();
}
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 задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
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()
{
if (Truth(UO.IsOnline()))
{
UO.HelpRequest();
UO.Print("Help requested");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Hide();
void UO.Hide(object? arg0);Убирает загруженный предмет или другого персонажа с экрана ClassicUO. Помогает убрать мешающий объект; работает с предметами внутри контейнеров и торговли, надетыми вещами на paperdoll и в его маленьких слотах экипировки.
-
serial— Числовой serial или его hex/десятичная строка. Это не type. Для именованного объекта сначала получите числовую строку через GetSerial(name). Без аргумента появляется локальный прицел.
void — возвращаемого значения нет. Результат нельзя присвоить как serial, graphic/type, количество или true/false. Информация выводится в интерфейс/журнал, а не возвращается скрипту.
- Hide() открывает локальный прицел и сразу возвращает управление скрипту. Щёлкните по вещи на paperdoll, предмету в открытом контейнере или объекту в мире. Escape отменяет выбор.
- Hide(serial) действует сразу на известный загруженный объект. Передавайте serial конкретной стопки/предмета, а не graphic/type. Выбранная стопка скрывается целиком независимо от Amount.
- Предмет остаётся в контейнере: количество, владелец, содержимое и серверное состояние не меняются. FindType/GetContent по-прежнему могут его найти. Скрытие не является фильтром поиска, переносом, удалением, навыком Hiding или серверной невидимостью.
- Обычный контейнер, торговое окно и сетка добычи не рисуют скрытый предмет и не принимают по нему клики/перетаскивание. Флаг сохраняется при перестройке и повторном открытии окна, пока используется тот же загруженный объект.
- Надетая вещь исчезает с paperdoll, из маленького слота и с изображения персонажа. Она остаётся надетой: слой, броня и состояние на сервере не меняются. Скрытая роба больше не перекрывает нижнюю одежду. Изображение персонажа в менеджере обновляется по тому же флагу; список настоящей экипировки остаётся доступным.
- Собственного персонажа, землю и статику Hide не скрывает. Несуществующий serial даёт сообщение. Если скрыть саму сумку, это не закрывает уже открытое окно её содержимого и не скрывает каждый вложенный предмет автоматически.
- Отдельной команды Unhide в текущем API нет. Скрытие принадлежит загруженному экземпляру объекта: его удаление из мира клиента и новая загрузка (например, при переподключении) сбрасывают флаг. Простое закрытие/открытие сундука не является гарантированным способом вернуть предмет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Hide");
UO.Hide();Параметры и ход выполнения:
- Параметров нет. После щелчка исчезает только выбранный предмет; содержимое сундука на сервере не меняется.
UO.Hide();
UO.Print("Select an item to hide locally");Параметры и ход выполнения:
- Hide получает ID результата поиска, не 0x0EED. При отсутствии результата вызов не выполняется. Unit от Hide нельзя сравнивать с true/false.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item == ""))
{
UO.Print("No loaded matching item");
return null;
}
UO.Hide(item);
UO.Print("Stack amount: " + Convert.ToString(UO.GetQuantity(item)));
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Именованный объект сначала разрешается через GetSerial. Проверка Exists означает наличие в памяти, а не успешное скрытие или доступность для переноса.
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 item = UO.GetSerial("decoration");
if (Truth(UO.Exists(item)) && Truth(item != UO.GetSerial("self")))
{
UO.Hide(item);
}
else
{
UO.Print("Select a loaded object other than self");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Параметры и ход выполнения:
- 22 — номер слоя, а не serial или type. Сначала ObjAtLayer получает serial, затем Hide скрывает изображение именно этой вещи. Снятие и передача предмета не выполняются; повторное открытие paperdoll не отменяет скрытие.
var robe = UO.ObjAtLayer(22);
if (Truth(robe == 0))
{
UO.Print("No robe equipped");
return null;
}
UO.Hide(robe);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Morph(object? arg0);Локально меняет graphic текущего персонажа.
-
type— int body graphic либо строка type, разрешаемая ResolveType. 0 восстанавливает graphic, сохранённый при первом Morph; ненулевое число приводится к ushort.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge.Morph без Player ничего не меняет. При первом вызове сохраняет _originalGraphic, затем присваивает Player.Graphic. Runtime обновляет ticksAnim=Timer даже если Player отсутствует.
- Это локальный внешний вид, не серверная трансформация и не изменение расы/доступных навыков. Значения за пределами ushort не проверяются этой bridge-функцией и приводятся к 16 битам.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Morph");
UO.Morph("0x0190");Параметры и ход выполнения:
- Локально меняет graphic текущего персонажа.
UO.Morph("0x0190");Параметры и ход выполнения:
- Bridge.Morph без Player ничего не меняет. При первом вызове сохраняет _originalGraphic, затем присваивает Player.Graphic. Runtime обновляет ticksAnim=Timer даже если Player отсутствует.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.Morph(0);
return null;
}Параметры и ход выполнения:
- Это локальный внешний вид, не серверная трансформация и не изменение расы/доступных навыков. Значения за пределами ushort не проверяются этой bridge-функцией и приводятся к 16 битам.
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()
{
UO.Morph("0x0190");
UO.Wait(500);
UO.Morph(0);
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.OpenIDE();
void UO.OpenIDE(object? arg0);-
filePath— Необязательный путь. Пустой/пробельный — открыть редактор без выбора файла; относительный разрешается от _manager.AutoloadPath, абсолютный сохраняется.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Bridge.OpenIDE подготавливает requested path, затем Invoke вызывает YokoScriptEditorGump.Open(_world,requested). Скрипт из файла не запускается командой OpenIDE.
- Редактор — графическое окно, не внешнее приложение Launch. Чтение/показ файла зависит от существования пути и логики редактора.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.OpenIDE");
UO.OpenIDE();Параметры и ход выполнения:
- Открывает графический редактор C# IDE.
UO.OpenIDE();Параметры и ход выполнения:
- Bridge.OpenIDE подготавливает requested path, затем Invoke вызывает YokoScriptEditorGump.Open(_world,requested). Скрипт из файла не запускается командой OpenIDE.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.OpenIDE("Example.csx");
return null;
}Параметры и ход выполнения:
- Редактор — графическое окно, не внешнее приложение Launch. Чтение/показ файла зависит от существования пути и логики редактора.
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 path = "C:\\UO Scripts\\Example.csx";
UO.OpenIDE(path);
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Print(object? arg0);
void UO.Print(object? arg0, object? arg1);Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.
-
color— UO hue, не RGB. Число или hex-строка; мост использует младшие 16 бит. Не путайте с graphic/type. 0x0044 в примере — выбранный hue. Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
-
UO.Printдобавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации. - Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
UO.Print("C# script started");
UO.Print($"Position: {UO.GetX()}, {UO.GetY()}");Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой и не возвращает значение (void). Текст сообщения указан прямо в вызове.
UO.Print("Hello from C#");Параметры и ход выполнения:
- processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);Параметры и ход выполнения:
- Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При weight >= maximum печатается одна строка и Main завершается; предметы не выбрасываются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.Print("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum), 0x0044);
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Main запоминает вес, ждёт 1000 миллисекунд и вызывает полностью объявленный ReportWeight. Помощник печатает только если вес изменился и возвращает новый вес для следующей проверки. Сам он не создаёт бесконечный цикл.
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.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.Print("Weight changed: " + Convert.ToString(current), 0x0044);
}
return current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.RemoveFigure(object? arg0);Удаляет локальную фигуру карты по её ID.
-
FigureID— int ID, возвращённый AddFigure. Это не serial предмета и не ID gump.
int — результат bridge.RemoveMapFigure: 1/0 по наличию удалённой фигуры. Runtime-запись удаляется независимо от результата bridge.
- Сначала вызывает bridge.RemoveMapFigure, затем state.MapFigures.Remove(id), затем возвращает bridge-результат. Неизвестный ID не создаёт фигуру и не вызывает серверного действия.
- Локальная фигура карты не является предметом мира. Другие фигуры и серверная геометрия не меняются.
- WorldMapGump хранит рисунки в статическом словаре процесса. Обычные скрипты/чат/макросы одного мира/профиля используют общий GetPersistentState и счётчик ID; отдельные процессы Manager не делят рисунки. World.Clear/YokoScripts.Clear и загрузка состояния профиля не очищают и не восстанавливают этот словарь (loader восстанавливает только UserStatics). Поэтому рисунки могут пережить смену мира/профиля в том же процессе с учётом worldNum; новое состояние может повторно выделить уже существующий ID рисунка. ClearFigures явно очищает рисунки и записи текущего состояния. Успех — запись/удаление данных, не доказательство показа.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
var id = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print("Removed flag: " + Convert.ToString(UO.RemoveFigure(id)));Параметры и ход выполнения:
- Удаляет локальную фигуру карты по её ID.
UO.Print(UO.RemoveFigure(1));Параметры и ход выполнения:
- Сначала вызывает bridge.RemoveMapFigure, затем state.MapFigures.Remove(id), затем возвращает bridge-результат. Неизвестный ID не создаёт фигуру и не вызывает серверного действия.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
dynamic[] figure = new dynamic[checked((int)(10) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = UO.GetX() + 1;
figure[5] = UO.GetY() + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
figure[10] = "Example";
var id = UO.AddFigure(figure);
if (Truth(id > 0))
{
UO.Print(UO.RemoveFigure(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;Параметры и ход выполнения:
- Локальная фигура карты не является предметом мира. Другие фигуры и серверная геометрия не меняются.
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 id = 1;
var first = UO.RemoveFigure(id);
var second = UO.RemoveFigure(id);
UO.Print(Convert.ToString(first) + " " + Convert.ToString(second));
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ServerPrint(object? arg0);Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.
Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.
- Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
-
UO.Printдобавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации. - Без цвета используется hue 0x03B2. UO.Print(text, color) принимает текст первым; UO.ColorPrint(color, text) — цвет первым.
- Несмотря на Server в имени либо сходство с сетевым сообщением, команда только печатает локальный текст. Чтобы говорить в мир, используйте UO.Say.
- UO.Print · UO.CharPrint · UO.Say · UO.ConColor
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой и не возвращает значение (void). Текст сообщения указан прямо в вызове.
UO.ServerPrint("Hello from C#");Параметры и ход выполнения:
- processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.ServerPrint("Processed item entries: " + Convert.ToString(processed));Параметры и ход выполнения:
- Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При weight >= maximum печатается одна строка и Main завершается; предметы не выбрасываются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ServerPrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Main запоминает вес, ждёт 1000 миллисекунд и вызывает полностью объявленный ReportWeight. Помощник печатает только если вес изменился и возвращает новый вес для следующей проверки. Сам он не создаёт бесконечный цикл.
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.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.ServerPrint("Weight changed: " + Convert.ToString(current));
}
return current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetShowZ(object? arg0);Меняет локальный флаг showZ runtime.
-
stateValue— 0 выключает; любое ненулевое целое включает.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Присваивает showZ значение 0 либо 1 после NumberConversions.ToInt. Эта функция сама не изменяет координаты и не отправляет пакет.
- Это compatibility-хранилище текущего runtime. В проекте нет потребителей private mulPath/showZ; изменение не перезагружает assets и не меняет отображение высоты.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetShowZ");
UO.SetShowZ(1);Параметры и ход выполнения:
- Меняет локальный флаг showZ runtime.
UO.SetShowZ(1);Параметры и ход выполнения:
- Присваивает showZ значение 0 либо 1 после NumberConversions.ToInt. Эта функция сама не изменяет координаты и не отправляет пакет.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.SetShowZ(0);
return null;
}Параметры и ход выполнения:
- Это compatibility-хранилище текущего runtime. В проекте нет потребителей private mulPath/showZ; изменение не перезагружает assets и не меняет отображение высоты.
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()
{
ApplyValue(1);
return null;
}
void ApplyValue(dynamic value)
{
UO.SetShowZ(value);
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetSilentMode(object? arg0);Меняет локальный флаг SilentMode runtime.
-
Value— 0 выключает; любое ненулевое целое включает.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Сохраняет SilentMode как 0/1. GumpLinesResult читает флаг: при 0 непустые результаты GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription дополнительно печатаются в текстовое окно и открывают его; при 1 этот дополнительный показ подавляется. Возвращаемый массив не меняется. Другие Print, звуки и сообщения сервера не подавляются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetSilentMode");
UO.SetSilentMode(1);Параметры и ход выполнения:
- Сохраняет SilentMode как 0/1. GumpLinesResult читает флаг: при 0 непустые результаты GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription дополнительно печатаются в текстовое окно и открывают его; при 1 этот дополнительный показ подавляется. Возвращаемый массив не меняется. Другие Print, звуки и сообщения сервера не подавляются.
UO.SetSilentMode(1);Параметры и ход выполнения:
- Сохраняет SilentMode как 0/1. GumpLinesResult читает флаг: при 0 непустые результаты GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription дополнительно печатаются в текстовое окно и открывают его; при 1 этот дополнительный показ подавляется. Возвращаемый массив не меняется. Другие Print, звуки и сообщения сервера не подавляются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.SetSilentMode(0);
return null;
}Параметры и ход выполнения:
- Сохраняет SilentMode как 0/1. GumpLinesResult читает флаг: при 0 непустые результаты GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription дополнительно печатаются в текстовое окно и открывают его; при 1 этот дополнительный показ подавляется. Возвращаемый массив не меняется. Другие Print, звуки и сообщения сервера не подавляются.
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()
{
ApplyValue(1);
return null;
}
void ApplyValue(dynamic value)
{
UO.SetSilentMode(value);
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ShowJournal();Открывает локальное окно журнала клиента.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ShowJournal вызывает GameActions.OpenJournal(_world). Записи не очищаются и текст серверу не отправляется.
- Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.ShowJournal");
UO.ShowJournal();Параметры и ход выполнения:
- Открывает локальное окно журнала клиента.
UO.ShowJournal();Параметры и ход выполнения:
- ShowJournal вызывает GameActions.OpenJournal(_world). Записи не очищаются и текст серверу не отправляется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.Print("Journal example");
UO.ShowJournal();
return null;
}Параметры и ход выполнения:
- Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
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()
{
UO.ShowJournal();
UO.Print(UO.LineCount());
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Snap();
int UO.Snap(object? arg0);
int UO.Snap(object? arg0, object? arg1);
int UO.Snap(object? arg0, object? arg1, object? arg2);Сохраняет снимок графического окна клиента.
-
name— Необязательное имя файла. .jpg/.jpeg выбирает JPEG, прочее/отсутствие — PNG. Каталоги из имени удаляются; используется только базовое имя. -
file— Необязательное имя файла. .jpg/.jpeg выбирает JPEG, прочее/отсутствие — PNG. Каталоги из имени удаляются; используется только базовое имя. -
quality— Необязательный int, по умолчанию 100, ограничивается 1..100. Влияет на JPEG; PNG не использует lossy quality. -
includeUI— Необязательный bool, по умолчанию true. false рисует мир/освещение без UI.
Числовой флаг int: 1 — файл снимка сохранён, 0 — ошибка захвата/записи. Без графического окна RequireGameView бросает ошибку до TakeScreenshot.
- TakeScreenshot пишет в ExecutablePath/Data/Client/Screenshots, очищает недопустимые символы имени, выбирает автоматически имя по дате при пустом, добавляет _2/_3 при существующем файле. Произвольный абсолютный путь не используется.
- С UI читает backbuffer; без UI создаёт RenderTarget2D и рендерит мир. JPEG временно задаёт FNA_GRAPHICS_JPEG_SAVE_QUALITY с восстановлением; PNG SaveAsPng. Ошибки внутри TakeScreenshot логируются и дают 0.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Snap();
UO.Print("Snap: " + Convert.ToString(result));Параметры и ход выполнения:
- Сохраняет снимок графического окна клиента.
UO.Print(UO.Snap());Параметры и ход выполнения:
- TakeScreenshot пишет в ExecutablePath/Data/Client/Screenshots, очищает недопустимые символы имени, выбирает автоматически имя по дате при пустом, добавляет _2/_3 при существующем файле. Произвольный абсолютный путь не используется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.Print(UO.Snap("manual-example.jpg", 85));
return null;
}Параметры и ход выполнения:
- С UI читает backbuffer; без UI создаёт RenderTarget2D и рендерит мир. JPEG временно задаёт FNA_GRAPHICS_JPEG_SAVE_QUALITY с восстановлением; PNG SaveAsPng. Ошибки внутри TakeScreenshot логируются и дают 0.
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()
{
UO.Print(UO.Snap("manual-world.png", 100, false));
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.TextClear();Очищает буфер локального текстового окна.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Очищает _textWindow; если окно было открыто, заново показывает его с пустым списком. Закрытое окно остаётся закрытым. Журнал клиента не очищается.
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.TextClear");
UO.TextClear();Параметры и ход выполнения:
- Очищает буфер локального текстового окна.
UO.TextClear();Параметры и ход выполнения:
- Очищает _textWindow; если окно было открыто, заново показывает его с пустым списком. Закрытое окно остаётся закрытым. Журнал клиента не очищается.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.TextPrint("Old line");
UO.TextClear();
return null;
}Параметры и ход выполнения:
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
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()
{
UO.TextClose();
UO.TextClear();
UO.TextOpen();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.TextClose();Закрывает локальное текстовое окно, сохраняя буфер.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Задаёт _textWindowOpen=false и Dispose существующего YokoTextWindowGump. Список _textWindow не очищается; TextOpen снова покажет его строки.
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.TextClose");
UO.TextClose();Параметры и ход выполнения:
- Закрывает локальное текстовое окно, сохраняя буфер.
UO.TextClose();Параметры и ход выполнения:
- Задаёт _textWindowOpen=false и Dispose существующего YokoTextWindowGump. Список _textWindow не очищается; TextOpen снова покажет его строки.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.TextPrint("Retained line");
UO.TextClose();
return null;
}Параметры и ход выполнения:
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
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()
{
UO.TextPrint("Retained line");
UO.TextClose();
UO.Wait(250);
UO.TextOpen();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.TextOpen();Открывает локальное текстовое окно.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Сохраняет _textWindowOpen=true и вызывает YokoTextWindowGump.Show с текущим _textWindow. Буфер не очищается; повторное открытие показывает накопленные строки.
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.TextOpen");
UO.TextOpen();Параметры и ход выполнения:
- Открывает локальное текстовое окно.
UO.TextOpen();Параметры и ход выполнения:
- Сохраняет _textWindowOpen=true и вызывает YokoTextWindowGump.Show с текущим _textWindow. Буфер не очищается; повторное открытие показывает накопленные строки.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.TextPrint("Example");
UO.TextOpen();
return null;
}Параметры и ход выполнения:
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
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()
{
UO.TextOpen();
UO.Wait(500);
UO.TextClose();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.TextPrint(object? arg0);Добавляет строку в локальное текстовое окно и открывает его.
-
text— Текст через ToString; сохраняется как передан.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- При лимите MaxTextWindowLines=2000 удаляет старые строки, затем добавляет text или пустую строку, задаёт _textWindowOpen=true и показывает окно. Это не UO.Print в журнал и не речь серверу.
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.TextPrint");
UO.TextPrint("Example");Параметры и ход выполнения:
- Добавляет строку в локальное текстовое окно и открывает его.
UO.TextPrint("Example");Параметры и ход выполнения:
- При лимите MaxTextWindowLines=2000 удаляет старые строки, затем добавляет text или пустую строку, задаёт _textWindowOpen=true и показывает окно. Это не UO.Print в журнал и не речь серверу.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var message = "Line 1";
UO.TextPrint(message);
UO.TextPrint("Line 2");
return null;
}Параметры и ход выполнения:
- Действие относится к локальному интерфейсу/буферу; сетевого сообщения и серверного подтверждения нет.
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()
{
UO.TextClear();
UO.TextPrint("Fresh report");
UO.TextClose();
return null;
}
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.UpdateFigure(object? arg0, object? arg1);Заменяет описание существующей локальной фигуры карты.
-
FigureID— int ID в state.MapFigures, полученный AddFigure. Неизвестный ID даёт 0. -
figure— Array либо строка с |: [kind,coord,x1,y1,x2,y2,brushColor,brushStyle,color,worldNum,text]. Минимум первые 9 числовых полей; worldNum по умолчанию текущая карта, text по умолчанию пустой. -
figure[0] (kind)— kind должен быть 0..4, coord — 0..1, FigureID — положительным. WorldMapGump.SetYokoMapFigure возвращает 0 при нарушении этих границ. -
figure[1] (coord)— kind должен быть 0..4, coord — 0..1, FigureID — положительным. WorldMapGump.SetYokoMapFigure возвращает 0 при нарушении этих границ.
Числовой флаг int: 1 — разбор успешен и bridge.SetMapFigure вернул ненулевой результат, после чего запись обновлена; 0 — нет ID, ошибка структуры/числового текстового поля или bridge отказал.
- TryMapFigureArg принимает Array либо |string. Первые 9 полей преобразуются; числовой текст проверяется TryStr2Int. Неподдерживаемый вид/короткая запись — 0, ошибки преобразования другого вида могут прерывать скрипт.
- При отказе bridge существующая runtime-запись не заменяется. При успехе сохраняется SerializeMapFigure с 10 числовыми полями и текстом. Фигура только локальная, не серверный предмет.
- kind: 0 линия, 1 эллипс (32 отрезка контура), 2 контур прямоугольника, 3 стрелка, 4 текст. coord=0 — мировые координаты с преобразованием на карту, coord=1 — пиксели относительно области рисования карты. x1/y1 и x2/y2 — концы/границы; у мировой стрелки x2=y2=0 задаёт начало Player и цель x1/y1. color — 0x00BBGGRR (младший byte красный), цвет контура. brushColor/brushStyle сохраняются, но рендер их не читает: заливки нет. worldNum<0 показывает на любой карте, иначе только указанной. Текст рисуется у первой точки (+3 пикселя у нетекстовых фигур) шрифтом карты, не цветом контура.
- WorldMapGump хранит рисунки в статическом словаре процесса. Обычные скрипты/чат/макросы одного мира/профиля используют общий GetPersistentState и счётчик ID; отдельные процессы Manager не делят рисунки. World.Clear/YokoScripts.Clear и загрузка состояния профиля не очищают и не восстанавливают этот словарь (loader восстанавливает только UserStatics). Поэтому рисунки могут пережить смену мира/профиля в том же процессе с учётом worldNum; новое состояние может повторно выделить уже существующий ID рисунка. ClearFigures явно очищает рисунки и записи текущего состояния. Успех — запись/удаление данных, не доказательство показа.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
object?[] figure = { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 };
var id = UO.AddFigure(figure);
figure[8] = 65280;
UO.Print("Updated flag: " + Convert.ToString(UO.UpdateFigure(id, figure)));Параметры и ход выполнения:
- Заменяет описание существующей локальной фигуры карты.
dynamic[] figure = new dynamic[checked((int)(8) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = 100;
figure[3] = 100;
figure[4] = 101;
figure[5] = 101;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
UO.Print(UO.UpdateFigure(1, figure));Параметры и ход выполнения:
- TryMapFigureArg принимает Array либо |string. Первые 9 полей преобразуются; числовой текст проверяется TryStr2Int. Неподдерживаемый вид/короткая запись — 0, ошибки преобразования другого вида могут прерывать скрипт.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
dynamic[] figure = new dynamic[checked((int)(10) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = UO.GetX() + 1;
figure[5] = UO.GetY() + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
figure[10] = "Example";
var id = UO.AddFigure(figure);
if (Truth(id > 0))
{
UO.Print(UO.UpdateFigure(id, figure));
UO.RemoveFigure(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 существующая runtime-запись не заменяется. При успехе сохраняется SerializeMapFigure с 10 числовыми полями и текстом. Фигура только локальная, не серверный предмет.
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 figure = "0|0|100|100|101|101|0|0|0";
UO.Print(UO.UpdateFigure(1, figure));
return null;
}
}ClassicUO — Bad Newbie & C# Scripts IDE