Skip to content

UO Topic journal Part 2

Codex edited this page Oct 12, 2026 · 1 revision

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

Журнал повідомлень — 2

Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови

Частини довідника

1 · 2

Повний опис команд


UO.WaitJournalLine

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

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

dynamic UO.WaitJournalLine(object? startTime, object? str, object? maxWaitTimeMS);

Очікує відповідне повідомлення у локальному журналі.

Параметри

  • startTime — Обов'язкова початкова мітка: int Now() у мілісекундах, 0 — початок виконання. Також приймається double OLE date з LineTime (сучасні дати 20000…100000 днів). Цілі 20000…100000 завжди мілісекунди, не дата. Не передавайте вік запису.
  • str - Шуканий підрядок або кілька альтернатив через |, наприклад 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  RunScenario();
 object? RunScenario()
{
    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 - мілісекунди очікування.
  • Кордон вмикається. Вибраний рядок сам може підійти, якщо містить відповідь.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var 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;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.WaitJournalLine(startTime, str, maxWaitTimeMS) — UO.WaitJournalLine(Any,Any,Any)

Параметри: startTime (Any), str (Any), maxWaitTimeMS (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "waitjournalline": return WaitJournalLine(arguments, false);

UO.WaitJournalLineSystem

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

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

dynamic UO.WaitJournalLineSystem(object? startTime, object? str, object? maxWaitTimeMS);

Очікує відповідне повідомлення з ім'ям автора System.

Параметри

  • startTime — Обов'язкова початкова мітка: int Now() у мілісекундах, 0 — початок виконання. Також приймається double OLE date з LineTime (сучасні дати 20000…100000 днів). Цілі 20000…100000 завжди мілісекунди, не дата. Не передавайте вік запису.
  • str - Шуканий підрядок або кілька альтернатив через |, наприклад 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  RunScenario();
 object? RunScenario()
{
    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 - мілісекунди очікування.
  • Кордон вмикається. Вибраний рядок сам може підійти, якщо містить відповідь.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var 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;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.WaitJournalLineSystem(startTime, str, maxWaitTimeMS) — UO.WaitJournalLineSystem(Any,Any,Any)

Параметри: startTime (Any), str (Any), maxWaitTimeMS (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "waitjournallinesystem": return WaitJournalLine(arguments, true);

UO.WaitingForJournalText

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

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

void UO.WaitingForJournalText(object? startTime, object? maxDelay, object? text);
void UO.WaitingForJournalText(object? startTime, object? maxDelay, object? text, object? equals);
void UO.WaitingForJournalText(object? startTime, object? maxDelay, object? text, object? equals, object? ignoreCase);
void UO.WaitingForJournalText(object? startTime, object? maxDelay, object? text, object? equals, object? ignoreCase, object? skillNameOrObjectId);

Очікує текст із додатковими режимами порівняння та необов'язковим запуском навички/предмету.

Параметри

  • 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  RunScenario();
 object? RunScenario()
{
    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  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var 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();
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.WaitingForJournalText(startTime, maxDelay, text) — UO.WaitingForJournalText(Integer,Integer,String)

Параметри: startTime (Integer), maxDelay (Integer), text (String)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void WaitingForJournalText(int startTime, int maxDelay, string text)

            => WaitingForJournalText(startTime, maxDelay, text, 0, 0, InjectionValue.Zero);

UO.WaitingForJournalText(startTime, maxDelay, text, equals) — UO.WaitingForJournalText(Integer,Integer,String,Integer)

Параметри: startTime (Integer), maxDelay (Integer), text (String), equals (Integer)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void WaitingForJournalText(int startTime, int maxDelay, string text, int equals)

            => WaitingForJournalText(startTime, maxDelay, text, equals, 0, InjectionValue.Zero);

UO.WaitingForJournalText(startTime, maxDelay, text, equals, ignoreCase) — UO.WaitingForJournalText(Integer,Integer,String,Integer,Integer)

Параметри: startTime (Integer), maxDelay (Integer), text (String), equals (Integer), ignoreCase (Integer)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void WaitingForJournalText(int startTime, int maxDelay, string text, int equals, int ignoreCase)

            => WaitingForJournalText(startTime, maxDelay, text, equals, ignoreCase, InjectionValue.Zero);

UO.WaitingForJournalText(startTime, maxDelay, text, equals, ignoreCase, skillNameOrObjectId) — UO.WaitingForJournalText(Integer,Integer,String,Integer,Integer,Any)

Параметри: startTime (Integer), maxDelay (Integer), text (String), equals (Integer), ignoreCase (Integer), skillNameOrObjectId (Any)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void WaitingForJournalText(int startTime, int maxDelay, string text, int equals, int ignoreCase, InjectionValue skillNameOrObjectId)

        {

            int timeout = Math.Max(0, maxDelay);

            bool exactMatch = equals != 0;

            bool caseInsensitive = ignoreCase != 0;

            string pattern = text ?? string.Empty;

            DateTime deadline = timeSource.Now.AddMilliseconds(timeout);

            SelectJournalEntry(null);



            TriggerWaitAction(skillNameOrObjectId);



            do

            {

                int journalCount = Math.Max(0, bridge.JournalEntryCount());

                for (int index = 0; index < journalCount; index++)

                {

                    JournalEntrySnapshot entry = ReadJournalSnapshot(index);

                    int lineTime = entry == null ? -1 : JournalEntryTime(entry.Timestamp);

                    if (lineTime < 0 || lineTime < startTime)

                        continue;



                    string journalText = entry.Text;

                    int matchId = FindJournalPatternId(journalText, pattern, exactMatch, caseInsensitive);

                    if (matchId >= 0)

                    {

                        SelectJournalEntry(entry);

                        foundedTextId = matchId;

                        return;

                    }

                }

                if (timeSource.Now >= deadline)

                    break;

                bridge.Wait(Math.Min(25, Math.Max(1, timeout)));

            }

            while (true);

        }

Clone this wiki locally