Skip to content

RU UO Topic journal

Codex edited this page Oct 11, 2026 · 3 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Journal

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

Поиск и ожидание сообщений, индексы строк, время, цвет и serial автора. Отделяйте старые строки журнала от сообщения, которое ожидаете после действия.

Разделы

Тема Команды и пояснения
Journal UO.Journal
InJournal UO.InJournal
InJournalBetweenTimes UO.InJournalBetweenTimes
WaitJournalLine UO.WaitJournalLine
System Journal UO.AddToSystemJournal · UO.AddToSystemJournalEx · UO.ClearSystemJournal · UO.WaitJournalLineSystem
Journal Ignore UO.AddJournalIgnore · UO.ClearJournalIgnore
Journal Color UO.JournalColor · UO.GetJournalColor
Journal Serial UO.JournalSerial · UO.GetJournalSerial
Journal Timer UO.JournalTimer
Found Text UO.GetFoundedText · UO.GetFoundedTextColor · UO.GetFoundedTextID · UO.GetFoundedTextIndex · UO.GetFoundedTextSerial · UO.GetFoundedTextTimer

Все команды темы

Journal

UO.Journal · UO.GetJournal · UO.InJournal · UO.InJournalBetweenTimes · UO.LowJournal · UO.HighJournal · UO.ClearJournal · UO.DeleteJournal · UO.ChangeJournalLength · UO.SetJournalLine · UO.AddToJournal · UO.LastJournalMessage · UO.LastMessage

Waiting

UO.WaitJournalLine · UO.WaitJournalLineSystem · UO.WaitingForJournalText

Система Journal

UO.AddToSystemJournal · UO.AddToSystemJournalEx · UO.ClearSystemJournal

Journal Ignore

UO.AddJournalIgnore · UO.ClearJournalIgnore

Информация о линии

UO.JournalColor · UO.GetJournalColor · UO.JournalSerial · UO.GetJournalSerial · UO.JournalTimer · UO.LineCount · UO.LineID · UO.LineIndex · UO.LineMsgType · UO.LineName · UO.LineTextColor · UO.LineTextFont · UO.LineTime · UO.LineType

Найденный текст

UO.FoundedParamId · UO.GetFoundedText · UO.GetFoundedTextColor · UO.GetFoundedTextID · UO.GetFoundedTextIndex · UO.GetFoundedTextSerial · UO.GetFoundedTextTimer

Примеры по теме

В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.

UO.InJournal

Параметры, результат и все сценарии

var found = UO.InJournal("You see");
if (Truth(found > 0))
{
    var text = UO.GetFoundedText();
    UO.Print(text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.WaitJournalLine

Параметры, результат и все сценарии

var started = Now();
var found = UO.WaitJournalLine(started, "success|failed", 3000);
if (Truth(found))
{
    UO.Print(UO.GetFoundedText());
}
else
{
    UO.Print("Timeout");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

Полное описание команд


UO.AddJournalIgnore

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.AddJournalIgnore(object? arg0);

Добавляет локальный текстовый фильтр для записей игрового журнала ClassicUO.

Параметры

  • Convert.ToString — непустой текстовый фрагмент для поиска в тексте записи журнала.

Возвращает

void. Команда не возвращает число совпадений.

Поведение

  • Текст обрезается по краям; пустая строка не добавляется. При проверке записи поиск подстроки выполняется без учёта регистра. Совпавшая запись скрывается локально в журнале клиента; сервер не получает фильтр. UO.ClearJournalIgnore() очищает все добавленные текстовые фильтры. Уже отображённые записи не восстанавливаются при очистке.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.AddJournalIgnore");
UO.AddJournalIgnore("You see");

1. Скрывать новые записи, содержащие эту фразу. — прямой скрипт

Параметры и ход выполнения:

  • Скрывать новые записи, содержащие эту фразу.
UO.AddJournalIgnore("You see");

2. Фильтр ищет подстроку без учёта регистра. — функция сценария

Параметры и ход выполнения:

  • Фильтр ищет подстроку без учёта регистра.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var phrase = "vendor";
    UO.AddJournalIgnore(phrase);
    return null;
}

3. Несколько вызовов добавляют независимые текстовые фильтры. — класс сценария

Параметры и ход выполнения:

  • Несколько вызовов добавляют независимые текстовые фильтры.
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.AddJournalIgnore("You see");
        UO.AddJournalIgnore("vendor");
        return null;
    }
}

UO.AddToJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.AddToJournal(object? arg0);

Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.

Параметры

Возвращает

Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.

Поведение

  • Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
  • UO.Print добавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации.
  • Используется цвет системных сообщений данного скриптового runtime: первоначально 0x0440, изменяется UO.ConColor. Это локальная запись; имя команды не означает отправку серверу.
  • UO.Print · UO.CharPrint · UO.Say · UO.ConColor

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.AddToJournal");
UO.AddToJournal("Script started");

1. Краткий отчёт — прямой скрипт

Параметры и ход выполнения:

  • processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.AddToJournal("Processed item entries: " + Convert.ToString(processed));

2. Предупреждение о перегрузе — функция сценария

Параметры и ход выполнения:

  • Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При 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.AddToJournal("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;

3. Сообщать только об изменении веса — класс сценария

Параметры и ход выполнения:

  • 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.AddToJournal("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;
}

UO.AddToSystemJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.AddToSystemJournal(object? arg0);

Показывает локальное сообщение о ходе скрипта или условии остановки. Его видите вы, а не другие игроки.

Параметры

Возвращает

Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.

Поведение

  • Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
  • UO.Print добавляет новую запись в журнал игровых сообщений: сначала прочитайте или сохраните нужную строку/результат поиска, затем запишите диагностическое сообщение. В быстром цикле записывайте сообщения при изменениях, а не на каждой итерации.
  • Используется цвет системных сообщений данного скриптового runtime: первоначально 0x0440, изменяется UO.ConColor. Это локальная запись; имя команды не означает отправку серверу.
  • UO.Print · UO.CharPrint · UO.Say · UO.ConColor

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.AddToSystemJournal");
UO.AddToSystemJournal("Script started");

1. Краткий отчёт — прямой скрипт

Параметры и ход выполнения:

  • processed=12 — демонстрационное число уже обработанных предметов. Convert.ToString превращает его в строку. Этот пример только сообщает число, сам предметы не переносит.
var processed = 12;
UO.AddToSystemJournal("Processed item entries: " + Convert.ToString(processed));

2. Предупреждение о перегрузе — функция сценария

Параметры и ход выполнения:

  • Читаются вес и максимум персонажа. Нулевой/неизвестный максимум не считается перегрузом. При 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.AddToSystemJournal("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;

3. Сообщать только об изменении веса — класс сценария

Параметры и ход выполнения:

  • 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.AddToSystemJournal("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;
}

UO.AddToSystemJournalEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.AddToSystemJournalEx(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);

Выводит локальную строку в игровое окно и журнал с приближённым отображением заданного оформления. Полезно для различимых диагностических сообщений скрипта.

Параметры

  • TextColor — Цвет текста в формате 0xRRGGBB, не UO hue. Альфа-канал не используется. Пример 0xFF8800 — оранжевый; движок выбирает ближайший цвет из палитры UO.
  • BGColor — Отрицательное число — фон по умолчанию; неотрицательное — RGB 0xRRGGBB. Запрошенный фон записывается в вывод IDE, но отдельный цветной прямоугольник за строкой в игровом окне не рисуется.
  • FontSize — Запрошенный размер в пунктах: значение <= 0 заменяется на 10, затем применяется диапазон 4..72. Игровой номер шрифта вычисляется целочисленно как (размер + 1) / 3; точного настольного размера в окне игры нет.
  • FontName — Название шрифта для записи сведений об оформлении в вывод IDE. Пробелы по краям удаляются; пустое значение означает Consolas. Произвольный Windows-шрифт в игровое окно эта команда не загружает.

Возвращает

Вызов метода с возвращаемым типом void пишется как самостоятельный оператор C#; присваивать или проверять результат нельзя. Завершение оператора не является подтверждением игрового сервера.

Поведение

  • Все пять аргументов обязательны: Text, TextColor, BGColor, FontSize, FontName. Текст виден локально, в IDE дополнительно сохраняется запрошенное оформление. Цвет фона и имя шрифта являются сведениями об оформлении, а не гарантией их точного воспроизведения. ConColor не меняет явно переданный RGB.
  • Сообщение идёт в нижнюю левую область игрового окна и локальный журнал. Копия доступна в выводе IDE. В общем журнале менеджера включите фильтр сообщений скриптов (script): запись доступна и без игрового окна. Фильтр серверных системных сообщений (system) такие записи не выбирает. Сетевой пакет речи не отправляется. Для надписи над головой есть UO.CharPrint.
  • UO.Print · UO.CharPrint · UO.ClientPrintEx · UO.AddToSystemJournalEx

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.AddToSystemJournalEx");
UO.AddToSystemJournalEx("Route started", 0xFF8800, -1, 12, "Consolas");

1. UO.AddToSystemJournalEx — 1 — прямой скрипт

Параметры и ход выполнения:

  • Оранжевое сообщение, фон -1 по умолчанию, размер 12: получается игровой шрифт 4. Consolas сохраняется в сведениях IDE. Цвет может отличаться от точного RGB из-за палитры игры.
UO.AddToSystemJournalEx("Route started", 0xFF8800, -1, 12, "Consolas");

2. UO.AddToSystemJournalEx — 2 — функция сценария

Параметры и ход выполнения:

  • Положительное значение BGColor 0x112233 сохраняет запрос фона в IDE. Для FontSize=0 используется 10, пустой FontName становится Consolas. В игровом окне фон по этому параметру не закрашивается.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.AddToSystemJournalEx("Formatting details", 0x33AAFF, 0x112233, 0, "");
    return null;
}

3. UO.AddToSystemJournalEx — 3 — класс сценария

Параметры и ход выполнения:

  • ReportCount — полностью объявленная процедура. Она сообщает только об изменении количества, выбирая зелёный RGB при росте и красный при уменьшении. Возвращает новое количество для следующего сравнения; результат принадлежит ReportCount, а не AddToSystemJournalEx.
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 = 10;
        previous = ReportCount(previous, 12);
        return null;
    }

    dynamic ReportCount(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            var textColor = 0xCC3333;
            if (Truth(current > previous))
            {
                textColor = 0x33AA66;
            }

            UO.AddToSystemJournalEx("Count: " + Convert.ToString(current), textColor, -1, 10, "Consolas");
        }

        return current;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

