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

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท 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;

์ฐธ์กฐ ๊ตฌ์„ฑ

1 ยท 2

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.AddJournalIgnore

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.AddJournalIgnore(object? str);

ClassicUO ๊ฒŒ์ž„ ๋กœ๊ทธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๋กœ์ปฌ ํ…์ŠคํŠธ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • str - ์ €๋„ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰ํ•  ๋น„์–ด ์žˆ์ง€ ์•Š์€ ํ…์ŠคํŠธ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ์ด ๋ช…๋ น์€ ์ผ์น˜ ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ…์ŠคํŠธ๊ฐ€ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ์ž˜๋ฆฝ๋‹ˆ๋‹ค. ๋นˆ ์ค„์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ๋•Œ ํ•˜์œ„ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์€ ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ์— ๋กœ์ปฌ๋กœ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ํ•„ํ„ฐ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. UO.ClearJournalIgnore() ์ถ”๊ฐ€๋œ ๋ชจ๋“  ํ…์ŠคํŠธ ํ•„ํ„ฐ๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ด๋ฏธ ํ‘œ์‹œ๋œ ํ•ญ๋ชฉ์€ ์ง€์›Œ๋„ ๋ณต์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. ์ด ๋ฌธ๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๊ฒŒ์‹œ๋ฌผ์„ ์ˆจ๊น๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ๋ฌธ๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๊ฒŒ์‹œ๋ฌผ์„ ์ˆจ๊น๋‹ˆ๋‹ค.
UO.AddJournalIgnore("You see");

2. ํ•„ํ„ฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•„ํ„ฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var phrase = "vendor";
    UO.AddJournalIgnore(phrase);
    return null;
}

3. ์—ฌ๋Ÿฌ ํ†ตํ™”๋ฅผ ํ•˜๋ฉด ๋…๋ฆฝ์ ์ธ ํ…์ŠคํŠธ ํ•„ํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์—ฌ๋Ÿฌ ํ†ตํ™”๋ฅผ ํ•˜๋ฉด ๋…๋ฆฝ์ ์ธ ํ…์ŠคํŠธ ํ•„ํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
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()
    {
        UO.AddJournalIgnore("You see");
        UO.AddJournalIgnore("vendor");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddJournalIgnore(str) โ€” UO.AddJournalIgnore(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: str (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "addjournalignore": bridge.AddJournalIgnore(Text(0)); return InjectionValue.Unit;

UO.AddToJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.AddToJournal(object? text);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋ฐ˜ํ™˜๊ฐ’

๋ฐ˜ํ™˜ ์œ ํ˜•์ด void์ธ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฌธ C#๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…์„ธ์„œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฒŒ์ž„ ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ƒ‰์ƒ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 0x0440, ๋ณ€๊ฒฝ๋จ UO.ConColor. ์ด๊ฒƒ์€ ๋กœ์ปฌ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.AddToJournal("Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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  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 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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddToJournal(text) โ€” UO.AddToJournal(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: text (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "addtojournal":

                case "addtosystemjournal":

                case "clientprint":

                    SystemMessage(Text(0)); return InjectionValue.Unit;

UO.AddToSystemJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.AddToSystemJournal(object? text);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋ฐ˜ํ™˜๊ฐ’

๋ฐ˜ํ™˜ ์œ ํ˜•์ด void์ธ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฌธ C#๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…์„ธ์„œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฒŒ์ž„ ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ƒ‰์ƒ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 0x0440, ๋ณ€๊ฒฝ๋จ UO.ConColor. ์ด๊ฒƒ์€ ๋กœ์ปฌ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.AddToSystemJournal("Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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  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 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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddToSystemJournal(text) โ€” UO.AddToSystemJournal(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: text (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "addtojournal":

                case "addtosystemjournal":

                case "clientprint":

                    SystemMessage(Text(0)); return InjectionValue.Unit;

UO.AddToSystemJournalEx

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.AddToSystemJournalEx(object? text, object? textColor, object? bgColor, object? fontSize, object? fontName);

๊ฒŒ์ž„ ์ฐฝ์— ๋กœ์ปฌ ๋ผ์ธ์„ ์ถœ๋ ฅํ•˜๊ณ  ์ง€์ •๋œ ๋””์ž์ธ์˜ ๋Œ€๋žต์ ์ธ ํ‘œ์‹œ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ ์ง„๋‹จ ๋ฉ”์‹œ์ง€์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • textColor โ€” UO hue๊ฐ€ ์•„๋‹Œ 0xRRGGBB ํ˜•์‹์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. ์•ŒํŒŒ ์ฑ„๋„์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ 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์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.ClientPrintEx ยท UO.AddToSystemJournalEx

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0x112233์˜ ์–‘์ˆ˜ BGColor ๊ฐ’์€ IDE์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์š”์ฒญ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. FontSize=0 10๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋นˆ FontName๊ฐ€ Consolas๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฐฝ์—์„œ๋Š” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝ์ด ์น ํ•ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AddToSystemJournalEx("Formatting details", 0x33AAFF, 0x112233, 0, "");
    return null;
}

3. UO.AddToSystemJournalEx - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ReportCount๋Š” ์™„์ „ํžˆ ์„ ์–ธ๋œ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰์˜ ๋ณ€ํ™”๋งŒ ๋ณด๊ณ ํ•˜๋ฉฐ, ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋…น์ƒ‰ RGB์„ ์„ ํƒํ•˜๊ณ  ๊ฐ์†Œํ•˜๋Š” ๊ฒฝ์šฐ ๋นจ๊ฐ„์ƒ‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ƒˆ ์ˆ˜๋Ÿ‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” AddToSystemJournalEx๊ฐ€ ์•„๋‹Œ ReportCount์— ์†ํ•ฉ๋‹ˆ๋‹ค.
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 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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddToSystemJournalEx(text, textColor, bgColor, fontSize, fontName) โ€” UO.AddToSystemJournalEx(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: text (Any), textColor (Any), bgColor (Any), fontSize (Any), fontName (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "addtosystemjournalex":

                    bridge.PrintFormattedJournal(Text(0), Arg(1), Arg(2), Arg(3), Text(4)); return InjectionValue.Unit;

UO.ChangeJournalLength

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.ChangeJournalLength(object? newLength);

์œ ์ง€๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ ๊ธฐ๋ก ์ œํ•œ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • newLength โ€” int๋กœ ๋ณ€ํ™˜ํ•  ๋ ˆ์ฝ”๋“œ ์ˆ˜. ๋Ÿฐํƒ€์ž„ ์ œํ•œ์€ 1๊นŒ์ง€์ž…๋‹ˆ๋‹ค. JournalManager ์ƒ์ˆ˜ ์œ„์˜ ํ•œ๊ณ„.MAX_JOURNAL_HISTORY_COUNT.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.JournalLength, ๊ทธ๋Ÿฐ ๋‹ค์Œ SetJournalLength๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. JournalManager๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ์„ ์ƒˆ๋กœ์šด ์ œํ•œ์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ๊ธฐ์กด ๊ธฐ๋ก์„ ์ค„์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง๋œ ํ•ญ๋ชฉ๊ณผ ๋กœ๊ทธ ํ‘œ์‹œ๋Š” ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. 100 ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ก - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ƒˆ๋กœ์šด ์ œํ•œ์€ ์ €์žฅ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
UO.ChangeJournalLength(100);

2. ์ตœ์†Œ ๊ธฐ๋ก - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ œํ•œ์ด ์ค„์–ด๋“ค๋ฉด ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ChangeJournalLength(1);
    return null;
}

3. Null ์ž…๋ ฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋กœ๊ทธ๋ฅผ ์ง€์šฐ๋Š” ๋Œ€์‹  0์ด 1๋กœ ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค.
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()
    {
        UO.ChangeJournalLength(0);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ChangeJournalLength(newLength) โ€” UO.ChangeJournalLength(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: newLength (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "changejournallength": state.JournalLength = Math.Max(1, Arg(0, 100)); bridge.SetJournalLength(state.JournalLength); break;

UO.ClearJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.ClearJournal();

๊ณต์œ  ๋กœ์ปฌ ๋กœ๊ทธ์—์„œ ์ค„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ค‘ ํšŸ์ˆ˜ ์นด์šดํ„ฐ์™€ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ ์„ ํƒ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ณต์œ  ๋ฒ„ํผ๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ์ค„์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท์€ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” -1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ํ•„ํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์‹œ์Šคํ…œ์„ ํฌํ•จํ•˜์—ฌ ์ „์ฒด Classic UO ๋ฒ„ํผ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋กœ๊ทธ ํŒŒ์ผ๊ณผ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    UO.ClearJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. ์„ ํƒํ•œ ํ•ญ๋ชฉ ์žฌ์„ค์ • ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ index=-1๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•œ ํ›„, ๋ฒ„ํผ์˜ ์ผ๋ถ€๋งŒ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ๋ณ€์ˆ˜๋Š” ์ด์ „์— ์ฝ์€ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋ฉฐ GetFoundedText๋Š” ์ด๋ฏธ ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
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);
        UO.ClearJournal();
        var index = UO.LineIndex();
        UO.Print(Convert.ToString(index));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ClearJournal() โ€” UO.ClearJournal()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "clearjournal": DeleteJournal(); return InjectionValue.Unit;

UO.ClearJournalIgnore

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.ClearJournalIgnore();

๋ชจ๋“  ํ…์ŠคํŠธ ํ•„ํ„ฐ JournalManager๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๊ธฐ๋ก์ด ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ AddChatUserIgnore ์ด๋ฆ„ ํ•„ํ„ฐ๊ฐ€ ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. ์ƒํƒœ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ํ…์ŠคํŠธ ํ•„ํ„ฐ JournalManager๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
UO.ClearJournalIgnore();

2. ์„ค์ • ํ›„ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • You see ํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ‘œ์‹œ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AddJournalIgnore("You see");
    UO.ClearJournalIgnore();
    return null;
}

3. ์žฌ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ์„ธํŠธ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜๋ฉฐ ์ƒˆ ์„ค์ •์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        UO.ClearJournalIgnore();
        UO.ClearJournalIgnore();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ClearJournalIgnore() โ€” UO.ClearJournalIgnore()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "clearjournalignore": bridge.ClearJournalIgnore(); return InjectionValue.Unit;

UO.ClearSystemJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.ClearSystemJournal();

์ž‘์„ฑ์ž ์ด๋ฆ„์ด System์ธ ์ค„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ค‘ ํšŸ์ˆ˜ ์นด์šดํ„ฐ์™€ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ ์„ ํƒ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ณต์œ  ๋ฒ„ํผ๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ์ค„์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท์€ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” -1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์€ ์ž‘์„ฑ์ž ์ด๋ฆ„์œผ๋กœ ์ธ์‹๋˜๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ClassicUO ์ผ๋ฐ˜ ์ €๋„ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

1. ์„ ํƒํ•œ ๋กœ๊ทธ ์˜์—ญ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ–‰๋งŒ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๊ฒ€์ƒ‰ ์นด์šดํ„ฐ๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Print๋Š” ์‚ญ์ œ ํ›„ ์ƒˆ ํ–‰์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
UO.ClearSystemJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));

2. ๋Œ€๊ธฐ ์ „ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์ „์— ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. 1000 - ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์ž„์Šคํƒฌํ”„๋Š” ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ์™ธํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌ๋Š” ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearSystemJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. ์„ ํƒํ•œ ํ•ญ๋ชฉ ์žฌ์„ค์ • ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ index=-1๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•œ ํ›„, ๋ฒ„ํผ์˜ ์ผ๋ถ€๋งŒ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ๋ณ€์ˆ˜๋Š” ์ด์ „์— ์ฝ์€ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋ฉฐ GetFoundedText๋Š” ์ด๋ฏธ ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
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);
        UO.ClearSystemJournal();
        var index = UO.LineIndex();
        UO.Print(Convert.ToString(index));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ClearSystemJournal() โ€” UO.ClearSystemJournal()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "clearsystemjournal": bridge.DeleteSystemJournal(); SelectJournalEntry(null); return InjectionValue.Unit;

UO.DeleteJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๊ณต์œ  ๋กœ์ปฌ ๋กœ๊ทธ์—์„œ ์ค„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • text โ€” |๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ํ•˜์œ„ ๋ฌธ์ž์—ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๋Œ€์•ˆ(์˜ˆ: ์„ฑ๊ณต|์‹คํŒจ). ๊ฐ ๋Œ€์•ˆ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ๋Š” ๊ณต๋ฐฑ์€ ์ œ๊ฑฐ๋˜๊ณ , ๋นˆ ๋Œ€์•ˆ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ทœ์‹์ด ์•„๋‹Œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. DeleteJournal์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ์„ ํƒ ์‚ฌํ•ญ: ์ „์†ก ์‹œ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ „์ฒด ๋ฒ„ํผ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ค‘ ํšŸ์ˆ˜ ์นด์šดํ„ฐ์™€ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ ์„ ํƒ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ณต์œ  ๋ฒ„ํผ๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ์ค„์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท์€ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” -1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ํ•„ํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์‹œ์Šคํ…œ์„ ํฌํ•จํ•˜์—ฌ ์ „์ฒด Classic UO ๋ฒ„ํผ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋กœ๊ทธ ํŒŒ์ผ๊ณผ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    UO.DeleteJournal();
    var started = Now();
    var found = UO.WaitJournalLine(started, "notice", 1000);
    UO.Print(Convert.ToString(found));
    return null;
}

