KO UO Topic journal Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

Π£ΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠ° Β· Русский Β· English Β· Deutsch Β· FranΓ§ais Β· Italiano Β· EspaΓ±ol Β· 繁體中文 Β· ζ—₯本θͺž Β· ν•œκ΅­μ–΄

Journal β€” 2

ν™ˆ Β· C# Β· IDE Β· UO API Β· A–Z Β· 예 Β· μ–Έμ–΄

μ°Έμ‘° ꡬ성

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 - μ‹€ν–‰ μ‹œμž‘. λ˜ν•œ LineTime μ΄ν›„μ˜ double OLE λ‚ μ§œ(ν˜„λŒ€ λ‚ μ§œ 20000…100000일)도 ν—ˆμš©λ©λ‹ˆλ‹€. 전체 20000…100000λŠ” 항상 λ‚ μ§œκ°€ μ•„λ‹Œ λ°€λ¦¬μ΄ˆμž…λ‹ˆλ‹€. μ°Έκ°€ 연령을 μ•Œλ €μ£Όμ§€ λ§ˆμ„Έμš”.
  • str β€” |λ₯Ό 톡해 κ²€μƒ‰λœ ν•˜μœ„ λ¬Έμžμ—΄ λ˜λŠ” μ—¬λŸ¬ λŒ€μ•ˆ(예: 성곡|μ‹€νŒ¨). 각 λŒ€μ•ˆμ˜ κ°€μž₯μžλ¦¬μ— μžˆλŠ” 곡백은 제거되고, 빈 λŒ€μ•ˆμ€ κ±΄λ„ˆλœλ‹ˆλ‹€. μ΄λŠ” μ •κ·œμ‹μ΄ μ•„λ‹Œ 일반 ν…μŠ€νŠΈμž…λ‹ˆλ‹€. λΉ„μ–΄ μžˆμ§€ μ•Šμ€ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ„Έμš”. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” 검색.
  • maxWaitTimeMS β€” ν•„μˆ˜ int μ‹œκ°„ 초과(λ°€λ¦¬μ΄ˆ). μ–‘μˆ˜ 값은 λŒ€κΈ°λ₯Ό μ œν•œν•˜κ³ , 0λŠ” μ œν•œ μ—†λŠ” λŒ€κΈ°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 음수 값은 0둜 μ œν•œλ©λ‹ˆλ‹€. 슀크립트λ₯Ό μ€‘μ§€ν•˜λ©΄ λŒ€κΈ°κ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€.

λ°˜ν™˜κ°’

bool - true ν…μŠ€νŠΈκ°€ 발견되면 false μΌμΉ˜ν•˜μ§€ μ•Šκ³  긍정적인 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•œ κ²½μš°μž…λ‹ˆλ‹€. 이것은 μ§€μˆ˜λ‚˜ 양이 μ•„λ‹™λ‹ˆλ‹€. λΆˆλ¦¬μ–Έ 값은 μŠ€ν¬λ¦½νŠΈμ—μ„œ 1/0둜 ν‘œμ‹œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήμ˜ κ²°κ³ΌλŠ” 숫자 ν”Œλž˜κ·Έμž…λ‹ˆλ‹€. 1λŠ” 좩쑱된 쑰건을 μ˜λ―Έν•˜κ³ , 0λŠ” μΆ©μ‘±λ˜μ§€ μ•Šμ€ 쑰건을 μ˜λ―Έν•©λ‹ˆλ‹€. var result = command(...) 후에 (κ²°κ³Ό != 0) λ˜λŠ” (κ²°κ³Ό == 0)인지 ν™•μΈν•˜μ„Έμš”. ν•œ 번의 호좜 κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 반볡된 ν˜ΈμΆœμ„ 톡해 ν•΄λ‹Ή μž‘μ—…μ„ λ‹€μ‹œ μˆ˜ν–‰ν•˜κ±°λ‚˜ 이미 λ³€κ²½λœ μƒνƒœλ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ™μž‘

  • 검색 및 Journal/GetJournal/LastJournalMessageλŠ” ν˜„μž¬ μŠ€ν¬λ¦½νŠΈμ—μ„œ 단일 ν•­λͺ©μ˜ ν…μŠ€νŠΈμ™€ ν•„λ“œλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μƒˆ λ©”μ‹œμ§€λŠ” 이 ν•„λ“œλ₯Ό λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œν•œλœ μ €λ„μ—μ„œ λ ˆμ½”λ“œκ°€ 제거되면 μœ μ§€λœ ν•„λ“œλŠ” μœ μ§€λ˜μ§€λ§Œ LineIndex/GetFoundedTextIndexλŠ” -1λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€μŒ 검색 λ˜λŠ” μ½κΈ°μ—μ„œλŠ” λ‹€λ₯Έ ν•­λͺ©μ΄ μ„ νƒλ©λ‹ˆλ‹€. μ‹€νŒ¨ν•œ 검색, 잘λͺ»λœ 색인 및 이 슀크립트λ₯Ό ν†΅ν•œ μ‚­μ œλŠ” 선택을 μž¬μ„€μ •ν•©λ‹ˆλ‹€.
  • 호좜 μ‹œ 초기 κ²½κ³„λŠ” κ³ μ •λ˜λ©° 폴링은 λŒ€λž΅ 25msλ§ˆλ‹€ λ°œμƒν•©λ‹ˆλ‹€. κΈ°λŒ€ μžμ²΄κ°€ μŠ€ν‚¬μ΄λ‚˜ μ•„μ΄ν…œμ„ λ°œλ™μ‹œν‚€μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. LineCount λŒ€κΈ° ν›„ λ§ˆμ§€λ§‰ 검색을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μ‹œμŠ€ν…œ λ¬Έμžμ—΄λ§Œ ν•„ν„°λ§ν•˜λ €λ©΄ WaitJournalLineSystemλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