UO.ChangeJournalLength

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ChangeJournalLength(object? arg0);

Меняет предел сохраняемой истории журналов клиента.

Параметры

  • newLength — Число записей, преобразуемое в int. Runtime ограничивает снизу до 1; JournalManager ограничивает сверху Constants.MAX_JOURNAL_HISTORY_COUNT.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Сохраняет state.JournalLength, затем вызывает SetJournalLength. JournalManager уменьшает существующую историю, удаляя самые старые записи до нового лимита. Отфильтрованные записи и отображение журнала — отдельные механизмы.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ChangeJournalLength");
UO.ChangeJournalLength(100);

1. История на 100 записей — прямой скрипт

Параметры и ход выполнения:

  • Новый предел ограничивает число сохраняемых записей.
UO.ChangeJournalLength(100);

2. Минимальная история — функция сценария

Параметры и ход выполнения:

  • При уменьшении лимита старые записи удаляются.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.ChangeJournalLength(1);
    return null;
}

3. Нулевой ввод — класс сценария

Параметры и ход выполнения:

  • Ноль нормализуется в 1, а не очищает журнал.
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.ChangeJournalLength(0);
        return null;
    }
}

UO.ClearJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ClearJournal();

Удаляет строки из общего локального журнала.

Параметры

Параметров нет.

Возвращает

void — нет возвращаемого значения. Не возвращает число удалённых строк. Счётчик совпадений и выбор текущего скрипта сбрасываются.

Поведение

  • Общий буфер доступен всем скриптам: удалённые строки перестают находиться. Снимки, ранее сохранённые другими скриптами, могут остаться, но их индекс станет -1.
  • Без текстового фильтра очищается весь буфер Classic UO, включая System. Локальный файл журнала и сообщения сервера не удаляются.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ClearJournal");
UO.ClearJournal();

1. Очистить выбранную область журнала — прямой скрипт

Параметры и ход выполнения:

  • Аргументов нет. Удаляются все строки общего буфера.
  • Счётчик последнего поиска становится 0; Print после очистки может добавить новую строку.
UO.ClearJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));

2. Очистить перед ожиданием — функция сценария

Параметры и ход выполнения:

  • Очистка выполняется до сохранения временной метки. 1000 — ограниченное ожидание в миллисекундах.
  • Для исключения старых сообщений обычно достаточно метки времени; очистка затрагивает и другие скрипты.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.ClearJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. Проверить сброс выбранной записи — класс сценария

Параметры и ход выполнения:

  • После очистки через текущий скрипт index=-1, даже если удалялась только часть буфера.
  • Переменная text сохраняет ранее прочитанную копию, а GetFoundedText уже очищен.
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 text = UO.Journal(0);
        UO.ClearJournal();
        var index = UO.LineIndex();
        UO.Print(Convert.ToString(index));
        return null;
    }
}

UO.ClearJournalIgnore

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ClearJournalIgnore();

Удаляет все текстовые фильтры JournalManager.

Параметры

Параметров нет.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Удаление фильтров не удаляет историю и не отменяет фильтры имён AddChatUserIgnore.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ClearJournalIgnore");
UO.ClearJournalIgnore();

1. Очистить состояние — прямой скрипт

Параметры и ход выполнения:

  • Удаляет все текстовые фильтры JournalManager.
UO.ClearJournalIgnore();

2. Очистить после настройки — функция сценария

Параметры и ход выполнения:

  • Снова разрешить отображение текста You see.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.AddJournalIgnore("You see");
    UO.ClearJournalIgnore();
    return null;
}

3. Повторная очистка — класс сценария

Параметры и ход выполнения:

  • Очистка пустого набора допустима и не создаёт новую настройку.
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.ClearJournalIgnore();
        UO.ClearJournalIgnore();
        return null;
    }
}

UO.ClearSystemJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.ClearSystemJournal();

Удаляет строки с именем автора System.

Параметры

Параметров нет.

Возвращает

void — нет возвращаемого значения. Не возвращает число удалённых строк. Счётчик совпадений и выбор текущего скрипта сбрасываются.

Поведение

  • Общий буфер доступен всем скриптам: удалённые строки перестают находиться. Снимки, ранее сохранённые другими скриптами, могут остаться, но их индекс станет -1.
  • System распознаётся по имени автора без учёта регистра; это фильтр общего журнала ClassicUO.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.ClearSystemJournal");
UO.ClearSystemJournal();

1. Очистить выбранную область журнала — прямой скрипт

Параметры и ход выполнения:

  • Аргументов нет. Удаляются только строки System.
  • Счётчик последнего поиска становится 0; Print после очистки может добавить новую строку.
UO.ClearSystemJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));

2. Очистить перед ожиданием — функция сценария

Параметры и ход выполнения:

  • Очистка выполняется до сохранения временной метки. 1000 — ограниченное ожидание в миллисекундах.
  • Для исключения старых сообщений обычно достаточно метки времени; очистка затрагивает и другие скрипты.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.ClearSystemJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. Проверить сброс выбранной записи — класс сценария

Параметры и ход выполнения:

  • После очистки через текущий скрипт index=-1, даже если удалялась только часть буфера.
  • Переменная text сохраняет ранее прочитанную копию, а GetFoundedText уже очищен.
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 text = UO.Journal(0);
        UO.ClearSystemJournal();
        var index = UO.LineIndex();
        UO.Print(Convert.ToString(index));
        return null;
    }
}

UO.DeleteJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.DeleteJournal();
void UO.DeleteJournal(object? arg0);

Удаляет строки из общего локального журнала.

Параметры

  • text — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон. Необязателен только у DeleteJournal: при передаче удаляются подходящие строки без учёта регистра; без аргумента удаляется весь буфер.

Возвращает

void — нет возвращаемого значения. Не возвращает число удалённых строк. Счётчик совпадений и выбор текущего скрипта сбрасываются.

Поведение

  • Общий буфер доступен всем скриптам: удалённые строки перестают находиться. Снимки, ранее сохранённые другими скриптами, могут остаться, но их индекс станет -1.
  • Без текстового фильтра очищается весь буфер Classic UO, включая System. Локальный файл журнала и сообщения сервера не удаляются.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.DeleteJournal");
UO.DeleteJournal();

1. Очистить выбранную область журнала — прямой скрипт

Параметры и ход выполнения:

  • Аргументов нет. Удаляются все строки общего буфера.
  • Счётчик последнего поиска становится 0; Print после очистки может добавить новую строку.
UO.DeleteJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));

2. Очистить перед ожиданием — функция сценария

Параметры и ход выполнения:

  • Очистка выполняется до сохранения временной метки. 1000 — ограниченное ожидание в миллисекундах.
  • Для исключения старых сообщений обычно достаточно метки времени; очистка затрагивает и другие скрипты.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.DeleteJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. Проверить сброс выбранной записи — класс сценария

Параметры и ход выполнения:

  • После очистки через текущий скрипт index=-1, даже если удалялась только часть буфера.
  • Переменная text сохраняет ранее прочитанную копию, а GetFoundedText уже очищен.
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 text = UO.Journal(0);
        UO.DeleteJournal();
        var index = UO.LineIndex();
        UO.Print(Convert.ToString(index));
        return null;
    }
}

4. Удалить только подходящий текст — прямой скрипт

Параметры и ход выполнения:

  • text содержит две подстроки. Удаляются строки с любой из них без учёта регистра; остальные сообщения остаются.
  • found=0 при отсутствии новых подходящих сообщений после удаления. Пустой шаблон в этой реализации подходит всем строкам.
UO.DeleteJournal("notice|warning");
var found = UO.InJournal("notice|warning", -1);
UO.Print(Convert.ToString(found));

UO.FoundedParamId

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.FoundedParamId();

Возвращает номер совпавшей альтернативы поискового шаблона.

