Repository navigation
UO Topic journal Part 2
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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.
Параметри: startTime (Any), str (Any), maxWaitTimeMS (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WaitJournalLine:WaitJournalLine(arguments, false).
Внутрішній код реалізації, не самостійний скрипт.
case "waitjournalline": return WaitJournalLine(arguments, false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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.
Параметри: startTime (Any), str (Any), maxWaitTimeMS (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WaitJournalLine:WaitJournalLine(arguments, true).
Внутрішній код реалізації, не самостійний скрипт.
case "waitjournallinesystem": return WaitJournalLine(arguments, true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 з його власними параметрами та змістом нульового тайм-ауту.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.WaitingForJournalText");
UO.WaitingForJournalText(Now(), 2000, "notice");Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Шостий аргумент 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.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText. -
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText:WaitingForJournalText(startTime, maxDelay, text, 0, 0, InjectionValue.Zero).
Внутрішній код реалізації, не самостійний скрипт.
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.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText. -
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText:WaitingForJournalText(startTime, maxDelay, text, equals, 0, InjectionValue.Zero).
Внутрішній код реалізації, не самостійний скрипт.
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.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText. -
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText:WaitingForJournalText(startTime, maxDelay, text, equals, ignoreCase, InjectionValue.Zero).
Внутрішній код реалізації, не самостійний скрипт.
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.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForJournalText. -
InjectionScript.Runtime.InjectionApiUO.SelectJournalEntry:SelectJournalEntry(null). -
InjectionScript.Runtime.InjectionApiUO.TriggerWaitAction:TriggerWaitAction(skillNameOrObjectId). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalEntryCount:bridge.JournalEntryCount(). -
InjectionScript.Runtime.InjectionApiUO.ReadJournalSnapshot:ReadJournalSnapshot(index). -
InjectionScript.Runtime.InjectionApiUO.JournalEntryTime:JournalEntryTime(entry.Timestamp). -
InjectionScript.Runtime.InjectionApiUO.FindJournalPatternId:FindJournalPatternId(journalText, pattern, exactMatch, caseInsensitive). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Wait:bridge.Wait(Math.Min(25, Math.Max(1, timeout))).
Внутрішній код реалізації, не самостійний скрипт.
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);
}ClassicUO — Bad Newbie & C# Scripts IDE