독립 μ‹€ν–‰ C# 슀크립트

각 μ˜ˆμ œλŠ” λ³„λ„μ˜ 파일 .csx둜 μ €μž₯ν•˜κ³  IDEμ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. UO κ°œμ²΄μ™€ λŒ€κΈ° κΈ°λŠ₯은 ν˜„μž¬ κ²Œμž„ μ„Έμ…˜μ˜ 호슀트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 데λͺ¨ 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. μ €μž₯된 라벨 이후 λŒ€κΈ° - 직접 슀크립트

λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ 흐름:

  • μ‹œμž‘λ¨ β€” 기닀리기 μ „μ˜ ν•œλ„μž…λ‹ˆλ‹€. 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 - νƒ€μž„μ•„μ›ƒμ„ λΉ„ν™œμ„±ν™”ν•˜μ§€ μ•Šκ³  λŸ°νƒ€μž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€. 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. μ„ νƒν•œ ν–‰μ˜ 달λ ₯ 경계 - 슀크립트 클래슀

λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ 흐름:

  • μŠ€νƒ¬ν”„λŠ” Convert.ToInt32/Convert.ToString 없이 double LineTimeλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μ΄λŠ” 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);

μž‘μ„±μž μ‹œμŠ€ν…œμ˜ 이름이 ν¬ν•¨λœ μ μ ˆν•œ λ©”μ‹œμ§€λ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.

λ§€κ°œλ³€μˆ˜

  • startTime - ν•„μˆ˜ μ‹œμž‘ 라벨: int Now()(λ°€λ¦¬μ΄ˆ λ‹¨μœ„), 0 - μ‹€ν–‰ μ‹œμž‘. λ˜ν•œ LineTime μ΄ν›„μ˜ double OLE λ‚ μ§œ(ν˜„λŒ€ λ‚ μ§œ 20000…100000일)도 ν—ˆμš©λ©λ‹ˆλ‹€. 전체 20000…100000λŠ” 항상 λ‚ μ§œκ°€ μ•„λ‹Œ λ°€λ¦¬μ΄ˆμž…λ‹ˆλ‹€. μ°Έκ°€ 연령을 μ•Œλ €μ£Όμ§€ λ§ˆμ„Έμš”.
  • str β€” |λ₯Ό 톡해 κ²€μƒ‰λœ ν•˜μœ„ λ¬Έμžμ—΄ λ˜λŠ” μ—¬λŸ¬ λŒ€μ•ˆ(예: 성곡|μ‹€νŒ¨). 각 λŒ€μ•ˆμ˜ κ°€μž₯μžλ¦¬μ— μžˆλŠ” 곡백은 제거되고, 빈 λŒ€μ•ˆμ€ κ±΄λ„ˆλœλ‹ˆλ‹€. μ΄λŠ” μ •κ·œμ‹μ΄ μ•„λ‹Œ 일반 ν…μŠ€νŠΈμž…λ‹ˆλ‹€. λΉ„μ–΄ μžˆμ§€ μ•Šμ€ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ„Έμš”. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” 검색.
  • maxWaitTimeMS β€” ν•„μˆ˜ int μ‹œκ°„ 초과(λ°€λ¦¬μ΄ˆ). μ–‘μˆ˜ 값은 λŒ€κΈ°λ₯Ό μ œν•œν•˜κ³ , 0λŠ” μ œν•œ μ—†λŠ” λŒ€κΈ°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 음수 값은 0둜 μ œν•œλ©λ‹ˆλ‹€. 슀크립트λ₯Ό μ€‘μ§€ν•˜λ©΄ λŒ€κΈ°κ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€.