3. ์„ ํƒํ•œ ํ•ญ๋ชฉ ์žฌ์„ค์ • ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ index=-1๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•œ ํ›„, ๋ฒ„ํผ์˜ ์ผ๋ถ€๋งŒ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ๋ณ€์ˆ˜๋Š” ์ด์ „์— ์ฝ์€ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋ฉฐ GetFoundedText๋Š” ์ด๋ฏธ ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
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);
        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));

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.DeleteJournal() โ€” UO.DeleteJournal()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void DeleteJournal()

        {

            bridge.DeleteJournal();

            SelectJournalEntry(null);

        }

UO.DeleteJournal(text) โ€” UO.DeleteJournal(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: text (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void DeleteJournal(InjectionValue text) => DeleteJournal((string)text);

UO.FoundedParamId

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.FoundedParamId();

์ผ์น˜ํ•˜๋Š” ๊ฒ€์ƒ‰ ํŒจํ„ด ๋Œ€์•ˆ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int๋Š” |๋ฅผ ํ†ตํ•ด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋Œ€์•ˆ ๋ชฉ๋ก์— ์žˆ๋Š” 0์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต|์‹คํŒจ๋Š” ์„ฑ๊ณต์„ ์˜๋ฏธํ•˜๋Š” 0, ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜๋Š” 1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ํ•ฉํ•œ ๋Œ€์•ˆ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์˜ ์ฒซ ๋ฒˆ์งธ ๋Œ€์•ˆ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ง์ ‘ 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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์„ฑ๊ณต์€ 0์˜ ๋Œ€์•ˆ์ด๊ณ , ์‹คํŒจ๋Š” 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  RunScenario();
 object? RunScenario()
{
    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 ๋Œ€์•ˆ์„ ์žฌ์„ค์ •ํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฏธ๋ฆฌ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Journal ์ดํ›„์˜ ์ƒˆ๋กœ์šด getter ํ˜ธ์ถœ์€ ๋” ์ด์ƒ ์ด์ „ ํŒจํ„ด์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.FoundedParamId() โ€” UO.FoundedParamId()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "foundedparamid":

                    return new InjectionValue(foundedTextId >= 0 ? foundedTextId : 0);

UO.GetFoundedText

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetFoundedText();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์„ ํƒ ํ•ญ๋ชฉ์ด ์—†๋Š” ๋นˆ ์ค„์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ํ•ญ๋ชฉ์—๋Š” ๊ณต๋ฐฑ ํ…์ŠคํŠธ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedText() โ€” UO.GetFoundedText()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string GetFoundedText() => selectedJournalEntry?.Text ?? string.Empty;

UO.GetFoundedTextColor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetFoundedTextColor();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - UO hue 0x0044 ํ˜•์‹(4 16์ง„์ˆ˜). ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 0x0000; hue=0๋„ ๋ฉ”์‹œ์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RGB์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • string - UO hue 0x0044 ํ˜•์‹(4 16์ง„์ˆ˜). ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedTextColor() โ€” UO.GetFoundedTextColor()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string GetFoundedTextColor() => selectedJournalEntry != null ? $"0x{selectedJournalEntry.Color:X4}" : "0x0000";

UO.GetFoundedTextID

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.GetFoundedTextID();

์ผ์น˜ํ•˜๋Š” ๊ฒ€์ƒ‰ ํŒจํ„ด ๋Œ€์•ˆ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int๋Š” |๋ฅผ ํ†ตํ•ด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋Œ€์•ˆ ๋ชฉ๋ก์— ์žˆ๋Š” 0์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต|์‹คํŒจ๋Š” ์„ฑ๊ณต์„ ์˜๋ฏธํ•˜๋Š” 0, ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜๋Š” 1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ํ•ฉํ•œ ๋Œ€์•ˆ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์˜ ์ฒซ ๋ฒˆ์งธ ๋Œ€์•ˆ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ง์ ‘ 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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์„ฑ๊ณต์€ 0์˜ ๋Œ€์•ˆ์ด๊ณ , ์‹คํŒจ๋Š” 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  RunScenario();
 object? RunScenario()
{
    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 ๋Œ€์•ˆ์„ ์žฌ์„ค์ •ํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฏธ๋ฆฌ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Journal ์ดํ›„์˜ ์ƒˆ๋กœ์šด getter ํ˜ธ์ถœ์€ ๋” ์ด์ƒ ์ด์ „ ํŒจํ„ด์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedTextID() โ€” UO.GetFoundedTextID()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int GetFoundedTextID() => foundedTextId >= 0 ? foundedTextId : 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๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ €์žฅ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ID; ํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ GetFoundedText๊ฐ€ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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)์€ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ์—์„œ ๋นˆ ๋กœ๊ทธ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ํšจํ•œ ํ•ญ๋ชฉ์—๋Š” ๋นˆ ํ…์ŠคํŠธ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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 ms ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์ฐพ์€ ํ›„.
  • ์ œ๊ฑฐ๋˜๋ฉด ์ดํ›„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ -1๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetFoundedText์—๋Š” ์—ฌ์ „ํžˆ ์ €์žฅ๋œ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedTextIndex() โ€” UO.GetFoundedTextIndex()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int GetFoundedTextIndex() => selectedJournalEntry != null && bridge is IApiJournalReader reader

            ? reader.FindJournalEntryIndex(selectedJournalEntry.Identity) : foundedTextIndex;

UO.GetFoundedTextSerial

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetFoundedTextSerial();

์„ ํƒํ•œ ์ €๋„ ํ•ญ๋ชฉ์˜ ์ €์ž๋ฅผ serial ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - serial ์ €์ž์˜ 0x00001234 ํ˜•์‹(8 16์ง„์ˆ˜). ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 0x00000000. ์ด๊ฒƒ์€ ์ฃผ์ œ์˜ type๋‚˜ ์ €๋„ ์ƒ‰์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • string - serial ์ €์ž์˜ 0x00001234 ํ˜•์‹(8 16์ง„์ˆ˜). ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedTextSerial() โ€” UO.GetFoundedTextSerial()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string GetFoundedTextSerial() => selectedJournalEntry != null

            ? $"0x{unchecked((uint)selectedJournalEntry.Serial):X8}" : "0x00000000";

UO.GetFoundedTextTimer

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.GetFoundedTextTimer();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋ฐ€๋ฆฌ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ ์ˆœ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ธฐ๋กํ•˜๋ฉฐ Now()์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ์ „ ํ•ญ๋ชฉ์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์˜ ์—ฌ์ง€๋„ ์—†์ด 0; ์ž˜๋ชป๋œ ๋‹ฌ๋ ฅ ํ‘œ์‹œ๋Š” -1๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐํ˜•์ด๋‚˜ 10๋ถ„์˜ 1์ดˆ๋„ ์•„๋‹™๋‹ˆ๋‹ค UO.Timer().

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ ์ˆœ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ธฐ๋กํ•˜๋ฉฐ Now()์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ์ „ ํ•ญ๋ชฉ์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์˜ ์—ฌ์ง€๋„ ์—†์ด 0; ์ž˜๋ชป๋œ ๋‹ฌ๋ ฅ ํ‘œ์‹œ๋Š” -1๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐํ˜•์ด๋‚˜ 10๋ถ„์˜ 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundedTextTimer() โ€” UO.GetFoundedTextTimer()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int GetFoundedTextTimer() => selectedJournalEntry != null ? JournalEntryTime(selectedJournalEntry.Timestamp) : 0;

UO.GetJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetJournal(object? index);

ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์ค„์˜ ํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  GetFoundedText/Line*์— ๋Œ€ํ•œ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ 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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋งˆ์ง€๋ง‰ ์ค„๊ณผ ๊ทธ ์ž‘์„ฑ์ž๋Š” ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0๋Š” ์ตœ์‹  ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ํ…์ŠคํŠธ์™€ ์ €์ž๋ฅผ ์ฝ์€ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • Print๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ…์ŠคํŠธ/์ž‘์„ฑ์ž๋Š” ์ด์ „์— ์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
var text = UO.GetJournal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);

2. ์ด์ „ ์ค„์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 1๋Š” ์ด์ „ ํ•ญ๋ชฉ์ด๊ณ , HighJournal๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.
  • ํ†ตํ™” ๊ฐ„์— ๋กœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐœ๊ฒฌ๋œ ํ–‰์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” GetFoundedText๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    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  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.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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetJournal(index) โ€” UO.GetJournal(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string GetJournalText(int index)

        {

            SelectJournalEntry(ReadJournalSnapshot(index));

            return selectedJournalEntry?.Text ?? string.Empty;

        }

UO.GetJournalColor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetJournalColor(object? index);

์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ํ–‰์˜ hue ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ int - ํ˜„์žฌ ์ƒ‰์ธ: 0๋Š” ์ตœ์‹  ์ค„์„ ์˜๋ฏธํ•˜๊ณ , 1 - ์ด์ „ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial๋„ ์•„๋‹ˆ๊ณ  ํŒจํ„ด์˜ ID ๋ณ€ํ˜•๋„ ์•„๋‹ˆ๋ฉฐ InJournal์˜ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - UO hue 0x0044; ์ƒ‰์ธ 0x0000๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ. ์ด๊ฒƒ์€ RGB์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์น˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Journal(์ƒ‰์ธ)์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ GetFoundedText/Line*์„ ์ž…๋ ฅํ•˜์„ธ์š”. Null ๊ฐ’์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์ž‘์—… ์ „์— ๊ฐ’ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ˜ธ์ถœ ์‹œ ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค„ 0์„ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ๋ช…๋ น์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 value = UO.GetJournalColor(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetJournalColor(index) โ€” UO.GetJournalColor(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string JournalColor(int index) => bridge.JournalColor(index);

UO.GetJournalSerial

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.GetJournalSerial(object? index);

์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ํ–‰์˜ serial ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ int - ํ˜„์žฌ ์ƒ‰์ธ: 0๋Š” ์ตœ์‹  ์ค„์„ ์˜๋ฏธํ•˜๊ณ , 1 - ์ด์ „ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial๋„ ์•„๋‹ˆ๊ณ  ํŒจํ„ด์˜ ID ๋ณ€ํ˜•๋„ ์•„๋‹ˆ๋ฉฐ InJournal์˜ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - serial ์ €์ž์˜ 0x00001234; ์ƒ‰์ธ 0x00000000์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์น˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Journal(์ƒ‰์ธ)์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ GetFoundedText/Line*์„ ์ž…๋ ฅํ•˜์„ธ์š”. Null ๊ฐ’์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์ž‘์—… ์ „์— ๊ฐ’ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ˜ธ์ถœ ์‹œ ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค„ 0์„ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ๋ช…๋ น์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 value = UO.GetJournalSerial(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetJournalSerial(index) โ€” UO.GetJournalSerial(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string JournalSerial(int index) => bridge.JournalSerial(index);

UO.HighJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.HighJournal();

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋กœ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: -1 ๋งค๊ฑฐ์ง„์ด ๋น„์–ด ์žˆ์„ ๋•Œ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜์—์„œ 1๋ฅผ ๋บ€ ๊ฐ’์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ ˆ์ฝ”๋“œ์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. Journal/GetJournal ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ ์ด์ „ ๋ ˆ์ฝ”๋“œ๊นŒ์ง€ 0 ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ InJournal๋Š” ๋‹ค๋ฅธ ๋‹จ์ผ ์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€์™€ ์ •๋ฆฌ๋Š” ๊ฒฝ๊ณ„๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆœ์„œ๋Š” ์‹ ๊ธฐ๋ก๋ถ€ํ„ฐ ๊ตฌ๊ธฐ๋ก ์ˆœ์œผ๋กœ Journal(0) ์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    var total = UO.HighJournal() + 1;
    UO.Print("Rows: " + Convert.ToString(total));
    return null;
}

3. ๊ฒฝ๊ณ„์„  ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ๋ฑ์Šค๋Š” 1์„ ๋นผ์ง€ ์•Š๊ณ  Journal์— ์ง์ ‘ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ์€ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ๋Š” ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ณ ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.HighJournal() โ€” UO.HighJournal()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "highjournal": return new InjectionValue(bridge.JournalEntryCount() == 0 ? -1 : bridge.JournalEntryCount() - 1);

UO.InJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.InJournal(object? pattern);
int UO.InJournal(object? pattern, object? maxLinesOrIgnoreCase);
int UO.InJournal(object? pattern, object? serial, object? color);
int UO.InJournal(object? pattern, object? serial, object? color, object? startTime);
int UO.InJournal(object? pattern, object? serial, object? color, object? startTime, object? endTime);
int UO.InJournal(object? pattern, object? serial, object? color, object? startTime, object? endTime, object? newestOnly);
int UO.InJournal(object? pattern, object? serial, object? color, object? startTime, object? endTime, object? newestOnly, object? caseSensitive);

๋กœ์ปฌ ๋กœ๊ทธ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ฐพ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•ด๋‹น ํ•„๋“œ์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • pattern โ€” |๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ํ•˜์œ„ ๋ฌธ์ž์—ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๋Œ€์•ˆ(์˜ˆ: ์„ฑ๊ณต|์‹คํŒจ). ๊ฐ ๋Œ€์•ˆ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ๋Š” ๊ณต๋ฐฑ์€ ์ œ๊ฑฐ๋˜๊ณ , ๋นˆ ๋Œ€์•ˆ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ทœ์‹์ด ์•„๋‹Œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • maxLinesOrIgnoreCase โ€” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -1 โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. 0 - ์–ด๋–ค ์ค„๋„ ํ™•์ธํ•˜์ง€ ๋งˆ์„ธ์š”. ์–‘์ˆ˜ - ์ด ๋งˆ์ง€๋ง‰ ์ค„ ์ˆ˜ ์ดํ•˜๋กœ ํ™•์ธํ•˜์„ธ์š”. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Œ์ˆ˜ ๊ฐ’์€ 0๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • serial โ€” ์„ธ ๋ฒˆ์งธ ๋ฐ ํ›„์† ์ธ์ˆ˜์—๋Š” ํ™•์žฅ ํ˜•์‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํ˜•์‹์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์ž์˜ ์ˆซ์ž serial์ž…๋‹ˆ๋‹ค. -1๋Š” ํ•„ํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. 0๋Š” serial=0์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ํฌํ•จํ•˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐœ์ฒด ๋ณ„์นญ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 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๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ํŒจํ„ด ์ „์šฉ ์–‘์‹์€ ํ•ญ์ƒ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0 โ€“ ์ ํ•ฉํ•œ ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–‘์ˆ˜๋Š” 1๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ „์ฒด ๋กœ๊ทธ์˜ ๋๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์น˜ํ•˜๋Š” ์ˆซ์ž๋‚˜ ํŒจํ„ด ๋Œ€์ฒด ์ˆซ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0 ์ธ๋ฑ์Šค์—๋Š” LineIndex/GetFoundedTextIndex์„ ์‚ฌ์šฉํ•˜๊ณ , ์ผ์น˜ ๊ฐœ์ˆ˜์—๋Š” LineCount๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋Œ€์ฒด ์ˆซ์ž์—๋Š” GetFoundedTextID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ์ƒˆ ๋ฉ”์‹œ์ง€๋กœ ์ธํ•ด ์ƒ‰์ธ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ ํƒํ•œ ๊ธฐ๋ก์˜ ์ €์žฅ๋œ ํ•„๋“œ๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์—์„œ๋Š” ์ƒˆ ํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ InJournal์˜ ๋นˆ ํŒจํ„ด์€ ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜์ง€๋งŒ ID์— ๋Œ€์•ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๋ ค๋ฉด HighJournal/LowJournal๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋‘ ์ธ์ˆ˜ ํ˜•์‹์€ serial์ด ์•„๋‹Œ ํ•œ๊ณ„/์‚ฌ๋ก€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. serial์˜ ๊ฒฝ์šฐ ์ƒ‰์ƒ๋„ ํ•„์ˆ˜๋กœ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ SetJournalLine๋Š” ๊ฒ€์ƒ‰ ์˜์—ญ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • https://forum.yoko.com.ua/viewtopic.php?p=27633 ; .

Now()๋Š” ํ˜„์žฌ ์‹คํ–‰์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊ทธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋™์ผํ•œ ๊ธฐ๋ณธ ์‹œ๊ณ„์˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. Environment.TickCount, Unix ์‹œ๊ฐ„ ๋˜๋Š” ์ž์‹ ์˜ ์Šคํ†ฑ์›Œ์น˜๋กœ ๋ฐ”๊พธ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ .cs/.csproj ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ „๋‹ฌ๋œ CSharpScriptGlobals์—์„œ context.Now()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋ฉ”์‹œ์ง€ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํŒจํ„ด=๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. 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๋Š” ์ค„ ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • results=0 ์„ฑ๊ณต, 1 ์‹คํŒจ; ์ด๊ฒƒ์€ ํ™”์ž์˜ ID๊ฐ€ ์•„๋‹Œ ๋Œ€์•ˆ์˜ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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์ค„๋งŒ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 20 - ํ™•์ธํ•  ์ตœ๋Œ€ ์ค„ ์ˆ˜, ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ - ๊ฒ€์‚ฌ๋œ ์˜์—ญ์—์„œ ์ผ์น˜ํ•˜๋Š” ์ค„์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋ฐœ๊ฒฌ๋œ ์œ„์น˜์—๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” 1 ํ”Œ๋Ÿฌ์Šค ์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„๋‹จ ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋กœ๊ทธ์— ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
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 found = UO.InJournal("bank", 20);
        var matches = UO.LineCount();
        UO.Print("Matches: " + Convert.ToString(matches));
        return null;
    }
}

4. ๋ชจ๋“  ๊ณ ๊ธ‰ ์˜ต์…˜ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • serial=0x00001234 โ€” ์ž‘์„ฑ์ž์˜ ์˜ˆ, color=0x0044 โ€” hue. ์‹ค์ œ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. start/endTime โ€” ๋ฐ€๋ฆฌ์ดˆ ํ‘œ์‹œ.
  • true ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ ๊ฒ€์ƒ‰์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. false๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 350ms๋ฅผ ๋”ฐ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, 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  RunScenario();
 object? RunScenario()
{
    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;

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.InJournal(pattern) โ€” UO.InJournal(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "injournal": return new InjectionValue(InJournal(Text(0)));

UO.InJournal(pattern) โ€” UO.InJournal(String)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int InJournal(string pattern)

            => InJournalCore(pattern, -1, ignoreCase: false);

UO.InJournal(pattern, maxLinesOrIgnoreCase) โ€” UO.InJournal(String,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (String), maxLinesOrIgnoreCase (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int InJournal(string pattern, int maxLinesOrIgnoreCase)

            => InJournalCore(pattern,

                maxLinesOrIgnoreCase == -1 ? -1 : Math.Max(0, maxLinesOrIgnoreCase),

                ignoreCase: maxLinesOrIgnoreCase == -1);

UO.InJournal(pattern, serial, color) โ€” UO.InJournal(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any), serial (Any), color (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(CompactInJournal(values))

UO.InJournal(pattern, serial, color, startTime) โ€” UO.InJournal(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any), serial (Any), color (Any), startTime (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(CompactInJournal(values))

UO.InJournal(pattern, serial, color, startTime, endTime) โ€” UO.InJournal(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any), serial (Any), color (Any), startTime (Any), endTime (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(CompactInJournal(values))

UO.InJournal(pattern, serial, color, startTime, endTime, newestOnly) โ€” UO.InJournal(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any), serial (Any), color (Any), startTime (Any), endTime (Any), newestOnly (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(CompactInJournal(values))

UO.InJournal(pattern, serial, color, startTime, endTime, newestOnly, caseSensitive) โ€” UO.InJournal(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any), serial (Any), color (Any), startTime (Any), endTime (Any), newestOnly (Any), caseSensitive (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(CompactInJournal(values))

UO.InJournalBetweenTimes

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.InJournalBetweenTimes(object? pattern, object? startTime);
int UO.InJournalBetweenTimes(object? pattern, object? startTime, object? endTime);
int UO.InJournalBetweenTimes(object? pattern, object? startTime, object? endTime, object? limit);

๋‘ ์‹คํ–‰ ํƒ€์ž„์Šคํƒฌํ”„ ์‚ฌ์ด์˜ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š” ์ตœ์‹  ํ•ญ๋ชฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • pattern โ€” |๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ํ•˜์œ„ ๋ฌธ์ž์—ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๋Œ€์•ˆ(์˜ˆ: ์„ฑ๊ณต|์‹คํŒจ). ๊ฐ ๋Œ€์•ˆ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ๋Š” ๊ณต๋ฐฑ์€ ์ œ๊ฑฐ๋˜๊ณ , ๋นˆ ๋Œ€์•ˆ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ทœ์‹์ด ์•„๋‹Œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • startTime โ€” ํ•„์ˆ˜ ๋ผ๋ฒจ Now(): ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ int ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. 0 - ์‹คํ–‰ ์‹œ์ž‘. ์ด๋Š” ๊ธฐ๋ก์˜ ์—ฐ๋Œ€๋‚˜ ๋ถ„์ˆ˜ ๋‚ ์งœ LineTime๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • endTime โ€” ์„ ํƒ ์‚ฌํ•ญ Now() ์ข…๋ฃŒ ๋ผ๋ฒจ. ์ƒ๋žต๋˜๊ฑฐ๋‚˜ ์–‘์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜„์žฌ ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์–‘์˜ ๊ฒฝ๊ณ„๋Š” ์—ญ์ˆœ์œผ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ž˜ ๊ฒฝ๊ณ„๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • limit - ์„ ํƒ์ ์ธ ๋„ค ๋ฒˆ์งธ ์ธ์ˆ˜: -1 - ์ œํ•œ์ด ์—†์œผ๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–‘์ˆ˜ โ€” ๊ฐ„๊ฒฉ์˜ ์ตœ๋Œ€ ์ค„, ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. 0 ๋ฐ -1๋ฅผ ์ œ์™ธํ•œ ์Œ์ˆ˜ ๊ฐ’ - ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0 โ€“ ์ ํ•ฉํ•œ ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–‘์ˆ˜๋Š” 1๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ „์ฒด ๋กœ๊ทธ์˜ ๋๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์น˜ํ•˜๋Š” ์ˆซ์ž๋‚˜ ํŒจํ„ด ๋Œ€์ฒด ์ˆซ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0 ์ธ๋ฑ์Šค์—๋Š” LineIndex/GetFoundedTextIndex์„ ์‚ฌ์šฉํ•˜๊ณ , ์ผ์น˜ ๊ฐœ์ˆ˜์—๋Š” LineCount๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋Œ€์ฒด ์ˆซ์ž์—๋Š” GetFoundedTextID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ์ƒˆ ๋ฉ”์‹œ์ง€๋กœ ์ธํ•ด ์ƒ‰์ธ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ ํƒํ•œ ๊ธฐ๋ก์˜ ์ €์žฅ๋œ ํ•„๋“œ๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ๋‘๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๊ฒฉ์„ ๊ณ„์‚ฐํ•ด๋„ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์—์„œ๋Š” ์ „์ฒด ๋ ˆ์ด๋ธ”์„ Now()์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. LineTime๋Š” ๋‹ค๋ฅธ ๋‹จ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ: .

Now()๋Š” ํ˜„์žฌ ์‹คํ–‰์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊ทธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋™์ผํ•œ ๊ธฐ๋ณธ ์‹œ๊ณ„์˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. Environment.TickCount, Unix ์‹œ๊ฐ„ ๋˜๋Š” ์ž์‹ ์˜ ์Šคํ†ฑ์›Œ์น˜๋กœ ๋ฐ”๊พธ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ .cs/.csproj ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ „๋‹ฌ๋œ CSharpScriptGlobals์—์„œ context.Now()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ์ž‘์—… ํ›„ ๋ฉ”์‹œ์ง€ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์‹œ์ž‘๋œ ๋‚ด์šฉ์€ 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 โ€” ์‹คํ–‰ ์‹œ์ž‘; ์ข…๋ฃŒ โ€” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ €์žฅ๋œ ์ข…๋ฃŒ ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
  • ์ข…๋ฃŒ๋œ ์ดํ›„์˜ ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ด์ „์˜ ์˜ค๋ž˜๋œ ๋ ˆ์ฝ”๋“œ๋„ ๊ฐ„๊ฒฉ์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var ended = Now();
    var found = UO.InJournalBetweenTimes("notice", 0, ended);
    UO.Print("Search result: " + Convert.ToString(found));
    return null;
}

3. ๊ฐ„๊ฒฉ ๋ฐ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋Œ€์•ˆ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋งˆ์ง€๋ง‰ -1์€ ์ค„ ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ง€์—ฐ์ด ์•„๋‹Œ ์ข…๋ฃŒ ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ ID: ์„ฑ๊ณต์˜ ๊ฒฝ์šฐ 0, ์‹คํŒจ์˜ ๊ฒฝ์šฐ 1. ๋ฐœ๊ฒฌ ํ™•์ธ > 0๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
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.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();
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.InJournalBetweenTimes(pattern, startTime) โ€” UO.InJournalBetweenTimes(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "injournalbetweentimes":

                    if (arguments.Length > 3)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)));

                    if (arguments.Length > 2)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2)));

                    return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1)));

UO.InJournalBetweenTimes(pattern, startTime) โ€” UO.InJournalBetweenTimes(String,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int InJournalBetweenTimes(string pattern, int startTime)

            => InJournalBetweenTimesCore(pattern, startTime, CurrentJournalTime(), -1, ignoreCase: false);

UO.InJournalBetweenTimes(pattern, startTime, endTime) โ€” UO.InJournalBetweenTimes(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer), endTime (Any/Integer)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "injournalbetweentimes":

                    if (arguments.Length > 3)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)));

                    if (arguments.Length > 2)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2)));

                    return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1)));