Параметры

Параметров нет.

Возвращает

int — индекс от 0 в списке непустых альтернатив через |: success|failed даёт 0 для success и 1 для failed. При нескольких подходящих альтернативах берётся первая в шаблоне. Без совпадения или после прямого Journal также 0. Это не serial автора, не номер строки и не type сообщения.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Сначала проверяйте результат поиска > 0. Значение 0 само по себе не подтверждает успех. Пробелы по краям и пустые альтернативы удаляются до нумерации.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; . В этой адаптации ID означает альтернативу, поля автора и типа доступны отдельно через LineID/LineMsgType.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.FoundedParamId();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Два исхода — прямой скрипт

Параметры и ход выполнения:

  • success — альтернатива 0, failed — альтернатива 1. Успех поиска проверяется отдельно.
  • Это анализ текста, а не подтверждение игровой операции сервером.
if (Truth(UO.InJournal("success|failed") > 0))
{
    var outcome = UO.FoundedParamId();
    if (Truth(outcome == 0))
    {
        UO.Print("Success text");
    }
    else
    {
        UO.Print("Failure text");
    }
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Три исхода без регистра — функция сценария

Параметры и ход выполнения:

  • -1 отключает регистр. Результаты 0, 1, 2 соответствуют порядку альтернатив.
  • Если строка содержит несколько вариантов, возвращается первый подходящий по порядку шаблона.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.InJournal("mining|ore|empty", -1) > 0))
    {
        var kind = UO.FoundedParamId();
        UO.Print("Alternative: " + Convert.ToString(kind));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить исход перед чтением другой строки — класс сценария

Параметры и ход выполнения:

  • Journal(0) меняет выбор и сбрасывает ID альтернативы, поэтому outcome сохраняется заранее.
  • Новый вызов getter после Journal уже не описывает предыдущий шаблон.
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.InJournal("success|failed") > 0))
        {
            var outcome = UO.FoundedParamId();
            var latest = UO.Journal(0);
            UO.Print("Saved outcome: " + Convert.ToString(outcome));
        }

        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.GetFoundedText

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetFoundedText();

Возвращает текст выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

string — текст выбранной записи; пустая строка без выбора. Пустой текст допустим у существующей записи.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.
  • Первичный справочник: https://forum.yoko.com.ua/viewtopic.php?p=27633 .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedText();