λ°˜ν™˜κ°’

bool - true ν…μŠ€νŠΈκ°€ 발견되면 false μΌμΉ˜ν•˜μ§€ μ•Šκ³  긍정적인 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•œ κ²½μš°μž…λ‹ˆλ‹€. 이것은 μ§€μˆ˜λ‚˜ 양이 μ•„λ‹™λ‹ˆλ‹€. λΆˆλ¦¬μ–Έ 값은 μŠ€ν¬λ¦½νŠΈμ—μ„œ 1/0둜 ν‘œμ‹œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήμ˜ κ²°κ³ΌλŠ” 숫자 ν”Œλž˜κ·Έμž…λ‹ˆλ‹€. 1λŠ” 좩쑱된 쑰건을 μ˜λ―Έν•˜κ³ , 0λŠ” μΆ©μ‘±λ˜μ§€ μ•Šμ€ 쑰건을 μ˜λ―Έν•©λ‹ˆλ‹€. var result = command(...) 후에 (κ²°κ³Ό != 0) λ˜λŠ” (κ²°κ³Ό == 0)인지 ν™•μΈν•˜μ„Έμš”. ν•œ 번의 호좜 κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 반볡된 ν˜ΈμΆœμ„ 톡해 ν•΄λ‹Ή μž‘μ—…μ„ λ‹€μ‹œ μˆ˜ν–‰ν•˜κ±°λ‚˜ 이미 λ³€κ²½λœ μƒνƒœλ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ™μž‘

  • 검색 및 Journal/GetJournal/LastJournalMessageλŠ” ν˜„μž¬ μŠ€ν¬λ¦½νŠΈμ—μ„œ 단일 ν•­λͺ©μ˜ ν…μŠ€νŠΈμ™€ ν•„λ“œλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μƒˆ λ©”μ‹œμ§€λŠ” 이 ν•„λ“œλ₯Ό λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œν•œλœ μ €λ„μ—μ„œ λ ˆμ½”λ“œκ°€ 제거되면 μœ μ§€λœ ν•„λ“œλŠ” μœ μ§€λ˜μ§€λ§Œ LineIndex/GetFoundedTextIndexλŠ” -1λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€μŒ 검색 λ˜λŠ” μ½κΈ°μ—μ„œλŠ” λ‹€λ₯Έ ν•­λͺ©μ΄ μ„ νƒλ©λ‹ˆλ‹€. μ‹€νŒ¨ν•œ 검색, 잘λͺ»λœ 색인 및 이 슀크립트λ₯Ό ν†΅ν•œ μ‚­μ œλŠ” 선택을 μž¬μ„€μ •ν•©λ‹ˆλ‹€.
  • 호좜 μ‹œ 초기 κ²½κ³„λŠ” κ³ μ •λ˜λ©° 폴링은 λŒ€λž΅ 25msλ§ˆλ‹€ λ°œμƒν•©λ‹ˆλ‹€. κΈ°λŒ€ μžμ²΄κ°€ μŠ€ν‚¬μ΄λ‚˜ μ•„μ΄ν…œμ„ λ°œλ™μ‹œν‚€μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. LineCount λŒ€κΈ° ν›„ λ§ˆμ§€λ§‰ 검색을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 이 μ μ‘μ—μ„œ μ‹œμŠ€ν…œμ€ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  μž‘μ„±μž μ΄λ¦„μœΌλ‘œ μ‹λ³„λ©λ‹ˆλ‹€. 이 λͺ…령은 일반 저널 ClassicUOμ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.

독립 μ‹€ν–‰ C# 슀크립트

각 μ˜ˆμ œλŠ” λ³„λ„μ˜ 파일 .csx둜 μ €μž₯ν•˜κ³  IDEμ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. UO κ°œμ²΄μ™€ λŒ€κΈ° κΈ°λŠ₯은 ν˜„μž¬ κ²Œμž„ μ„Έμ…˜μ˜ 호슀트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 데λͺ¨ 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. μ €μž₯된 라벨 이후 λŒ€κΈ° - 직접 슀크립트

λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ 흐름:

  • μ‹œμž‘λ¨ β€” 기닀리기 μ „μ˜ ν•œλ„μž…λ‹ˆλ‹€. 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 - νƒ€μž„μ•„μ›ƒμ„ λΉ„ν™œμ„±ν™”ν•˜μ§€ μ•Šκ³  λŸ°νƒ€μž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€. 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. μ„ νƒν•œ ν–‰μ˜ 달λ ₯ 경계 - 슀크립트 클래슀

λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ 흐름:

  • μŠ€νƒ¬ν”„λŠ” Convert.ToInt32/Convert.ToString 없이 double LineTimeλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μ΄λŠ” 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 λŸ°νƒ€μž„ μ‹œμž‘λΆ€ν„° λ°€λ¦¬μ΄ˆ. startTime μ΄μƒμ˜ 라벨이 μžˆλŠ” 라인이 κ²€μ‚¬λ©λ‹ˆλ‹€. 0μ—λŠ” 라벨이 0인 ν•­λͺ©μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • maxDelay β€” ν•„μˆ˜ μ΅œλŒ€ λŒ€κΈ° μ‹œκ°„(λ°€λ¦¬μ΄ˆ)μž…λ‹ˆλ‹€. 0 및 음수 값은 λ¬΄ν•œ λŒ€κΈ°κ°€ μ•„λ‹Œ μ¦‰μ‹œ 1회 톡과λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • text β€” |λ₯Ό 톡해 κ²€μƒ‰λœ ν•˜μœ„ λ¬Έμžμ—΄ λ˜λŠ” μ—¬λŸ¬ λŒ€μ•ˆ(예: 성곡|μ‹€νŒ¨). 각 λŒ€μ•ˆμ˜ κ°€μž₯μžλ¦¬μ— μžˆλŠ” 곡백은 제거되고, 빈 λŒ€μ•ˆμ€ κ±΄λ„ˆλœλ‹ˆλ‹€. μ΄λŠ” μ •κ·œμ‹μ΄ μ•„λ‹Œ 일반 ν…μŠ€νŠΈμž…λ‹ˆλ‹€. λΉ„μ–΄ μžˆμ§€ μ•Šμ€ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ„Έμš”.
  • equals - 선택 사항 int: 0 (κΈ°λ³Έκ°’) - ν•˜μœ„ λ¬Έμžμ—΄; 0이 μ•„λ‹Œ κ°’ - λͺ¨λ“  ν…μŠ€νŠΈλŠ” ν•˜λ‚˜μ˜ λŒ€μ•ˆκ³Ό μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • ignoreCase β€” 선택적 int: 0 (κΈ°λ³Έκ°’) β€” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€. 0이 μ•„λ‹˜ - λ¬΄μ‹œν•©λ‹ˆλ‹€.
  • skillNameOrObjectId - Optional skill by name, serial/hex string or resolvable object alias. The name of the skill is recognized first, otherwise the object is used. 0/빈 쀄은 μž‘μ—…μ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€. The skill/item is triggered once before searching.

λ°˜ν™˜κ°’

void - λ°˜ν™˜ 값이 μ—†μŠ΅λ‹ˆλ‹€. ν˜ΈμΆœμ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ™„λ£Œλ˜λ©΄ GetFoundedTextIndex >= 0λŠ” μ„ νƒν•œ ν•­λͺ©μ„ 계속 μ‚¬μš©ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. -1 - 찾을 수 μ—†μŒ/기둝이 μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. GetFoundedTextID 선택이 μ„±κ³΅ν•œ κ²½μš°μ—λ§Œ μΌμΉ˜ν•˜λŠ” λŒ€μ•ˆμ„ ν‘œμ‹œν•©λ‹ˆλ‹€.