UO.InJournalBetweenTimes(pattern, startTime, endTime) โ€” UO.InJournalBetweenTimes(String,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer), endTime (Any/Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int InJournalBetweenTimes(string pattern, int startTime, int endTime)

            => InJournalBetweenTimesCore(pattern, startTime, endTime, -1, ignoreCase: false);

UO.InJournalBetweenTimes(pattern, startTime, endTime, limit) โ€” UO.InJournalBetweenTimes(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer), endTime (Any/Integer), limit (Any/Integer)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "injournalbetweentimes":

                    if (arguments.Length > 3)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)));

                    if (arguments.Length > 2)

                        return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1), Arg(2)));

                    return new InjectionValue(InJournalBetweenTimes(Text(0), Arg(1)));

UO.InJournalBetweenTimes(pattern, startTime, endTime, limit) โ€” UO.InJournalBetweenTimes(String,Integer,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: pattern (Any/String), startTime (Any/Integer), endTime (Any/Integer), limit (Any/Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int InJournalBetweenTimes(string pattern, int startTime, int endTime, int limit)

            => InJournalBetweenTimesCore(pattern, startTime, endTime,

                limit == -1 ? -1 : Math.Max(0, limit), ignoreCase: limit == -1);

UO.Journal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.Journal(object? index);

ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์ค„์˜ ํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  GetFoundedText/Line*์— ๋Œ€ํ•œ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ 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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋งˆ์ง€๋ง‰ ์ค„๊ณผ ๊ทธ ์ž‘์„ฑ์ž๋Š” ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0๋Š” ์ตœ์‹  ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ํ…์ŠคํŠธ์™€ ์ €์ž๋ฅผ ์ฝ์€ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • Print๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ…์ŠคํŠธ/์ž‘์„ฑ์ž๋Š” ์ด์ „์— ์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
var text = UO.Journal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);

2. ์ด์ „ ์ค„์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 1๋Š” ์ด์ „ ํ•ญ๋ชฉ์ด๊ณ , HighJournal๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.
  • ํ†ตํ™” ๊ฐ„์— ๋กœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐœ๊ฒฌ๋œ ํ–‰์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” GetFoundedText๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    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  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);
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Journal(index) โ€” UO.Journal(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Any/Integer)