UO.Print("GetFoundedText: " + Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • string — текст выбранной записи; пустая строка без выбора. Пустой текст допустим у существующей записи.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.GetFoundedText();
    UO.Print("Text: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.GetFoundedText();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.GetFoundedText();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.GetFoundedTextColor

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetFoundedTextColor();

Возвращает цвет выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

string — UO hue в формате 0x0044 (4 hex-цифры). Без выбора — 0x0000; hue=0 также допустим у сообщения. Это не RGB.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.
  • Первичный справочник: https://forum.yoko.com.ua/viewtopic.php?p=27633 .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedTextColor();
UO.Print("GetFoundedTextColor: " + Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • string — UO hue в формате 0x0044 (4 hex-цифры). Без выбора — 0x0000; hue=0 также допустим у сообщения. Это не RGB.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.GetFoundedTextColor();
    UO.Print("Hue: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.GetFoundedTextColor();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.GetFoundedTextColor();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.GetFoundedTextID

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.GetFoundedTextID();

Возвращает номер совпавшей альтернативы поискового шаблона.

Параметры

Параметров нет.

Возвращает

int — индекс от 0 в списке непустых альтернатив через |: success|failed даёт 0 для success и 1 для failed. При нескольких подходящих альтернативах берётся первая в шаблоне. Без совпадения или после прямого Journal также 0. Это не serial автора, не номер строки и не type сообщения.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Сначала проверяйте результат поиска > 0. Значение 0 само по себе не подтверждает успех. Пробелы по краям и пустые альтернативы удаляются до нумерации.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; . В этой адаптации ID означает альтернативу, поля автора и типа доступны отдельно через LineID/LineMsgType.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedTextID();
UO.Print("GetFoundedTextID: " + Convert.ToString(result));

1. Два исхода — прямой скрипт

Параметры и ход выполнения:

  • success — альтернатива 0, failed — альтернатива 1. Успех поиска проверяется отдельно.
  • Это анализ текста, а не подтверждение игровой операции сервером.
if (Truth(UO.InJournal("success|failed") > 0))
{
    var outcome = UO.GetFoundedTextID();
    if (Truth(outcome == 0))
    {
        UO.Print("Success text");
    }
    else
    {
        UO.Print("Failure text");
    }
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Три исхода без регистра — функция сценария

Параметры и ход выполнения:

  • -1 отключает регистр. Результаты 0, 1, 2 соответствуют порядку альтернатив.
  • Если строка содержит несколько вариантов, возвращается первый подходящий по порядку шаблона.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.InJournal("mining|ore|empty", -1) > 0))
    {
        var kind = UO.GetFoundedTextID();
        UO.Print("Alternative: " + Convert.ToString(kind));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить исход перед чтением другой строки — класс сценария

Параметры и ход выполнения:

  • Journal(0) меняет выбор и сбрасывает ID альтернативы, поэтому outcome сохраняется заранее.
  • Новый вызов getter после Journal уже не описывает предыдущий шаблон.
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.InJournal("success|failed") > 0))
        {
            var outcome = UO.GetFoundedTextID();
            var latest = UO.Journal(0);
            UO.Print("Saved outcome: " + Convert.ToString(outcome));
        }

        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.GetFoundedTextIndex

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.GetFoundedTextIndex();

Возвращает текущий индекс выбранной записи, если она ещё хранится в журнале.

Параметры

Параметров нет.

Возвращает

int — текущий индекс от 0 (самая новая строка). -1 означает, что выбора нет либо выбранная запись уже удалена/вытеснена. Это не результат InJournal: из индекса не нужно вычитать 1.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Индекс пересчитывается по идентичности записи. Новые сообщения увеличивают его. Старый сохранённый индекс не является постоянным ID; для текста безопаснее GetFoundedText.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedTextIndex();
UO.Print("GetFoundedTextIndex: " + Convert.ToString(result));

1. Индекс найденной записи — прямой скрипт

Параметры и ход выполнения:

  • Getter без аргументов читает выбор текущего скрипта. 0 — новая строка, -1 — нет строки в текущем буфере.
  • Текст берётся из сохранённой записи, чтобы новые сообщения не подменили его.
if (Truth(UO.InJournal("notice") > 0))
{
    var index = UO.GetFoundedTextIndex();
    var text = UO.GetFoundedText();
    UO.Print(Convert.ToString(index) + ": " + text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить прямое чтение — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает последнюю запись; проверка исключает пустой журнал.
  • Пустой text допускается у действующей записи.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    if (Truth(UO.GetFoundedTextIndex() >= 0))
    {
        UO.Print(text);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Обновить индекс после ожидания — класс сценария

Параметры и ход выполнения:

  • Ожидание 100 мс позволяет прийти новым сообщениям. after заново находит ту же запись.
  • after может увеличиться или стать -1 при удалении; GetFoundedText всё ещё содержит сохранённый текст.
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.InJournal("needle") > 0))
        {
            var before = UO.GetFoundedTextIndex();
            UO.Wait(100);
            var after = UO.GetFoundedTextIndex();
            UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.GetFoundedTextSerial

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetFoundedTextSerial();

Возвращает serial автора выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

string — serial автора в формате 0x00001234 (8 hex-цифр). Без выбора — 0x00000000. Это не type предмета и не индекс журнала.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.
  • Первичный справочник: https://forum.yoko.com.ua/viewtopic.php?p=27633 .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedTextSerial();
UO.Print("GetFoundedTextSerial: " + Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • string — serial автора в формате 0x00001234 (8 hex-цифр). Без выбора — 0x00000000. Это не type предмета и не индекс журнала.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.GetFoundedTextSerial();
    UO.Print("Speaker serial: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.GetFoundedTextSerial();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.GetFoundedTextSerial();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.GetFoundedTextTimer

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.GetFoundedTextTimer();

Возвращает миллисекундную метку времени выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — момент записи в миллисекундах от начала runtime, совместимый с Now(). Записи до начала дают 0. Без выбора также 0; неверная календарная метка даёт -1. Это не прошедшее время и не десятые доли секунды UO.Timer().

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.
  • Первичный справочник: https://forum.yoko.com.ua/viewtopic.php?p=27633 .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetFoundedTextTimer();
UO.Print("GetFoundedTextTimer: " + Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — момент записи в миллисекундах от начала runtime, совместимый с Now(). Записи до начала дают 0. Без выбора также 0; неверная календарная метка даёт -1. Это не прошедшее время и не десятые доли секунды UO.Timer().
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.GetFoundedTextTimer();
    UO.Print("Timestamp ms: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.GetFoundedTextTimer();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.GetFoundedTextTimer();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.GetJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetJournal(object? arg0);

Читает текст строки по текущему индексу и выбирает эту запись для GetFoundedText/Line*.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.
  • StringIndex — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — текст строки, либо пустая строка при неверном индексе/пустом журнале. У существующей строки текст тоже может быть пустым: после чтения LineIndex >= 0 подтверждает, что запись была выбрана. Это не количество строк.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Прямое чтение сбрасывает ID альтернативы; GetFoundedTextID/FoundedParamId после него дают 0. Сам Journal не пересчитывает LineCount.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetJournal(0);
UO.Print("GetJournal: " + Convert.ToString(result));

1. Последняя строка и её автор — прямой скрипт

Параметры и ход выполнения:

  • 0 — самая новая строка. Сначала читаются текст и автор, затем выводится результат.
  • Print может добавить сообщение; сохранённые text/author относятся к прежней выбранной записи.
var text = UO.GetJournal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);

2. Предыдущая строка, если она существует — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая запись, HighJournal — максимальный доступный индекс.
  • Журнал может изменяться между вызовами. Для данных уже найденной строки используйте GetFoundedText.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var text = UO.GetJournal(1);
        UO.Print(text);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Отличить пустой текст от отсутствия строки — класс сценария

Параметры и ход выполнения:

  • LineIndex=-1 означает отсутствие/удаление выбранной записи. Len(text)=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 text = UO.GetJournal(0);
        var index = UO.LineIndex();
        if (Truth(index < 0))
        {
            UO.Print("No record");
        }
        else
        {
            UO.Print("Text length: " + Convert.ToString(Len(text)));
        }

        return null;
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

UO.GetJournalColor

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetJournalColor(object? arg0);

Читает поле hue строки по текущему индексу, не меняя выбранную запись.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — UO hue как 0x0044; при неверном индексе 0x0000. Это не RGB.

Поведение

  • Каждый вызов читает текущую позицию. Для согласованного текста и полей одной записи сначала Journal(index), затем GetFoundedText/Line*. Нулевые значения могут быть настоящими данными.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetJournalColor(0);
UO.Print("GetJournalColor: " + Convert.ToString(result));

1. Поле новой записи — прямой скрипт

Параметры и ход выполнения:

  • 0 — индекс новой строки. Проверяется наличие буфера.
  • string — UO hue как 0x0044; при неверном индексе 0x0000. Это не RGB.
if (Truth(UO.HighJournal() >= 0))
{
    var value = UO.GetJournalColor(0);
    UO.Print(Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Поле предыдущей записи — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая строка, не serial=1.
  • Выбранная поиском запись GetFoundedText/Line* не изменяется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var value = UO.GetJournalColor(1);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить значение перед следующим действием — класс сценария

Параметры и ход выполнения:

  • 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 value = UO.GetJournalColor(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

UO.GetJournalSerial

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.GetJournalSerial(object? arg0);

Читает поле serial строки по текущему индексу, не меняя выбранную запись.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — serial автора как 0x00001234; при неверном индексе 0x00000000.

Поведение

  • Каждый вызов читает текущую позицию. Для согласованного текста и полей одной записи сначала Journal(index), затем GetFoundedText/Line*. Нулевые значения могут быть настоящими данными.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetJournalSerial(0);
UO.Print("GetJournalSerial: " + Convert.ToString(result));

1. Поле новой записи — прямой скрипт

Параметры и ход выполнения:

  • 0 — индекс новой строки. Проверяется наличие буфера.
  • string — serial автора как 0x00001234; при неверном индексе 0x00000000.
if (Truth(UO.HighJournal() >= 0))
{
    var value = UO.GetJournalSerial(0);
    UO.Print(Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Поле предыдущей записи — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая строка, не serial=1.
  • Выбранная поиском запись GetFoundedText/Line* не изменяется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var value = UO.GetJournalSerial(1);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить значение перед следующим действием — класс сценария

Параметры и ход выполнения:

  • 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 value = UO.GetJournalSerial(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

UO.HighJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.HighJournal();

Возвращает максимальный доступный индекс журнала.

Параметры

Параметров нет.

Возвращает

int: -1 при пустом журнале; иначе число сохранённых записей минус 1 — индекс самой старой доступной записи. Journal/GetJournal используют нулевые индексы от новой записи к старой; положительный результат InJournal использует другой, единичный отсчёт.

Поведение

  • Новые сообщения и очистка изменяют границы. Здесь действует порядок Journal(0) от новой записи к старой.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.HighJournal();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Проверить наличие записей — прямой скрипт

Параметры и ход выполнения:

  • Отрицательная граница означает пустой буфер.
  • При непустом буфере Journal(0) читает новую запись.
if (Truth(UO.HighJournal() >= 0))
{
    var text = UO.Journal(0);
    UO.Print(text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Количество доступных строк — функция сценария

Параметры и ход выполнения:

  • HighJournal=-1 при пустом журнале, поэтому total=0. LowJournal описывает нижнюю границу, а не число строк.
  • Это общее количество локально сохранённых строк; LineCount относится к последнему поиску.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var total = UO.HighJournal() + 1;
    UO.Print("Rows: " + Convert.ToString(total));
    return null;
}

3. Прочитать строку на границе — класс сценария

Параметры и ход выполнения:

  • index передаётся непосредственно в Journal, без вычитания единицы.
  • Индекс может сдвинуться при входящих сообщениях; буфер не замораживается между вызовами.
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 index = UO.HighJournal();
        if (Truth(index >= 0))
        {
            var text = UO.Journal(index);
            UO.Print(text);
        }

        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.InJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.InJournal(object? arg0);
int UO.InJournal(object? arg0, object? arg1);
int UO.InJournal(object? arg0, object? arg1, object? arg2);
int UO.InJournal(object? arg0, object? arg1, object? arg2, object? arg3);
int UO.InJournal(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);
int UO.InJournal(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5);
int UO.InJournal(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6);

Ищет сообщение в локальном журнале и сохраняет найденную запись с её полями.

Параметры

  • pattern — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон.
  • Convert.ToString — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон.
  • maxLinesOrIgnoreCase — Только форма из двух аргументов: -1 — весь доступный журнал без учёта регистра; 0 — не проверять ни одной строки; положительное число — проверить не более этого числа последних строк с учётом регистра. Другие отрицательные значения ограничиваются 0.
  • serial — Третий и последующие аргументы включают расширенную форму. Второй аргумент этой формы — числовой serial автора сообщения, не graphic/type. -1 отключает фильтр; 0 выбирает serial=0. Hex-строка с числом также преобразуется в число; имя алиаса объекта здесь не разрешается.
  • color — Третий аргумент расширенной формы — числовой UO hue; -1 или 0xFFFF отключают фильтр. 0 выбирает hue=0. Это не RGB.
  • startTime — Необязательная начальная метка Now(), int в миллисекундах. При заданном положительном endTime значение startTime=0 означает начало выполнения. Если обе метки отсутствуют/неположительные, фильтра времени нет.
  • endTime — Необязательная конечная метка Now(), int в миллисекундах. Отсутствует или 0 — текущее время. Порядок положительных границ несущественен. Будущая метка ограничивается текущим временем.
  • newestOnly — Необязательный bool, по умолчанию false. true прекращает поиск после первого совпадения; LineCount тогда 0 или 1. false подсчитывает все подходящие строки, выбирая всё равно самую новую.
  • caseSensitive — Необязательный bool расширенной формы, по умолчанию false. true учитывает регистр. Форма только с pattern, напротив, всегда учитывает регистр.

Возвращает

int: 0 — подходящей строки нет; положительное число — позиция самой новой подходящей записи, считая от конца всего журнала, начиная с 1. Это не число совпадений и не номер альтернативы шаблона. Для нулевого индекса используйте LineIndex/GetFoundedTextIndex, для количества совпадений — LineCount, для номера альтернативы — GetFoundedTextID. Последующие новые сообщения могут изменить индекс, но сохранённые поля выбранной записи остаются доступны.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Поиск не ожидает нового текста. Пустой шаблон в текущем InJournal подходит любой строке, но не задаёт ID альтернативы; для проверки наличия строк используйте HighJournal/LowJournal.
  • Форма из двух аргументов задаёт лимит/регистр, а не serial. Для serial обязательно передать также color. Одноаргументный SetJournalLine может ограничить область поиска.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; .

Now() предоставляет host текущего выполнения: это целое число миллисекунд тех же native-часов, которые использует журнал. Не заменяйте его Environment.TickCount, Unix-временем или собственным Stopwatch: начало отсчёта будет другим. В обычной программе .cs/.csproj вызывайте context.Now() у переданного CSharpScriptGlobals.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.InJournal("You see");
UO.Print("InJournal: " + Convert.ToString(result));

1. Проверить сообщение с учётом регистра — прямой скрипт

Параметры и ход выполнения:

  • pattern=You see — подстрока, регистр важен. found=0 означает отсутствие.
  • Текст копируется из найденной записи; приход нового сообщения не заменяет его.
var found = UO.InJournal("You see");
if (Truth(found > 0))
{
    var text = UO.GetFoundedText();
    UO.Print(text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Несколько исходов без учёта регистра — функция сценария

Параметры и ход выполнения:

  • Второй аргумент -1 снимает лимит строк и отключает учёт регистра.
  • outcome=0 для success, 1 для failed; это номер альтернативы, не ID говорящего.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var found = UO.InJournal("success|failed", -1);
    if (Truth(found > 0))
    {
        var outcome = UO.GetFoundedTextID();
        UO.Print("Alternative: " + Convert.ToString(outcome));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Проверить только двадцать последних строк — класс сценария

Параметры и ход выполнения:

  • 20 — максимум проверяемых строк, регистр важен. matches — количество подходящих строк в проверенной области.
  • found содержит позицию плюс 1, а не matches. Запись диагностического текста тоже может пополнить журнал.
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 found = UO.InJournal("bank", 20);
        var matches = UO.LineCount();
        UO.Print("Matches: " + Convert.ToString(matches));
        return null;
    }
}

4. Все расширенные параметры — прямой скрипт

Параметры и ход выполнения:

  • serial=0x00001234 — пример автора, color=0x0044 — hue. Замените реальными значениями. started/endTime — миллисекундные метки.
  • true останавливает поиск на первой строке; false не учитывает регистр. Ожидание 350 мс отдельно, InJournal сам не ждёт.
var started = Now();
UO.Wait(350);
var found = UO.InJournal("hello", 0x00001234, 0x0044, started, Now(), true, false);
if (Truth(found > 0))
{
    UO.Print(UO.GetFoundedText());
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

5. Фильтр только по времени — функция сценария

Параметры и ход выполнения:

  • serial=-1 и color=-1 отключают оба фильтра. Две метки ограничивают время.
  • newestOnly и caseSensitive опущены: false и false. Без совпадения возвращается 0.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var started = Now();
    UO.Wait(100);
    var found = UO.InJournal("notice", -1, -1, started, Now());
    if (Truth(found == 0))
    {
        UO.Print("No matching message");
    }

    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.InJournalBetweenTimes

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.InJournalBetweenTimes(object? arg0, object? arg1);
int UO.InJournalBetweenTimes(object? arg0, object? arg1, object? arg2);
int UO.InJournalBetweenTimes(object? arg0, object? arg1, object? arg2, object? arg3);

Ищет строку между двумя метками времени выполнения и сохраняет самую новую подходящую запись.

Параметры

  • pattern — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон.
  • text — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон.
  • startTime — Обязательная метка Now(): int миллисекунд от начала runtime. 0 — начало выполнения. Это не возраст записи и не дробная дата LineTime.
  • endTime — Необязательная конечная метка Now(). Если опущена или неположительна, используется текущее время. Положительные границы можно передать в обратном порядке; будущая граница ограничивается текущим временем.
  • limit — Необязательный четвёртый аргумент: -1 — без лимита и без учёта регистра; положительное число — максимум строк в интервале с учётом регистра; 0 и отрицательные значения кроме -1 — не проверять строки.
  • maxLinesOrIgnoreCase — Другое имя четвёртого аргумента limit в совместимой регистрации: -1 отключает лимит и учёт регистра, иначе неотрицательный лимит строк.

Возвращает

int: 0 — подходящей строки нет; положительное число — позиция самой новой подходящей записи, считая от конца всего журнала, начиная с 1. Это не число совпадений и не номер альтернативы шаблона. Для нулевого индекса используйте LineIndex/GetFoundedTextIndex, для количества совпадений — LineCount, для номера альтернативы — GetFoundedTextID. Последующие новые сообщения могут изменить индекс, но сохранённые поля выбранной записи остаются доступны.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • В формах из двух или трёх аргументов регистр учитывается. Границы включаются. Вычисление интервала не приостанавливает скрипт.
  • Здесь передавайте целые метки Now(). LineTime возвращает другую единицу. Первичный справочник: .

Now() предоставляет host текущего выполнения: это целое число миллисекунд тех же native-часов, которые использует журнал. Не заменяйте его Environment.TickCount, Unix-временем или собственным Stopwatch: начало отсчёта будет другим. В обычной программе .cs/.csproj вызывайте context.Now() у переданного CSharpScriptGlobals.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.InJournalBetweenTimes("You see", 0, Now());
UO.Print("InJournalBetweenTimes: " + Convert.ToString(result));

1. Проверить сообщения после действия — прямой скрипт

Параметры и ход выполнения:

  • started сохраняется до UseSkill. endTime опущено — до текущего времени; hidden — пример серверного текста.
  • Регистр учитывается. Сообщение не доказывает текущий статус; UO.Hidden() читает состояние персонажа.
var started = Now();
UO.UseSkill("Hiding");
UO.Wait(500);
if (Truth(UO.InJournalBetweenTimes("hidden", started) > 0))
{
    UO.Print(UO.GetFoundedText());
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Зафиксированный интервал от начала — функция сценария

Параметры и ход выполнения:

  • startTime=0 — начало выполнения; ended — сохранённая конечная метка в миллисекундах.
  • Новые сообщения после ended не включаются. Старые записи до запуска runtime также вне интервала.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var ended = Now();
    var found = UO.InJournalBetweenTimes("notice", 0, ended);
    UO.Print("Search result: " + Convert.ToString(found));
    return null;
}

3. Интервал и альтернативы без учёта регистра — класс сценария

Параметры и ход выполнения:

  • Последний -1 снимает ограничение строк и отключает регистр. Третий аргумент — конечная метка, не задержка.
  • Результат ID: 0 для success, 1 для failed. Проверка found > 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 started = Now();
        UO.Wait(350);
        var found = UO.InJournalBetweenTimes("success|failed", started, Now(), -1);
        if (Truth(found > 0))
        {
            UO.Print(Convert.ToString(UO.GetFoundedTextID()));
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private int Now() => global::ClassicUO.CSharp.CSharpScriptContext.Current.Now();
}

UO.Journal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.Journal(object? arg0);

Читает текст строки по текущему индексу и выбирает эту запись для GetFoundedText/Line*.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.
  • StringIndex — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — текст строки, либо пустая строка при неверном индексе/пустом журнале. У существующей строки текст тоже может быть пустым: после чтения LineIndex >= 0 подтверждает, что запись была выбрана. Это не количество строк.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Прямое чтение сбрасывает ID альтернативы; GetFoundedTextID/FoundedParamId после него дают 0. Сам Journal не пересчитывает LineCount.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.Journal(0);
UO.Print("Journal: " + Convert.ToString(result));

1. Последняя строка и её автор — прямой скрипт

Параметры и ход выполнения:

  • 0 — самая новая строка. Сначала читаются текст и автор, затем выводится результат.
  • Print может добавить сообщение; сохранённые text/author относятся к прежней выбранной записи.
var text = UO.Journal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);

2. Предыдущая строка, если она существует — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая запись, HighJournal — максимальный доступный индекс.
  • Журнал может изменяться между вызовами. Для данных уже найденной строки используйте GetFoundedText.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var text = UO.Journal(1);
        UO.Print(text);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Отличить пустой текст от отсутствия строки — класс сценария

Параметры и ход выполнения:

  • LineIndex=-1 означает отсутствие/удаление выбранной записи. Len(text)=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 text = UO.Journal(0);
        var index = UO.LineIndex();
        if (Truth(index < 0))
        {
            UO.Print("No record");
        }
        else
        {
            UO.Print("Text length: " + Convert.ToString(Len(text)));
        }

        return null;
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

UO.JournalColor

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.JournalColor(object? arg0);

Читает поле hue строки по текущему индексу, не меняя выбранную запись.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — UO hue как 0x0044; при неверном индексе 0x0000. Это не RGB.

Поведение

  • Каждый вызов читает текущую позицию. Для согласованного текста и полей одной записи сначала Journal(index), затем GetFoundedText/Line*. Нулевые значения могут быть настоящими данными.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.JournalColor(0);
UO.Print("JournalColor: " + Convert.ToString(result));

1. Поле новой записи — прямой скрипт

Параметры и ход выполнения:

  • 0 — индекс новой строки. Проверяется наличие буфера.
  • string — UO hue как 0x0044; при неверном индексе 0x0000. Это не RGB.
if (Truth(UO.HighJournal() >= 0))
{
    var value = UO.JournalColor(0);
    UO.Print(Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Поле предыдущей записи — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая строка, не serial=1.
  • Выбранная поиском запись GetFoundedText/Line* не изменяется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var value = UO.JournalColor(1);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить значение перед следующим действием — класс сценария

Параметры и ход выполнения:

  • 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 value = UO.JournalColor(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

UO.JournalSerial

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.JournalSerial(object? arg0);

Читает поле serial строки по текущему индексу, не меняя выбранную запись.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

string — serial автора как 0x00001234; при неверном индексе 0x00000000.

Поведение

  • Каждый вызов читает текущую позицию. Для согласованного текста и полей одной записи сначала Journal(index), затем GetFoundedText/Line*. Нулевые значения могут быть настоящими данными.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.JournalSerial(0);
UO.Print("JournalSerial: " + Convert.ToString(result));

1. Поле новой записи — прямой скрипт

Параметры и ход выполнения:

  • 0 — индекс новой строки. Проверяется наличие буфера.
  • string — serial автора как 0x00001234; при неверном индексе 0x00000000.
if (Truth(UO.HighJournal() >= 0))
{
    var value = UO.JournalSerial(0);
    UO.Print(Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Поле предыдущей записи — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая строка, не serial=1.
  • Выбранная поиском запись GetFoundedText/Line* не изменяется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var value = UO.JournalSerial(1);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить значение перед следующим действием — класс сценария

Параметры и ход выполнения:

  • 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 value = UO.JournalSerial(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

UO.JournalTimer

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.JournalTimer(object? arg0);

Читает поле timestamp строки по текущему индексу, не меняя выбранную запись.

Параметры

  • index — Обязательный int — текущий индекс: 0 означает самую новую строку, 1 — предыдущую. Индексы сдвигаются при приходе сообщений. Это не serial, не ID варианта шаблона и не положительный результат InJournal.

Возвращает

int — метка записи в миллисекундах от начала runtime, совместимая с Now(). 0 для записи до запуска runtime; -1 для неверного индекса/времени. Это не возраст записи и не десятые секунды UO.Timer().

Поведение

  • Каждый вызов читает текущую позицию. Для согласованного текста и полей одной записи сначала Journal(index), затем GetFoundedText/Line*. Нулевые значения могут быть настоящими данными.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.JournalTimer(0);
UO.Print("JournalTimer: " + Convert.ToString(result));

1. Поле новой записи — прямой скрипт

Параметры и ход выполнения:

  • 0 — индекс новой строки. Проверяется наличие буфера.
  • int — метка записи в миллисекундах от начала runtime, совместимая с Now(). 0 для записи до запуска runtime; -1 для неверного индекса/времени. Это не возраст записи и не десятые секунды UO.Timer().
if (Truth(UO.HighJournal() >= 0))
{
    var value = UO.JournalTimer(0);
    UO.Print(Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Поле предыдущей записи — функция сценария

Параметры и ход выполнения:

  • 1 — предыдущая строка, не serial=1.
  • Выбранная поиском запись GetFoundedText/Line* не изменяется.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.HighJournal() >= 1))
    {
        var value = UO.JournalTimer(1);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить значение перед следующим действием — класс сценария

Параметры и ход выполнения:

  • 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 value = UO.JournalTimer(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

UO.LastJournalMessage

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LastJournalMessage();

Читает текст самой новой записи локального журнала.

Параметры

Параметров нет.

Возвращает

string — текст новой записи; пустая строка, если журнала нет или сама запись содержит пустой текст.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Обновляет выбор и поля Line* так же, как Journal(0).

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LastJournalMessage();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитать и сохранить текст — прямой скрипт

Параметры и ход выполнения:

  • Аргументов нет; text копирует текущую последнюю строку.
  • Печать после чтения может сама стать последним сообщением.
var text = UO.LastJournalMessage();
UO.Print(text);

2. Проверить подстроку — функция сценария

Параметры и ход выполнения:

  • FindText возвращает позицию от 1 либо 0. Проверяется только одна последняя строка.
  • Для поиска по всему журналу используйте InJournal.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.LastJournalMessage();
    if (Truth(FindText(text, "bank") > 0))
    {
        UO.Print("Text contains bank");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
    string input = Convert.ToString(text) ?? "";
    return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}

3. Сравнить с результатом поиска — класс сценария

Параметры и ход выполнения:

  • matched сохраняется до чтения latest, поэтому не меняется при новом выборе.
  • Последнее сообщение может отличаться от найденного; found > 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 found = UO.InJournal("needle");
        var matched = UO.GetFoundedText();
        var latest = UO.LastJournalMessage();
        UO.Print("Found: " + matched);
        UO.Print("Latest: " + latest);
        return null;
    }
}

UO.LastMessage

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

string UO.LastMessage();

Читает текст самой новой записи локального журнала.

Параметры

Параметров нет.

Возвращает

string — текст новой записи; пустая строка, если журнала нет или сама запись содержит пустой текст.

Поведение

  • Этот getter читает новую запись, но сохраняет прежний выбор GetFoundedText/Line*. Для выбора последней записи используйте LastJournalMessage или Journal(0).
  • Первичный справочник: https://forum.yoko.com.ua/viewtopic.php?p=27633 .

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.LastMessage();
UO.Print("LastMessage: " + Convert.ToString(result));

1. Прочитать и сохранить текст — прямой скрипт

Параметры и ход выполнения:

  • Аргументов нет; text копирует текущую последнюю строку.
  • Печать после чтения может сама стать последним сообщением.
var text = UO.LastMessage();
UO.Print(text);

2. Проверить подстроку — функция сценария

Параметры и ход выполнения:

  • FindText возвращает позицию от 1 либо 0. Проверяется только одна последняя строка.
  • Для поиска по всему журналу используйте InJournal.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.LastMessage();
    if (Truth(FindText(text, "bank") > 0))
    {
        UO.Print("Text contains bank");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
    string input = Convert.ToString(text) ?? "";
    return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}

3. Сравнить с результатом поиска — класс сценария

Параметры и ход выполнения:

  • matched сохраняется до чтения latest, поэтому не меняется при новом выборе.
  • Последнее сообщение может отличаться от найденного; found > 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 found = UO.InJournal("needle");
        var matched = UO.GetFoundedText();
        var latest = UO.LastMessage();
        UO.Print("Found: " + matched);
        UO.Print("Latest: " + latest);
        return null;
    }
}

UO.LineCount

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineCount();

Читает количество подходящих строк последнего поиска.

Параметры

Параметров нет.

Возвращает

int — число совпавших записей в последней проверенной области. 0 при отсутствии совпадений; при newestOnly=true не больше 1. Это не число строк всего журнала, не число вхождений подстроки в одном сообщении и не позиция найденного текста.

Поведение

  • Поиск учитывает лимит, время, serial, hue и одноаргументный SetJournalLine. Прямое Journal/GetJournal не пересчитывает счётчик. Очистка сбрасывает его. Счётчик принадлежит мосту текущего скрипта.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineCount();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Все совпадения — прямой скрипт

Параметры и ход выполнения:

  • Поиск без лимита и регистра. Считаются строки, а не количество ore внутри строки.
  • result — позиция плюс 1; matches — отдельное количество.
var result = UO.InJournal("ore", -1);
var matches = UO.LineCount();
UO.Print(Convert.ToString(matches));

2. Совпадения среди последних десяти строк — функция сценария

Параметры и ход выполнения:

  • 10 — максимум проверяемых строк; регистр учитывается.
  • Количество может быть от 0 до 10, даже если более старых совпадений намного больше.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var result = UO.InJournal("ore", 10);
    UO.Print(Convert.ToString(UO.LineCount()));
    return null;
}

3. Поиск с ранним завершением — класс сценария

Параметры и ход выполнения:

  • serial/color=-1, время=0/0 — фильтры отключены. true останавливает поиск на первой подходящей строке.
  • checkedMatches равен 0 или 1 и не показывает общее число совпадений во всём журнале.
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 result = UO.InJournal("ore", -1, -1, 0, 0, true, false);
        var checkedMatches = UO.LineCount();
        UO.Print(Convert.ToString(checkedMatches));
        return null;
    }
}

UO.LineID

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineID();

Возвращает числовой serial автора выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — 32-битный serial автора. Без выбора — 0. Старший бит может дать отрицательное число из-за signed int; GetFoundedTextSerial сохраняет полное hex-представление. Это не graphic/type.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — 32-битный serial автора. Без выбора — 0. Старший бит может дать отрицательное число из-за signed int; GetFoundedTextSerial сохраняет полное hex-представление. Это не graphic/type.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineID();
    UO.Print("Speaker serial: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineID();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineID();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineIndex

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineIndex();

Возвращает текущий индекс выбранной записи, если она ещё хранится в журнале.

Параметры

Параметров нет.

Возвращает

int — текущий индекс от 0 (самая новая строка). -1 означает, что выбора нет либо выбранная запись уже удалена/вытеснена. Это не результат InJournal: из индекса не нужно вычитать 1.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Индекс пересчитывается по идентичности записи. Новые сообщения увеличивают его. Старый сохранённый индекс не является постоянным ID; для текста безопаснее GetFoundedText.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineIndex();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Индекс найденной записи — прямой скрипт

Параметры и ход выполнения:

  • Getter без аргументов читает выбор текущего скрипта. 0 — новая строка, -1 — нет строки в текущем буфере.
  • Текст берётся из сохранённой записи, чтобы новые сообщения не подменили его.
if (Truth(UO.InJournal("notice") > 0))
{
    var index = UO.LineIndex();
    var text = UO.GetFoundedText();
    UO.Print(Convert.ToString(index) + ": " + text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить прямое чтение — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает последнюю запись; проверка исключает пустой журнал.
  • Пустой text допускается у действующей записи.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    if (Truth(UO.LineIndex() >= 0))
    {
        UO.Print(text);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Обновить индекс после ожидания — класс сценария

Параметры и ход выполнения:

  • Ожидание 100 мс позволяет прийти новым сообщениям. after заново находит ту же запись.
  • after может увеличиться или стать -1 при удалении; GetFoundedText всё ещё содержит сохранённый текст.
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.InJournal("needle") > 0))
        {
            var before = UO.LineIndex();
            UO.Wait(100);
            var after = UO.LineIndex();
            UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.LineMsgType

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineMsgType();

Возвращает тип сетевого сообщения выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — код MessageType: 0 Regular, 1 System, 2 Emote, 3 Limit3Spell, 6 Label, 7 Focus, 8 Whisper, 9 Yell, 10 Spell, 13 Guild, 14 Alliance, 15 Command, 16 GmChat, 192 Encoded, 255 Party. Без выбора 0. Это коды Classic UO; не заменяйте их отличающимися числами из сторонних примеров.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineMsgType();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — код MessageType: 0 Regular, 1 System, 2 Emote, 3 Limit3Spell, 6 Label, 7 Focus, 8 Whisper, 9 Yell, 10 Spell, 13 Guild, 14 Alliance, 15 Command, 16 GmChat, 192 Encoded, 255 Party. Без выбора 0. Это коды Classic UO; не заменяйте их отличающимися числами из сторонних примеров.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineMsgType();
    UO.Print("Message type: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineMsgType();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineMsgType();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineName

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineName();

Возвращает имя автора выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

string — имя автора выбранной записи, например System или имя персонажа; пустая строка без выбора/без имени. Имя не гарантирует уникальность персонажа.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • string — имя автора выбранной записи, например System или имя персонажа; пустая строка без выбора/без имени. Имя не гарантирует уникальность персонажа.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineName();
    UO.Print("Speaker: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineName();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineName();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineTextColor

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineTextColor();

Возвращает числовой цвет выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — UO hue выбранной записи (0…65535); без выбора 0. Ноль допустим как цвет. Это не RGB и не ID автора.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineTextColor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — UO hue выбранной записи (0…65535); без выбора 0. Ноль допустим как цвет. Это не RGB и не ID автора.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineTextColor();
    UO.Print("Hue: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineTextColor();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineTextColor();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineTextFont

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineTextFont();

Возвращает шрифт выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — UO font ID выбранной записи (0…255 в клиенте); без выбора 0. Это ID игрового шрифта, не размер шрифта IDE.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineTextFont();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — UO font ID выбранной записи (0…255 в клиенте); без выбора 0. Это ID игрового шрифта, не размер шрифта IDE.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineTextFont();
    UO.Print("Font ID: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineTextFont();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineTextFont();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineTime

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineTime();

Возвращает календарную метку времени выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

double — OLE Automation Date, число дней от 30.12.1899, дробная часть задаёт время суток. Без выбора 0. Это не миллисекунды Now() и не целый Unix timestamp. Разность двух таких меток умножается на 86400000 для миллисекунд.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • double — OLE Automation Date, число дней от 30.12.1899, дробная часть задаёт время суток. Без выбора 0. Это не миллисекунды Now() и не целый Unix timestamp. Разность двух таких меток умножается на 86400000 для миллисекунд.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineTime();
    UO.Print("OLE date: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineTime();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineTime();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LineType

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LineType();

Возвращает категорию текста выбранной записи журнала.

Параметры

Параметров нет.

Возвращает

int — категория TextType клиента: 0 CLIENT, 1 SYSTEM, 2 OBJECT, 3 GUILD_ALLY. Без выбора 0. Это категория отображения, не serial, не graphic и не MessageType.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Getter не запускает поиск и не выбирает самую новую строку. Нулевые/пустые значения могут быть действующими данными; учитывайте результат поиска.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LineType();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Читать поле после поиска — прямой скрипт

Параметры и ход выполнения:

  • notice — пример искомого текста. Getter вызывается без параметров только после успешного поиска.
  • int — категория TextType клиента: 0 CLIENT, 1 SYSTEM, 2 OBJECT, 3 GUILD_ALLY. Без выбора 0. Это категория отображения, не serial, не graphic и не MessageType.
if (Truth(UO.InJournal("notice") > 0))
{
    var value = UO.LineType();
    UO.Print("Text category: " + Convert.ToString(value));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать поле конкретной строки — функция сценария

Параметры и ход выполнения:

  • Journal(0) выбирает новую запись. index и value читаются до Print.
  • Проверка index позволяет отличить отсутствие записи от допустимого нулевого или пустого поля.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var text = UO.Journal(0);
    var index = UO.LineIndex();
    var value = UO.LineType();
    if (Truth(index >= 0))
    {
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить поле перед следующим поиском — класс сценария

Параметры и ход выполнения:

  • Первый поиск выбирает success, второй заменяет или сбрасывает выбор. saved уже содержит копию нужного поля.
  • Сохранённая var не меняется при новом поиске, очистке или поступлении сообщений.
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.InJournal("success") > 0))
        {
            var saved = UO.LineType();
            var nextMatch = UO.InJournal("failed");
            UO.Print("Saved: " + Convert.ToString(saved));
        }

        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.LowJournal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.LowJournal();

Возвращает минимальный доступный индекс журнала.

Параметры

Параметров нет.

Возвращает

int: -1 при пустом журнале; иначе 0 — индекс самой новой доступной записи. Journal/GetJournal используют нулевые индексы от новой записи к старой; положительный результат InJournal использует другой, единичный отсчёт.

Поведение

  • Новые сообщения и очистка изменяют границы. Здесь действует порядок Journal(0) от новой записи к старой.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.LowJournal();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Проверить наличие записей — прямой скрипт

Параметры и ход выполнения:

  • Отрицательная граница означает пустой буфер.
  • При непустом буфере Journal(0) читает новую запись.
if (Truth(UO.LowJournal() >= 0))
{
    var text = UO.Journal(0);
    UO.Print(text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитать строку на границе — функция сценария

Параметры и ход выполнения:

  • index передаётся непосредственно в Journal, без вычитания единицы.
  • Индекс может сдвинуться при входящих сообщениях; буфер не замораживается между вызовами.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var index = UO.LowJournal();
    if (Truth(index >= 0))
    {
        var text = UO.Journal(index);
        UO.Print(text);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитать диапазон текущего журнала — класс сценария

Параметры и ход выполнения:

  • LowJournal и HighJournal образуют границы индексов. Это не число строк; содержимое журнала может меняться между вызовами.
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()
    {
        int first = UO.LowJournal();
        int last = UO.HighJournal();
        if (first > last)
            return null;
        for (int index = first; index <= last; index++)
            UO.Print($"{index}: {UO.Journal(index)}");
        return null;
    }
}

UO.SetJournalLine

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.SetJournalLine(object? arg0);
void UO.SetJournalLine(object? arg0, object? arg1);

Изменяет текст строки; отдельная одноаргументная форма задаёт нижнюю границу поиска.

Параметры

  • index — Для формы (index,text): текущий индекс от 0, где 0 — новая строка. Для формы (index): количество пропускаемых старых строк от начала внутреннего буфера, не индекс Journal; 0 снимает ограничение. Отрицательная одноаргументная граница ограничивается 0.
  • StringIndex — Имя index в совместимой двухаргументной регистрации: текущий индекс Journal от 0.
  • text — Новый текст существующей строки, включая пустую строку. Обязателен в форме замены текста.
  • Text — То же значение text в совместимой регистрации.

Возвращает

void — нет возвращаемого значения. При неверном индексе двухаргументная форма ничего не меняет. Одноаргументная форма не изменяет текст.

Поведение

  • Замена локальная, серверу ничего не отправляется. Поля автора/времени сохраняются. Уже выбранный снимок текста остаётся прежним до повторного Journal или поиска.
  • Одноаргументная граница — устаревшее расширение: число старых строк в текущем буфере; при вытеснении/удалении записей его смысл сдвигается. Для надёжной границы между действиями используйте InJournalBetweenTimes с Now().

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.SetJournalLine");
UO.SetJournalLine(0);

1. Пометить последнюю строку — прямой скрипт

Параметры и ход выполнения:

  • 0 — новая строка; второй аргумент — её новый полный текст.
  • Это меняет локальный буфер. Между чтением и записью могут приходить новые сообщения; индекс не является постоянным ID.
if (Truth(UO.HighJournal() >= 0))
{
    var text = UO.Journal(0);
    UO.SetJournalLine(0, "[read] " + text);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Заменить текст пустой строкой — функция сценария

Параметры и ход выполнения:

  • Пустая строка заменяет текст, но не удаляет запись и её автора.
  • Неверный индекс пропускается. exists может быть true даже при text="".
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.SetJournalLine(0, "");
    var text = UO.Journal(0);
    var exists = UO.LineIndex() >= 0;
    UO.Print(Convert.ToString(exists));
    return null;
}

3. Снять ограничение поиска — класс сценария

Параметры и ход выполнения:

  • Один аргумент 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.SetJournalLine(0);
        var found = UO.InJournal("notice", -1);
        UO.Print(Convert.ToString(found));
        return null;
    }
}

UO.WaitJournalLine

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.WaitJournalLine(object? arg0, object? arg1, object? arg2);

Ожидает подходящее сообщение в локальном журнале.

Параметры

  • StartTime — Обязательная начальная метка: int Now() в миллисекундах, 0 — начало выполнения. Также принимается double OLE date из LineTime (современные даты 20000…100000 дней). Целые 20000…100000 всегда миллисекунды, не дата. Не передавайте возраст записи.
  • Convert.ToString — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон. Поиск без учёта регистра.
  • MaxWaitTimeMS — Обязательный int тайм-аут в миллисекундах; положительное значение ограничивает ожидание, 0 означает ждать без ограничения. Отрицательные значения ограничиваются 0. Остановка скрипта прерывает ожидание.

Возвращает

bool — true при найденном тексте, false при положительном тайм-ауте без совпадения. Это не индекс и не количество. В скрипте логические значения также могут отображаться как 1/0.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Начальная граница фиксируется при вызове, опрос идёт примерно каждые 25 мс. Само ожидание не вызывает навык или предмет. LineCount после ожидания относится к последнему поиску.
  • Для фильтра только системных строк используйте WaitJournalLineSystem.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.WaitJournalLine(Now(), "success|failed", 3000);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Ожидание после сохранённой метки — прямой скрипт

Параметры и ход выполнения:

  • started — граница до ожидания. 3000 — максимум ожидания в миллисекундах. Шаблон содержит два исхода.
  • false — текст не найден за этот срок; сервер мог использовать другую формулировку.
var started = Now();
var found = UO.WaitJournalLine(started, "success|failed", 3000);
if (Truth(found))
{
    UO.Print(UO.GetFoundedText());
}
else
{
    UO.Print("Timeout");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Короткая проверка с начала выполнения — функция сценария

Параметры и ход выполнения:

  • 0 — начало runtime, а не отключение тайм-аута. 100 — тайм-аут.
  • Найденная строка может уже находиться в журнале до вызова.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.WaitJournalLine(0, "notice", 100)))
    {
        var author = UO.LineName();
        UO.Print(author);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Календарная граница выбранной строки — класс сценария

Параметры и ход выполнения:

  • stamp сохраняет double LineTime без Convert.ToInt32/Convert.ToString: это календарная дата, не Now(). 1500 — миллисекунды ожидания.
  • Граница включается. Выбранная строка сама может подойти, если содержит response.
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 text = UO.Journal(0);
        if (Truth(UO.LineIndex() >= 0))
        {
            var stamp = UO.LineTime();
            var found = UO.WaitJournalLine(stamp, "response", 1500);
            UO.Print(Convert.ToString(found));
        }

        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.WaitJournalLineSystem

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

dynamic UO.WaitJournalLineSystem(object? arg0, object? arg1, object? arg2);

Ожидает подходящее сообщение с именем автора System.

Параметры

  • StartTime — Обязательная начальная метка: int Now() в миллисекундах, 0 — начало выполнения. Также принимается double OLE date из LineTime (современные даты 20000…100000 дней). Целые 20000…100000 всегда миллисекунды, не дата. Не передавайте возраст записи.
  • Convert.ToString — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон. Поиск без учёта регистра.
  • MaxWaitTimeMS — Обязательный int тайм-аут в миллисекундах; положительное значение ограничивает ожидание, 0 означает ждать без ограничения. Отрицательные значения ограничиваются 0. Остановка скрипта прерывает ожидание.

Возвращает

bool — true при найденном тексте, false при положительном тайм-ауте без совпадения. Это не индекс и не количество. В скрипте логические значения также могут отображаться как 1/0.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Начальная граница фиксируется при вызове, опрос идёт примерно каждые 25 мс. Само ожидание не вызывает навык или предмет. LineCount после ожидания относится к последнему поиску.
  • В этой адаптации System определяется именем автора без учёта регистра; команда работает с общим журналом ClassicUO.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.WaitJournalLineSystem(Now(), "success|failed", 3000);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Ожидание после сохранённой метки — прямой скрипт

Параметры и ход выполнения:

  • started — граница до ожидания. 3000 — максимум ожидания в миллисекундах. Шаблон содержит два исхода.
  • false — текст не найден за этот срок; сервер мог использовать другую формулировку.
var started = Now();
var found = UO.WaitJournalLineSystem(started, "success|failed", 3000);
if (Truth(found))
{
    UO.Print(UO.GetFoundedText());
}
else
{
    UO.Print("Timeout");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Короткая проверка с начала выполнения — функция сценария

Параметры и ход выполнения:

  • 0 — начало runtime, а не отключение тайм-аута. 100 — тайм-аут.
  • Найденная строка может уже находиться в журнале до вызова.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.WaitJournalLineSystem(0, "notice", 100)))
    {
        var author = UO.LineName();
        UO.Print(author);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Календарная граница выбранной строки — класс сценария

Параметры и ход выполнения:

  • stamp сохраняет double LineTime без Convert.ToInt32/Convert.ToString: это календарная дата, не Now(). 1500 — миллисекунды ожидания.
  • Граница включается. Выбранная строка сама может подойти, если содержит response.
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 text = UO.Journal(0);
        if (Truth(UO.LineIndex() >= 0))
        {
            var stamp = UO.LineTime();
            var found = UO.WaitJournalLineSystem(stamp, "response", 1500);
            UO.Print(Convert.ToString(found));
        }

        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.WaitingForJournalText

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

void UO.WaitingForJournalText(object? arg0, object? arg1, object? arg2);
void UO.WaitingForJournalText(object? arg0, object? arg1, object? arg2, object? arg3);
void UO.WaitingForJournalText(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);
void UO.WaitingForJournalText(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5);

Ожидает текст с дополнительными режимами сравнения и необязательным запуском навыка/предмета.

Параметры

  • startTime — Обязательная метка Now(), int миллисекунд от начала runtime. Проверяются строки с меткой не меньше startTime; 0 включает записи с нулевой меткой.
  • maxDelay — Обязательный максимум ожидания в миллисекундах. 0 и отрицательные значения означают один немедленный проход, а не бесконечное ожидание.
  • text — Искомая подстрока или несколько альтернатив через |, например success|failed. Пробелы по краям каждой альтернативы удаляются, пустые альтернативы пропускаются. Это обычный текст, не регулярное выражение. Используйте непустой шаблон.
  • equals — Необязательный int: 0 (по умолчанию) — подстрока; ненулевое значение — весь текст должен совпасть с одной альтернативой.
  • ignoreCase — Необязательный int: 0 (по умолчанию) — учитывать регистр; ненулевое — не учитывать.
  • skillNameOrObjectId — Необязательный навык по имени, serial/hex-строка или разрешаемый алиас объекта. Сначала распознаётся название навыка, иначе используется объект. 0/пустая строка отключают действие. Навык/предмет запускается один раз перед поиском.

Возвращает

void — возвращаемого значения нет, не присваивайте вызов переменной. После завершения GetFoundedTextIndex >= 0 означает, что выбранная запись ещё доступна; -1 — не найдено/запись удалена. GetFoundedTextID показывает совпавшую альтернативу только при успешном выборе.

Поведение

  • Поиск и Journal/GetJournal/LastJournalMessage сохраняют текст и поля одной записи в текущем скрипте. Новые сообщения не подменяют эти поля. Если запись вытеснена из ограниченного журнала, сохранённые поля остаются, но LineIndex/GetFoundedTextIndex возвращают -1. Следующий поиск или чтение выбирает другую запись; неудачный поиск, неверный индекс и очистка через этот скрипт сбрасывают выбор.
  • Опрос с паузой до 25 мс; остановка скрипта прерывает его. Пустой список альтернатив не находит текст. Для bool результата используйте WaitJournalLine с его собственными параметрами и смыслом нулевого тайм-аута.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.WaitingForJournalText");
UO.WaitingForJournalText(Now(), 2000, "notice");

1. Ожидать одну подстроку — прямой скрипт

Параметры и ход выполнения:

  • startTime — метка до ожидания; maxDelay=2000 мс; сравнение подстроки с учётом регистра.
  • Команда не возвращает true/false: проверяется выбранная запись.
var started = Now();
UO.WaitingForJournalText(started, 2000, "notice");
if (Truth(UO.GetFoundedTextIndex() >= 0))
{
    UO.Print(UO.GetFoundedText());
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Точное совпадение без регистра — функция сценария

Параметры и ход выполнения:

  • startTime=0; maxDelay=0 — один проход. equals=1 — весь текст, ignoreCase=1 — без регистра.
  • Выводится номер альтернативы 0 или 1; длинная строка с дополнительными словами не подойдёт.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.WaitingForJournalText(0, 0, "success|failed", 1, 1);
    if (Truth(UO.GetFoundedTextIndex() >= 0))
    {
        UO.Print(Convert.ToString(UO.GetFoundedTextID()));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Запустить навык и ожидать результат — класс сценария

Параметры и ход выполнения:

  • Шестой аргумент Hiding запускает навык один раз. equals=0 — подстрока, ignoreCase=1 — без регистра.
  • Слова hidden/failed — примеры, замените текстом своего сервера. Вместо навыка можно указать serial или lastobject для использования предмета.
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 started = Now();
        UO.WaitingForJournalText(started, 3000, "hidden|failed", 0, 1, "Hiding");
        if (Truth(UO.GetFoundedTextIndex() >= 0))
        {
            UO.Print(UO.GetFoundedText());
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private int Now() => global::ClassicUO.CSharp.CSharpScriptContext.Current.Now();
}

Clone this wiki locally