λ™μž‘

  • 검색 및 Journal/GetJournal/LastJournalMessageλŠ” ν˜„μž¬ μŠ€ν¬λ¦½νŠΈμ—μ„œ 단일 ν•­λͺ©μ˜ ν…μŠ€νŠΈμ™€ ν•„λ“œλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μƒˆ λ©”μ‹œμ§€λŠ” 이 ν•„λ“œλ₯Ό λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œν•œλœ μ €λ„μ—μ„œ λ ˆμ½”λ“œκ°€ 제거되면 μœ μ§€λœ ν•„λ“œλŠ” μœ μ§€λ˜μ§€λ§Œ LineIndex/GetFoundedTextIndexλŠ” -1λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€μŒ 검색 λ˜λŠ” μ½κΈ°μ—μ„œλŠ” λ‹€λ₯Έ ν•­λͺ©μ΄ μ„ νƒλ©λ‹ˆλ‹€. μ‹€νŒ¨ν•œ 검색, 잘λͺ»λœ 색인 및 이 슀크립트λ₯Ό ν†΅ν•œ μ‚­μ œλŠ” 선택을 μž¬μ„€μ •ν•©λ‹ˆλ‹€.
  • μ΅œλŒ€ 25 ms λ™μ•ˆ μΌμ‹œ μ •μ§€ν•˜μ—¬ ν΄λ§ν•©λ‹ˆλ‹€. 슀크립트λ₯Ό μ€‘μ§€ν•˜λ©΄ μŠ€ν¬λ¦½νŠΈκ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€. 빈 λŒ€μ•ˆ λͺ©λ‘μ—μ„œλŠ” ν…μŠ€νŠΈλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. bool κ²°κ³Όλ₯Ό μ–»μœΌλ €λ©΄ 자체 λ§€κ°œλ³€μˆ˜μ™€ 제둜 νƒ€μž„μ•„μ›ƒμ˜ μ˜λ―Έμ™€ ν•¨κ»˜ WaitJournalLineλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

독립 μ‹€ν–‰ C# 슀크립트

각 μ˜ˆμ œλŠ” λ³„λ„μ˜ 파일 .csx둜 μ €μž₯ν•˜κ³  IDEμ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. UO κ°œμ²΄μ™€ λŒ€κΈ° κΈ°λŠ₯은 ν˜„μž¬ κ²Œμž„ μ„Έμ…˜μ˜ 호슀트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 데λͺ¨ serial 이름, μ’Œν‘œ, μ£Όμ†Œλ₯Ό μžμ‹ μ˜ κ²ƒμœΌλ‘œ λ°”κΎΈμ„Έμš”.

κ°„λ‹¨ν•œ 예제

이 μ½”λ“œλ₯Ό λ³„λ„μ˜ .csx 파일둜 μ‹€ν–‰ν•˜μ„Έμš”. μΈμˆ˜λŠ” ν˜ΈμΆœμ— 직접 ν‘œμ‹œλ©λ‹ˆλ‹€. 예제의 이름, serial, μ£Όμ†Œλ₯Ό μžμ‹ μ˜ κ°’μœΌλ‘œ λ°”κΎΈμ„Έμš”.

λͺ…령은 λ…λ¦½λœ λ¬Έμž…λ‹ˆλ‹€. μ•žμ˜ λ©”μ‹œμ§€λŠ” 호좜 μ‹œμž‘μ„ λ‚˜νƒ€λ‚΄λ©° μ„œλ²„ λ™μž‘μ˜ μ™„λ£Œλ₯Ό ν™•μΈν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

UO.Print("Calling UO.WaitingForJournalText");
UO.WaitingForJournalText(Now(), 2000, "notice");

1. ν•˜λ‚˜μ˜ ν•˜μœ„ λ¬Έμžμ—΄μ΄ ν•„μš”ν•©λ‹ˆλ‹€ - 직접 슀크립트

λ§€κ°œλ³€μˆ˜μ™€ μ‹€ν–‰ 흐름:

  • startTime β€” 기닀리기 전에 ν‘œμ‹œν•©λ‹ˆλ‹€. maxDelay=2000 ms; λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λŠ” ν•˜μœ„ λ¬Έμžμ—΄ 비ꡐ.
  • λͺ…령이 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 - 1회 톡과. κ°™μŒ=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의 μ—¬μ„― 번째 μΈμˆ˜λŠ” μŠ€ν‚¬μ„ ν•œ 번 μ‹€ν–‰ν•©λ‹ˆλ‹€. κ°™μŒ=0 β€” ν•˜μœ„ λ¬Έμžμ—΄, ignoreCase=1 β€” λŒ€μ†Œλ¬Έμž μ—†μŒ.
  • μˆ¨κΉ€/μ‹€νŒ¨λΌλŠ” λ‹¨μ–΄λŠ” μ˜ˆμ‹œμ΄λ―€λ‘œ μ„œλ²„μ˜ ν…μŠ€νŠΈλ‘œ λ°”κΎΈμ„Έμš”. μŠ€ν‚¬ λŒ€μ‹  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);

        }
⚠️ **GitHub.com Fallback** ⚠️