๊ฒฐ๊ณผ: string / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "journal": return new InjectionValue(GetJournalText(Arg(0)));

UO.Journal(index) โ€” UO.Journal(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Any/Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string GetJournalText(int index)

        {

            SelectJournalEntry(ReadJournalSnapshot(index));

            return selectedJournalEntry?.Text ?? string.Empty;

        }

UO.JournalColor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.JournalColor(object? index);

์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ํ–‰์˜ hue ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ int - ํ˜„์žฌ ์ƒ‰์ธ: 0๋Š” ์ตœ์‹  ์ค„์„ ์˜๋ฏธํ•˜๊ณ , 1 - ์ด์ „ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial๋„ ์•„๋‹ˆ๊ณ  ํŒจํ„ด์˜ ID ๋ณ€ํ˜•๋„ ์•„๋‹ˆ๋ฉฐ InJournal์˜ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - UO hue 0x0044; ์ƒ‰์ธ 0x0000๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ. ์ด๊ฒƒ์€ RGB์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์น˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Journal(์ƒ‰์ธ)์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ GetFoundedText/Line*์„ ์ž…๋ ฅํ•˜์„ธ์š”. Null ๊ฐ’์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์ž‘์—… ์ „์— ๊ฐ’ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ˜ธ์ถœ ์‹œ ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค„ 0์„ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ๋ช…๋ น์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 value = UO.JournalColor(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.JournalColor(index) โ€” UO.JournalColor(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string JournalColor(int index) => bridge.JournalColor(index);

UO.JournalSerial

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.JournalSerial(object? index);

์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ํ–‰์˜ serial ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ int - ํ˜„์žฌ ์ƒ‰์ธ: 0๋Š” ์ตœ์‹  ์ค„์„ ์˜๋ฏธํ•˜๊ณ , 1 - ์ด์ „ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial๋„ ์•„๋‹ˆ๊ณ  ํŒจํ„ด์˜ ID ๋ณ€ํ˜•๋„ ์•„๋‹ˆ๋ฉฐ InJournal์˜ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - serial ์ €์ž์˜ 0x00001234; ์ƒ‰์ธ 0x00000000์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์น˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Journal(์ƒ‰์ธ)์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ GetFoundedText/Line*์„ ์ž…๋ ฅํ•˜์„ธ์š”. Null ๊ฐ’์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์ž‘์—… ์ „์— ๊ฐ’ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ˜ธ์ถœ ์‹œ ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค„ 0์„ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ๋ช…๋ น์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 value = UO.JournalSerial(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.JournalSerial(index) โ€” UO.JournalSerial(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string JournalSerial(int index) => bridge.JournalSerial(index);

UO.JournalTimer

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.JournalTimer(object? index);

์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ํ–‰์˜ ํƒ€์ž„์Šคํƒฌํ”„ ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index - ํ•„์ˆ˜ int - ํ˜„์žฌ ์ƒ‰์ธ: 0๋Š” ์ตœ์‹  ์ค„์„ ์˜๋ฏธํ•˜๊ณ , 1 - ์ด์ „ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial๋„ ์•„๋‹ˆ๊ณ  ํŒจํ„ด์˜ ID ๋ณ€ํ˜•๋„ ์•„๋‹ˆ๋ฉฐ InJournal์˜ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋กํ•˜๋ฉฐ Now()์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. 0 ๋Ÿฐํƒ€์ž„ ์ „ ๋…นํ™”์šฉ; -1: ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค/์‹œ๊ฐ„. ์ด๊ฒƒ์€ ๊ธฐ๋ก์˜ ๋‚˜์ด๋„ ์•„๋‹ˆ๊ณ  10๋ถ„์˜ 1์ดˆ UO.Timer()๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์ผ์น˜ํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Journal(์ƒ‰์ธ)์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ GetFoundedText/Line*์„ ์ž…๋ ฅํ•˜์„ธ์š”. Null ๊ฐ’์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ์ƒˆ ๋ ˆ์ฝ”๋“œ ํ•„๋“œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0๋Š” ์ƒˆ ์ค„์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ๋ฒ„ํผ์˜ ์กด์žฌ๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋กํ•˜๋ฉฐ Now()์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. 0 ๋Ÿฐํƒ€์ž„ ์ „ ๋…นํ™”์šฉ; -1: ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค/์‹œ๊ฐ„. ์ด๊ฒƒ์€ ๊ธฐ๋ก์˜ ๋‚˜์ด๋„ ์•„๋‹ˆ๊ณ  10๋ถ„์˜ 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  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์ž‘์—… ์ „์— ๊ฐ’ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ˜ธ์ถœ ์‹œ ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ค„ 0์„ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ๋ช…๋ น์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 value = UO.JournalTimer(0);
        UO.Wait(100);
        UO.Print("Saved value: " + Convert.ToString(value));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.JournalTimer(index) โ€” UO.JournalTimer(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int JournalTimer(int index) => JournalEntryTime(index);

UO.LastJournalMessage

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LastJournalMessage();

์ตœ์‹  ๋กœ์ปฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์ƒˆ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•ญ๋ชฉ ์ž์ฒด์— ๋นˆ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Journal(0)๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ Line* ์„ ํƒ ๋ฐ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์™€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์€ ์ตœ์‹  ํ•ญ๋ชฉ์„ ์ฝ์„ ๋•Œ๊นŒ์ง€ ์ €์žฅ๋˜๋ฏ€๋กœ ์ƒˆ ์„ ํƒ ํ•ญ๋ชฉ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€๋Š” ๋ฐœ๊ฒฌ๋œ ๋ฉ”์‹œ์ง€์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ > 0๋Š” ๊ฒ€์ƒ‰ ์„ฑ๊ณต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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 found = UO.InJournal("needle");
        var matched = UO.GetFoundedText();
        var latest = UO.LastJournalMessage();
        UO.Print("Found: " + matched);
        UO.Print("Latest: " + latest);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LastJournalMessage() โ€” UO.LastJournalMessage()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "lastjournalmessage": return new InjectionValue(GetJournalText(0));

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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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  RunScenario();
 object? RunScenario()
{
    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. ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์™€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์€ ์ตœ์‹  ํ•ญ๋ชฉ์„ ์ฝ์„ ๋•Œ๊นŒ์ง€ ์ €์žฅ๋˜๋ฏ€๋กœ ์ƒˆ ์„ ํƒ ํ•ญ๋ชฉ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€๋Š” ๋ฐœ๊ฒฌ๋œ ๋ฉ”์‹œ์ง€์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ > 0๋Š” ๊ฒ€์ƒ‰ ์„ฑ๊ณต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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 found = UO.InJournal("needle");
        var matched = UO.GetFoundedText();
        var latest = UO.LastMessage();
        UO.Print("Found: " + matched);
        UO.Print("Latest: " + latest);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LastMessage() โ€” UO.LastMessage()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public string LastMessage() => bridge.LastMessage();

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 ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๋ชจ๋“  ์ผ์น˜ ํ•ญ๋ชฉ์€ ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ฌด์ œํ•œ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋“ฑ๋กํ•˜์„ธ์š”. ๋ผ์ธ ๋‚ด์˜ ๊ด‘์„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ธ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ โ€” ์œ„์น˜ ๋”ํ•˜๊ธฐ 1; ์ผ์น˜ - ๋ณ„๋„์˜ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค.
var result = UO.InJournal("ore", -1);
var matches = UO.LineCount();
UO.Print(Convert.ToString(matches));

2. ๋งˆ์ง€๋ง‰ 10์ค„ ๊ฐ„์˜ ์ผ์น˜ ํ•ญ๋ชฉ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 10 โ€” ํ™•์ธํ•  ์ตœ๋Œ€ ์ค„; ๊ฒฝ์šฐ๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ ์ผ์น˜ ํ•ญ๋ชฉ์ด ๋” ๋งŽ๋”๋ผ๋„ ๊ฐœ์ˆ˜์˜ ๋ฒ”์œ„๋Š” 0๋ถ€ํ„ฐ 10๊นŒ์ง€์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var result = UO.InJournal("ore", 10);
    UO.Print(Convert.ToString(UO.LineCount()));
    return null;
}

3. ์กฐ๊ธฐ ์™„๋ฃŒ ๊ฒ€์ƒ‰ - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • serial/color=-1, time=0/0 โ€” ํ•„ํ„ฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. true ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ์ค„์—์„œ ๊ฒ€์ƒ‰์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • checkedMatches๋Š” 0 ๋˜๋Š” 1์™€ ๋™์ผํ•˜๋ฉฐ ์ „์ฒด ๋กœ๊ทธ์˜ ์ด ์ผ์น˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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 result = UO.InJournal("ore", -1, -1, 0, 0, true, false);
        var checkedMatches = UO.LineCount();
        UO.Print(Convert.ToString(checkedMatches));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineCount() โ€” UO.LineCount()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linecount": return new InjectionValue(bridge.JournalMatchCount());

UO.LineID

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineID();

์„ ํƒํ•œ ์ €๋„ ํ•ญ๋ชฉ์˜ ์ €์ž์˜ ์ˆซ์ž serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ์ž‘์„ฑ์ž์˜ 32๋น„ํŠธ serial. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 0. ์ตœ์ƒ์œ„ ๋น„ํŠธ๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š” int๋กœ ์ธํ•ด ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetFoundedTextSerial๋Š” ์ „์ฒด 16์ง„์ˆ˜ ํ‘œํ˜„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • int - ์ž‘์„ฑ์ž์˜ 32๋น„ํŠธ serial. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - 0. ์ตœ์ƒ์œ„ ๋น„ํŠธ๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š” int๋กœ ์ธํ•ด ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetFoundedTextSerial๋Š” ์ „์ฒด 16์ง„์ˆ˜ ํ‘œํ˜„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineID() โ€” UO.LineID()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "lineid": return new InjectionValue(selectedJournalEntry?.Serial ?? 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๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ €์žฅ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ID; ํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ GetFoundedText๊ฐ€ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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)์€ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ์—์„œ ๋นˆ ๋กœ๊ทธ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ํšจํ•œ ํ•ญ๋ชฉ์—๋Š” ๋นˆ ํ…์ŠคํŠธ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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 ms ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์ฐพ์€ ํ›„.
  • ์ œ๊ฑฐ๋˜๋ฉด ์ดํ›„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ -1๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetFoundedText์—๋Š” ์—ฌ์ „ํžˆ ์ €์žฅ๋œ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineIndex() โ€” UO.LineIndex()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "lineindex": return new InjectionValue(GetFoundedTextIndex());

UO.LineMsgType

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineMsgType();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ์ฝ”๋“œ MessageType: 0 ์ผ๋ฐ˜, 1 ์‹œ์Šคํ…œ, 2 ๊ฐ์ • ํ‘œํ˜„, 3 Limit3Spell, 6 ๋ผ๋ฒจ, 7 ์ง‘์ค‘, 8 ์†์‚ญ์ž„, 9 ์†Œ๋ฆฌ ์ง€๋ฅด๊ธฐ, 10 ์ฃผ๋ฌธ, 13 ๊ธธ๋“œ, 14 ๋™๋งน, 15 ๋ช…๋ น, 16 GmChat, 192 ์ธ์ฝ”๋”ฉ, 255 ํŒŒํ‹ฐ. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. ์ด๋Š” ํด๋ž˜์‹ ์ฝ”๋“œ UO์ž…๋‹ˆ๋‹ค. ํƒ€์‚ฌ ์˜ˆ์ œ์™€ ๋‹ค๋ฅธ ์ˆซ์ž๋กœ ๋ฐ”๊พธ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • int - ์ฝ”๋“œ MessageType: 0 ์ผ๋ฐ˜, 1 ์‹œ์Šคํ…œ, 2 ๊ฐ์ • ํ‘œํ˜„, 3 Limit3Spell, 6 ๋ผ๋ฒจ, 7 ์ง‘์ค‘, 8 ์†์‚ญ์ž„, 9 ์†Œ๋ฆฌ ์ง€๋ฅด๊ธฐ, 10 ์ฃผ๋ฌธ, 13 ๊ธธ๋“œ, 14 ๋™๋งน, 15 ๋ช…๋ น, 16 GmChat, 192 ์ธ์ฝ”๋”ฉ, 255 ํŒŒํ‹ฐ. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. ์ด๋Š” ํด๋ž˜์‹ ์ฝ”๋“œ 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineMsgType() โ€” UO.LineMsgType()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linemsgtype": return new InjectionValue(selectedJournalEntry?.MessageType ?? 0);

UO.LineName

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineName();

์„ ํƒํ•œ ๋ถ„๊ฐœ ํ•ญ๋ชฉ์˜ ์ €์ž ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ ์ž‘์„ฑ์ž ์ด๋ฆ„(์˜ˆ: ์‹œ์Šคํ…œ ์ด๋ฆ„ ๋˜๋Š” ์บ๋ฆญํ„ฐ ์ด๋ฆ„) ์„ ํƒ ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ์ด๋ฆ„์ด ์—†๋Š” ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์บ๋ฆญํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • string โ€” ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ ์ž‘์„ฑ์ž ์ด๋ฆ„(์˜ˆ: ์‹œ์Šคํ…œ ์ด๋ฆ„ ๋˜๋Š” ์บ๋ฆญํ„ฐ ์ด๋ฆ„) ์„ ํƒ ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ์ด๋ฆ„์ด ์—†๋Š” ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์บ๋ฆญํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineName() โ€” UO.LineName()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linename": return new InjectionValue(selectedJournalEntry?.Name ?? string.Empty);

UO.LineTextColor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineTextColor();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ์ˆซ์ž ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ UO hue(0โ€ฆ65535); ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. 0์€ ์ƒ‰์ƒ์œผ๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž์˜ RGB ๋˜๋Š” ID๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • int - ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ UO hue(0โ€ฆ65535); ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineTextColor() โ€” UO.LineTextColor()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linetextcolor":

                    return new InjectionValue(selectedJournalEntry?.Color ?? 0);

UO.LineTextFont

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineTextFont();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๊ธ€๊ผด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์„ ํƒํ•œ ๋ ˆ์ฝ”๋“œ์˜ UO ๊ธ€๊ผด ID(ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” 0โ€ฆ255); ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. IDE ๊ธ€๊ผด ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ID ๊ฒŒ์ž„ ๊ธ€๊ผด์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • int โ€” ์„ ํƒํ•œ ๋ ˆ์ฝ”๋“œ์˜ UO ๊ธ€๊ผด ID(ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” 0โ€ฆ255); ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. IDE ๊ธ€๊ผด ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ID ๊ฒŒ์ž„ ๊ธ€๊ผด์ž…๋‹ˆ๋‹ค.
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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineTextFont() โ€” UO.LineTextFont()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linetextfont": return new InjectionValue(selectedJournalEntry?.Font ?? 0);

UO.LineTime

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LineTime();

์„ ํƒํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋‹ฌ๋ ฅ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

double โ€” OLE ์ž๋™ํ™” Date, 30.12.1899์˜ ์ผ์ˆ˜, ์†Œ์ˆ˜ ๋ถ€๋ถ„์€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. Now() ๋ฐ€๋ฆฌ์ดˆ๋„ ์•„๋‹ˆ๊ณ  ์ „์ฒด Unix ํƒ€์ž„์Šคํƒฌํ”„๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‘ ํ‘œ์‹œ์˜ ์ฐจ์ด์— ๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ 86400000๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰ ๋ฐ Journal/GetJournal/LastJournalMessage๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์‹œ์ง€๋Š” ์ด ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ €๋„์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์œ ์ง€๋œ ํ•„๋“œ๋Š” ์œ ์ง€๋˜์ง€๋งŒ LineIndex/GetFoundedTextIndex๋Š” -1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒ€์ƒ‰, ์ž˜๋ชป๋œ ์ƒ‰์ธ ๋ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‚ญ์ œ๋Š” ์„ ํƒ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Getter๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. Getter๋Š” ๊ฒ€์ƒ‰์ด ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • double โ€” OLE ์ž๋™ํ™” Date, 30.12.1899์˜ ์ผ์ˆ˜, ์†Œ์ˆ˜ ๋ถ€๋ถ„์€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค 0. Now() ๋ฐ€๋ฆฌ์ดˆ๋„ ์•„๋‹ˆ๊ณ  ์ „์ฒด Unix ํƒ€์ž„์Šคํƒฌํ”„๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‘ ํ‘œ์‹œ์˜ ์ฐจ์ด์— ๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineTime() โ€” UO.LineTime()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linetime": return new InjectionValue(selectedJournalEntry?.Timestamp ?? 0d);

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๋Š” ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Null/๋นˆ ๊ฐ’์€ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

1. ๊ฒ€์ƒ‰ ํ›„ ํ•„๋“œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ†ต์ง€ โ€” ๊ฒ€์ƒ‰๋œ ํ…์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. 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)๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์™€ ๊ฐ’์€ Print๊นŒ์ง€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€์™€ ์œ ํšจํ•œ null ๋˜๋Š” ๋นˆ ํ•„๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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. ๋‹ค์Œ ์กฐํšŒ ์ „์— ํ•„๋“œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ฑ๊ณต์„ ์„ ํƒํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์—์„œ๋Š” ์„ ํƒ ํ•ญ๋ชฉ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ•ญ๋ชฉ์—๋Š” ์ด๋ฏธ ํ•„์ˆ˜ ํ•„๋“œ์˜ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ var๋Š” ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LineType() โ€” UO.LineType()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "linetype": return new InjectionValue(selectedJournalEntry?.TextType ?? 0);

UO.LowJournal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.LowJournal();

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๋กœ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: -1 ๋งค๊ฑฐ์ง„์ด ๋น„์–ด ์žˆ์„ ๋•Œ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ์‹  ๋ ˆ์ฝ”๋“œ์˜ ์ƒ‰์ธ์ž…๋‹ˆ๋‹ค. Journal/GetJournal ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ ์ด์ „ ๋ ˆ์ฝ”๋“œ๊นŒ์ง€ 0 ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ InJournal๋Š” ๋‹ค๋ฅธ ๋‹จ์ผ ์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€์™€ ์ •๋ฆฌ๋Š” ๊ฒฝ๊ณ„๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆœ์„œ๋Š” ์‹ ๊ธฐ๋ก๋ถ€ํ„ฐ ๊ตฌ๊ธฐ๋ก ์ˆœ์œผ๋กœ Journal(0) ์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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. ๊ฒฝ๊ณ„์—์„œ ๋ผ์ธ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ๋ฑ์Šค๋Š” 1์„ ๋นผ์ง€ ์•Š๊ณ  Journal์— ์ง์ ‘ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ์€ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ๋Š” ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ณ ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    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  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()
    {
        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;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LowJournal() โ€” UO.LowJournal()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "lowjournal": return new InjectionValue(bridge.JournalEntryCount() == 0 ? -1 : 0);

UO.SetJournalLine

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.SetJournalLine(object? index);
void UO.SetJournalLine(object? stringIndex, object? text);

์ค„์˜ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์€ ๊ฒ€์ƒ‰์˜ ํ•˜ํ•œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • index โ€” ์–‘์‹(์ƒ‰์ธ,ํ…์ŠคํŠธ)์˜ ๊ฒฝ์šฐ: 0์˜ ํ˜„์žฌ ์ƒ‰์ธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 0์€ ์ƒˆ ์ค„์ž…๋‹ˆ๋‹ค. ํ˜•์‹(์ƒ‰์ธ)์˜ ๊ฒฝ์šฐ: ๋‚ด๋ถ€ ๋ฒ„ํผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๊ฑด๋„ˆ๋›ด ์ด์ „ ์ค„ ์ˆ˜, ์ƒ‰์ธ Journal ์•„๋‹˜; 0๋Š” ์ œํ•œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๋‹จ์ผ ์ธ์ˆ˜ ๋ฒ”์œ„๋Š” 0๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • stringIndex โ€” ํ˜ธํ™˜๋˜๋Š” ๋‘ ์ธ์ˆ˜ ๋กœ๊น…์˜ ์ธ๋ฑ์Šค ์ด๋ฆ„: 0์˜ ํ˜„์žฌ ์ธ๋ฑ์Šค Journal.
  • text โ€” ๋นˆ ์ค„์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ์กด ์ค„์˜ ์ƒˆ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๋Œ€์ฒด ์–‘์‹์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘ ์ธ์ˆ˜ ํ˜•์‹์€ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์€ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ต์ฒด๋Š” ๋กœ์ปฌ์ด๋ฉฐ ์„œ๋ฒ„๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž/์‹œ๊ฐ„ ํ•„๋“œ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ ํƒ๋œ ํ…์ŠคํŠธ ์Šค๋ƒ…์ƒท์€ Journal ๋˜๋Š” ๊ฒ€์ƒ‰์ด ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์ธ์ˆ˜ ๊ฒฝ๊ณ„๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„ํผ์˜ ์ด์ „ ํ–‰ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์ถ•์ถœ/์‚ญ์ œ๋˜๋ฉด ๊ทธ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ž‘์—… ๊ฐ„์˜ ์•ˆ์ •์ ์ธ ๊ฒฝ๊ณ„๋ฅผ ์œ„ํ•ด Now()์™€ ํ•จ๊ป˜ InJournalBetweenTimes๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ 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. ํ…์ŠคํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ์ค„์€ ํ…์ŠคํŠธ๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋งŒ ํ•ญ๋ชฉ์ด๋‚˜ ์ž‘์„ฑ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ text=""์ธ ๊ฒฝ์šฐ์—๋„ true์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetJournalLine(0, "");
    var text = UO.Journal(0);
    var exists = UO.LineIndex() >= 0;
    UO.Print(Convert.ToString(exists));
    return null;
}

3. ๊ฒ€์ƒ‰ ์ œํ•œ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•œ ๊ฐ€์ง€ ์ธ์ˆ˜ 0๋Š” ์ด์ „ ์ค„์„ ๊ฑด๋„ˆ๋›ฐ์ง€ ๋ง๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ช…๋ น์ด๋‹ค.
  • ์ œํ•œ ์—†์ด ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์–‘์‹์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” ํ…์ŠคํŠธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
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()
    {
        UO.SetJournalLine(0);
        var found = UO.InJournal("notice", -1);
        UO.Print(Convert.ToString(found));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SetJournalLine(index) โ€” UO.SetJournalLine(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: index (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void SetJournalLine(int index) => bridge.SetJournalLine(index);

UO.SetJournalLine(stringIndex, text) โ€” UO.SetJournalLine(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: stringIndex (Any/Integer), text (Any/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "setjournalline":

                    if (arguments.Length > 1) bridge.SetJournalLine(Arg(0), Text(1));

                    else bridge.SetJournalLine(Arg(0));

                    return InjectionValue.Unit;

UO.SetJournalLine(stringIndex, text) โ€” UO.SetJournalLine(Integer,String)

๋งค๊ฐœ๋ณ€์ˆ˜: stringIndex (Any/Integer), text (Any/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void SetJournalLine(int index, string text) => bridge.SetJournalLine(index, text);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