KO UO Topic journal - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท 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 |
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
UO.WaitJournalLine ยท UO.WaitJournalLineSystem ยท UO.WaitingForJournalText
UO.AddToSystemJournal ยท UO.AddToSystemJournalEx ยท UO.ClearSystemJournal
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
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddJournalIgnore(object? str);ClassicUO ๊ฒ์ ๋ก๊ทธ ํญ๋ชฉ์ ๋ํ ๋ก์ปฌ ํ ์คํธ ํํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
-
str- ์ ๋ ํญ๋ชฉ์ ํ ์คํธ์์ ๊ฒ์ํ ๋น์ด ์์ง ์์ ํ ์คํธ ์กฐ๊ฐ์ ๋๋ค.
void. ์ด ๋ช
๋ น์ ์ผ์น ํญ๋ชฉ ์๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
- ํ
์คํธ๊ฐ ๊ฐ์ฅ์๋ฆฌ์์ ์๋ฆฝ๋๋ค. ๋น ์ค์ด ์ถ๊ฐ๋์ง ์์ต๋๋ค. ๋ ์ฝ๋๋ฅผ ํ์ธํ ๋ ํ์ ๋ฌธ์์ด ๊ฒ์์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ์ํ๋ฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ ๋ก์ปฌ๋ก ์จ๊ฒจ์ง๋๋ค. ์๋ฒ๊ฐ ํํฐ๋ฅผ ๋ฐ์ง ๋ชปํฉ๋๋ค.
UO.ClearJournalIgnore()์ถ๊ฐ๋ ๋ชจ๋ ํ ์คํธ ํํฐ๋ฅผ ์ง์๋๋ค. ์ด๋ฏธ ํ์๋ ํญ๋ชฉ์ ์ง์๋ ๋ณต์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddJournalIgnore");
UO.AddJournalIgnore("You see");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ๋ฌธ๊ตฌ๊ฐ ํฌํจ๋ ์ ๊ฒ์๋ฌผ์ ์จ๊น๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: str (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AddJournalIgnore:bridge.AddJournalIgnore(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addjournalignore": bridge.AddJournalIgnore(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddToJournal(object? text);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์ด ์คํฌ๋ฆฝํธ ๋ฐํ์์ ์์คํ ๋ฉ์์ง ์์์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ฒ์์๋ 0x0440, ๋ณ๊ฒฝ๋จ UO.ConColor. ์ด๊ฒ์ ๋ก์ปฌ ํญ๋ชฉ์ ๋๋ค. ๋ช ๋ น ์ด๋ฆ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddToJournal");
UO.AddToJournal("Script started");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.AddToJournal("Processed item entries: " + Convert.ToString(processed));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ ์ฝ์ด์ต๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addtojournal":
case "addtosystemjournal":
case "clientprint":
SystemMessage(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddToSystemJournal(object? text);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์ด ์คํฌ๋ฆฝํธ ๋ฐํ์์ ์์คํ ๋ฉ์์ง ์์์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ฒ์์๋ 0x0440, ๋ณ๊ฒฝ๋จ UO.ConColor. ์ด๊ฒ์ ๋ก์ปฌ ํญ๋ชฉ์ ๋๋ค. ๋ช ๋ น ์ด๋ฆ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddToSystemJournal");
UO.AddToSystemJournal("Script started");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.AddToSystemJournal("Processed item entries: " + Convert.ToString(processed));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ ์ฝ์ด์ต๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addtojournal":
case "addtosystemjournal":
case "clientprint":
SystemMessage(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddToSystemJournalEx");
UO.AddToSystemJournalEx("Route started", 0xFF8800, -1, 12, "Consolas");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฃผํฉ์ ๋ฉ์์ง, ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ - 1, ํฌ๊ธฐ 12: ๊ฒ์ ๊ธ๊ผด์ด 4๊ฐ ๋ฉ๋๋ค. Consolas๋ IDE ์ ๋ณด์ ์ ์ฅ๋ฉ๋๋ค. ๊ฒ์ ํ๋ ํธ๋ก ์ธํด ์์์ด ์ ํํ RGB์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
UO.AddToSystemJournalEx("Route started", 0xFF8800, -1, 12, "Consolas");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x112233์ ์์ BGColor ๊ฐ์ IDE์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ฒญ์ ์ ์ฅํฉ๋๋ค. FontSize=0 10๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๋น FontName๊ฐ Consolas๊ฐ ๋ฉ๋๋ค. ๊ฒ์ ์ฐฝ์์๋ ์ด ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋ฐฐ๊ฒฝ์ด ์น ํด์ง์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AddToSystemJournalEx("Formatting details", 0x33AAFF, 0x112233, 0, "");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PrintFormattedJournal:bridge.PrintFormattedJournal(Text(0), Arg(1), Arg(2), Arg(3), Text(4)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addtosystemjournalex":
bridge.PrintFormattedJournal(Text(0), Arg(1), Arg(2), Arg(3), Text(4)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ChangeJournalLength(object? newLength);์ ์ง๋๋ ํด๋ผ์ด์ธํธ ๋ก๊ทธ ๊ธฐ๋ก ์ ํ์ ๋ณ๊ฒฝํฉ๋๋ค.
-
newLengthโ int๋ก ๋ณํํ ๋ ์ฝ๋ ์. ๋ฐํ์ ์ ํ์ 1๊น์ง์ ๋๋ค. JournalManager ์์ ์์ ํ๊ณ.MAX_JOURNAL_HISTORY_COUNT.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค.JournalLength, ๊ทธ๋ฐ ๋ค์ SetJournalLength๋ฅผ ํธ์ถํฉ๋๋ค. JournalManager๋ ๊ฐ์ฅ ์ค๋๋ ํญ๋ชฉ์ ์๋ก์ด ์ ํ์ผ๋ก ์ ๊ฑฐํ์ฌ ๊ธฐ์กด ๊ธฐ๋ก์ ์ค์ ๋๋ค. ํํฐ๋ง๋ ํญ๋ชฉ๊ณผ ๋ก๊ทธ ํ์๋ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ChangeJournalLength");
UO.ChangeJournalLength(100);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ก์ด ์ ํ์ ์ ์ฅ๋๋ ๋ ์ฝ๋ ์๋ฅผ ์ ํํฉ๋๋ค.
UO.ChangeJournalLength(100);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ์ด ์ค์ด๋ค๋ฉด ์ค๋๋ ํญ๋ชฉ์ด ์ญ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ChangeJournalLength(1);
return 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: newLength (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, 100). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetJournalLength:bridge.SetJournalLength(state.JournalLength).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "changejournallength": state.JournalLength = Math.Max(1, Arg(0, 100)); bridge.SetJournalLength(state.JournalLength); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearJournal();๊ณต์ ๋ก์ปฌ ๋ก๊ทธ์์ ์ค์ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ์ญ์ ๋ ํ ์๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ์ ์ค ํ์ ์นด์ดํฐ์ ํ์ฌ ์คํฌ๋ฆฝํธ ์ ํ์ด ์ฌ์ค์ ๋ฉ๋๋ค.
- ๊ณต์ ๋ฒํผ๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ญ์ ๋ ์ค์ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ์ด์ ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํด ์ ์ฅ๋ ์ค๋ ์ท์ ๋จ์ ์์ ์ ์์ง๋ง ํด๋น ์ธ๋ฑ์ค๋ -1๊ฐ ๋ฉ๋๋ค.
- ํ ์คํธ ํํฐ๊ฐ ์์ผ๋ฉด ์์คํ ์ ํฌํจํ์ฌ ์ ์ฒด Classic UO ๋ฒํผ๊ฐ ์ง์์ง๋๋ค. ๋ก์ปฌ ๋ก๊ทธ ํ์ผ๊ณผ ์๋ฒ ๋ฉ์์ง๋ ์ญ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearJournal");
UO.ClearJournal();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ๊ณต์ ๋ฒํผ์ ๋ชจ๋ ๋ผ์ธ์ด ์ญ์ ๋ฉ๋๋ค.
- ๋ง์ง๋ง ๊ฒ์ ์นด์ดํฐ๋ 0๊ฐ ๋ฉ๋๋ค. Print๋ ์ญ์ ํ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
UO.ClearJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์์คํฌํ๊ฐ ์ ์ฅ๋๊ธฐ ์ ์ ์ง์์ง๋๋ค. 1000 - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋๊ธฐ๊ฐ ์ ํ๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํ์์คํฌํ๋ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์ ์ธํ๋ ๋ฐ ์ถฉ๋ถํฉ๋๋ค. ์ ๋ฆฌ๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClearJournal();
var started = Now();
var found = UO.WaitJournalLine(started, "notice", 1000);
UO.Print(Convert.ToString(found));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์คํฌ๋ฆฝํธ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.DeleteJournal:DeleteJournal().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearjournal": DeleteJournal(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearJournalIgnore();๋ชจ๋ ํ ์คํธ ํํฐ JournalManager๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ํํฐ๋ฅผ ์ ๊ฑฐํด๋ ๊ธฐ๋ก์ด ์ญ์ ๋๊ฑฐ๋ AddChatUserIgnore ์ด๋ฆ ํํฐ๊ฐ ์ทจ์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearJournalIgnore");
UO.ClearJournalIgnore();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ํ ์คํธ ํํฐ JournalManager๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
UO.ClearJournalIgnore();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- You see ํ ์คํธ๊ฐ ๋ค์ ํ์๋๋๋ก ํ์ฉํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AddJournalIgnore("You see");
UO.ClearJournalIgnore();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ์ธํธ๋ฅผ ์ง์ฐ๋ ๊ฒ์ ํ์ฉ๋๋ฉฐ ์ ์ค์ ์ ์์ฑํ์ง ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearJournalIgnore:bridge.ClearJournalIgnore().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearjournalignore": bridge.ClearJournalIgnore(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearSystemJournal();์์ฑ์ ์ด๋ฆ์ด System์ธ ์ค์ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ์ญ์ ๋ ํ ์๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ์ ์ค ํ์ ์นด์ดํฐ์ ํ์ฌ ์คํฌ๋ฆฝํธ ์ ํ์ด ์ฌ์ค์ ๋ฉ๋๋ค.
- ๊ณต์ ๋ฒํผ๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ญ์ ๋ ์ค์ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ์ด์ ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํด ์ ์ฅ๋ ์ค๋ ์ท์ ๋จ์ ์์ ์ ์์ง๋ง ํด๋น ์ธ๋ฑ์ค๋ -1๊ฐ ๋ฉ๋๋ค.
- ์์คํ ์ ์์ฑ์ ์ด๋ฆ์ผ๋ก ์ธ์๋๋ฉฐ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ClassicUO ์ผ๋ฐ ์ ๋ ํํฐ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearSystemJournal");
UO.ClearSystemJournal();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ์์คํ ํ๋ง ์ ๊ฑฐ๋ฉ๋๋ค.
- ๋ง์ง๋ง ๊ฒ์ ์นด์ดํฐ๋ 0๊ฐ ๋ฉ๋๋ค. Print๋ ์ญ์ ํ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
UO.ClearSystemJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์์คํฌํ๊ฐ ์ ์ฅ๋๊ธฐ ์ ์ ์ง์์ง๋๋ค. 1000 - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋๊ธฐ๊ฐ ์ ํ๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํ์์คํฌํ๋ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์ ์ธํ๋ ๋ฐ ์ถฉ๋ถํฉ๋๋ค. ์ ๋ฆฌ๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClearSystemJournal();
var started = Now();
var found = UO.WaitJournalLine(started, "notice", 1000);
UO.Print(Convert.ToString(found));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์คํฌ๋ฆฝํธ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DeleteSystemJournal:bridge.DeleteSystemJournal(). -
InjectionScript.Runtime.InjectionApiUO.SelectJournalEntry:SelectJournalEntry(null).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearsystemjournal": bridge.DeleteSystemJournal(); SelectJournalEntry(null); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.DeleteJournal();
void UO.DeleteJournal(object? text);๊ณต์ ๋ก์ปฌ ๋ก๊ทธ์์ ์ค์ ์ ๊ฑฐํฉ๋๋ค.
-
textโ |๋ฅผ ํตํด ๊ฒ์๋ ํ์ ๋ฌธ์์ด ๋๋ ์ฌ๋ฌ ๋์(์: ์ฑ๊ณต|์คํจ). ๊ฐ ๋์์ ๊ฐ์ฅ์๋ฆฌ์ ์๋ ๊ณต๋ฐฑ์ ์ ๊ฑฐ๋๊ณ , ๋น ๋์์ ๊ฑด๋๋๋๋ค. ์ด๋ ์ ๊ท์์ด ์๋ ์ผ๋ฐ ํ ์คํธ์ ๋๋ค. ๋น์ด ์์ง ์์ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ธ์. DeleteJournal์๋ง ํด๋นํ๋ ์ ํ ์ฌํญ: ์ ์ก ์ ์ผ์นํ๋ ๋ฌธ์์ด์ด ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ์ ๊ฑฐ๋ฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ์ ์ฒด ๋ฒํผ๊ฐ ์ญ์ ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ์ญ์ ๋ ํ ์๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ์ ์ค ํ์ ์นด์ดํฐ์ ํ์ฌ ์คํฌ๋ฆฝํธ ์ ํ์ด ์ฌ์ค์ ๋ฉ๋๋ค.
- ๊ณต์ ๋ฒํผ๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ญ์ ๋ ์ค์ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ์ด์ ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํด ์ ์ฅ๋ ์ค๋ ์ท์ ๋จ์ ์์ ์ ์์ง๋ง ํด๋น ์ธ๋ฑ์ค๋ -1๊ฐ ๋ฉ๋๋ค.
- ํ ์คํธ ํํฐ๊ฐ ์์ผ๋ฉด ์์คํ ์ ํฌํจํ์ฌ ์ ์ฒด Classic UO ๋ฒํผ๊ฐ ์ง์์ง๋๋ค. ๋ก์ปฌ ๋ก๊ทธ ํ์ผ๊ณผ ์๋ฒ ๋ฉ์์ง๋ ์ญ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.DeleteJournal");
UO.DeleteJournal();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ๊ณต์ ๋ฒํผ์ ๋ชจ๋ ๋ผ์ธ์ด ์ญ์ ๋ฉ๋๋ค.
- ๋ง์ง๋ง ๊ฒ์ ์นด์ดํฐ๋ 0๊ฐ ๋ฉ๋๋ค. Print๋ ์ญ์ ํ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
UO.DeleteJournal();
var count = UO.LineCount();
UO.Print("Search matches after clear: " + Convert.ToString(count));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์์คํฌํ๊ฐ ์ ์ฅ๋๊ธฐ ์ ์ ์ง์์ง๋๋ค. 1000 - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋๊ธฐ๊ฐ ์ ํ๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํ์์คํฌํ๋ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์ ์ธํ๋ ๋ฐ ์ถฉ๋ถํฉ๋๋ค. ์ ๋ฆฌ๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.DeleteJournal();
var started = Now();
var found = UO.WaitJournalLine(started, "notice", 1000);
UO.Print(Convert.ToString(found));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์คํฌ๋ฆฝํธ 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;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- text์๋ ๋ ๊ฐ์ ํ์ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ ์ค ์ด๋ค ์ค์ด๋ผ๋ ๋์๋ฌธ์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ญ์ ๋ฉ๋๋ค. ๋๋จธ์ง ๋ฉ์์ง๋ ๋จ์ ์์ต๋๋ค.
- ์ญ์ ํ ์ผ์นํ๋ ์ ๋ฉ์์ง๊ฐ ์๋ ๊ฒฝ์ฐfound=0์ ๋๋ค. ์ด ๊ตฌํ์ ๋น ํจํด์ ๋ชจ๋ ๋ฌธ์์ด๊ณผ ์ผ์นํฉ๋๋ค.
UO.DeleteJournal("notice|warning");
var found = UO.InJournal("notice|warning", -1);
UO.Print(Convert.ToString(found));C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.DeleteJournal. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DeleteJournal:bridge.DeleteJournal(). -
InjectionScript.Runtime.InjectionApiUO.SelectJournalEntry:SelectJournalEntry(null).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void DeleteJournal()
{
bridge.DeleteJournal();
SelectJournalEntry(null);
}๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.DeleteJournal. -
InjectionScript.Runtime.InjectionApiUO.DeleteJournal:DeleteJournal((string)text).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void DeleteJournal(InjectionValue text) => DeleteJournal((string)text);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ํตํด ๋ณ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.FoundedParamId();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฑ๊ณต์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- -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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "foundedparamid":
return new InjectionValue(foundedTextId >= 0 ? foundedTextId : 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetFoundedText();์ ํํ ๋ก๊ทธ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string - ์ ํํ ํญ๋ชฉ์ ํ ์คํธ์ ๋๋ค. ์ ํ ํญ๋ชฉ์ด ์๋ ๋น ์ค์ ๋๋ค. ๊ธฐ์กด ํญ๋ชฉ์๋ ๊ณต๋ฐฑ ํ ์คํธ๊ฐ ํ์ฉ๋ฉ๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๊ธฐ๋ณธ ๋๋ ํฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedText();
UO.Print("GetFoundedText: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetFoundedText() => selectedJournalEntry?.Text ?? string.Empty;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedTextColor();
UO.Print("GetFoundedTextColor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetFoundedTextColor() => selectedJournalEntry != null ? $"0x{selectedJournalEntry.Color:X4}" : "0x0000";ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ํตํด ๋ณ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedTextID();
UO.Print("GetFoundedTextID: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฑ๊ณต์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- -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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetFoundedTextID() => foundedTextId >= 0 ? foundedTextId : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetFoundedTextIndex();์ ํํ ํญ๋ชฉ์ด ๋ก๊ทธ์ ์์ง ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ ํด๋น ํญ๋ชฉ์ ํ์ฌ ์์ธ์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ 0(์ต์ ํ)์ ํ์ฌ ์ธ๋ฑ์ค์ ๋๋ค. -1๋ ์ ํ์ ์ฌ์ง๊ฐ ์๊ฑฐ๋ ์ ํํ ํญ๋ชฉ์ด ์ด๋ฏธ ์ญ์ /์ ์ ๋์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ InJournal์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค. 1๋ ์์ธ์์ ๋บ ํ์๊ฐ ์์ต๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- ์ธ๋ฑ์ค๋ ๋ ์ฝ๋์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ๊ณ์ฐ๋ฉ๋๋ค. ์๋ก์ด ๋ฉ์์ง๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์ด์ ์ ์ ์ฅ๋ ์ธ๋ฑ์ค๊ฐ ์ผ์ ํ์ง ์์ต๋๋ค ID; ํ ์คํธ์ ๊ฒฝ์ฐ GetFoundedText๊ฐ ๋ ์์ ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedTextIndex();
UO.Print("GetFoundedTextIndex: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetFoundedTextIndex() => selectedJournalEntry != null && bridge is IApiJournalReader reader
? reader.FindJournalEntryIndex(selectedJournalEntry.Identity) : foundedTextIndex;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedTextSerial();
UO.Print("GetFoundedTextSerial: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetFoundedTextSerial() => selectedJournalEntry != null
? $"0x{unchecked((uint)selectedJournalEntry.Serial):X8}" : "0x00000000";ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFoundedTextTimer();
UO.Print("GetFoundedTextTimer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetFoundedTextTimer. -
InjectionScript.Runtime.InjectionApiUO.JournalEntryTime:JournalEntryTime(selectedJournalEntry.Timestamp).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetFoundedTextTimer() => selectedJournalEntry != null ? JournalEntryTime(selectedJournalEntry.Timestamp) : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ; .
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetJournal(0);
UO.Print("GetJournal: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๋ ์ต์ ๋ผ์ธ์ ๋๋ค. ๋จผ์ ํ ์คํธ์ ์ ์๋ฅผ ์ฝ์ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํฉ๋๋ค.
- Print๋ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ์ฅ๋ ํ ์คํธ/์์ฑ์๋ ์ด์ ์ ์ ํํ ํญ๋ชฉ์ ์ฐธ์กฐํฉ๋๋ค.
var text = UO.GetJournal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetJournalText. -
InjectionScript.Runtime.InjectionApiUO.SelectJournalEntry:SelectJournalEntry(ReadJournalSnapshot(index)). -
InjectionScript.Runtime.InjectionApiUO.ReadJournalSnapshot:ReadJournalSnapshot(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetJournalText(int index)
{
SelectJournalEntry(ReadJournalSnapshot(index));
return selectedJournalEntry?.Text ?? string.Empty;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetJournalColor(object? index);์ ํํ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์๋ ํ์ hue ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
index- ํ์ int - ํ์ฌ ์์ธ: 0๋ ์ต์ ์ค์ ์๋ฏธํ๊ณ , 1 - ์ด์ ์ค์ ์๋ฏธํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ด๋๋ฉ๋๋ค. ์ด๋ serial๋ ์๋๊ณ ํจํด์ ID ๋ณํ๋ ์๋๋ฉฐ InJournal์ ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
string - UO hue 0x0044; ์์ธ 0x0000๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ. ์ด๊ฒ์ RGB์ด ์๋๋๋ค.
- ๊ฐ ํธ์ถ์ ํ์ฌ ์์น๋ฅผ ์ฝ์ต๋๋ค. ๋์ผํ ๋ ์ฝ๋์ ์ผ์นํ๋ ํ ์คํธ ๋ฐ ํ๋์ ๊ฒฝ์ฐ ๋จผ์ Journal(์์ธ)์ ์ ๋ ฅํ ๋ค์ GetFoundedText/Line*์ ์ ๋ ฅํ์ธ์. Null ๊ฐ์ ์ค์ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetJournalColor(0);
UO.Print("GetJournalColor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธ์ถ ์ ํ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ณ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ์ค 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.JournalColor. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalColor:bridge.JournalColor(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string JournalColor(int index) => bridge.JournalColor(index);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetJournalSerial(object? index);์ ํํ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์๋ ํ์ serial ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
index- ํ์ int - ํ์ฌ ์์ธ: 0๋ ์ต์ ์ค์ ์๋ฏธํ๊ณ , 1 - ์ด์ ์ค์ ์๋ฏธํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ด๋๋ฉ๋๋ค. ์ด๋ serial๋ ์๋๊ณ ํจํด์ ID ๋ณํ๋ ์๋๋ฉฐ InJournal์ ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
string - serial ์ ์์ 0x00001234; ์์ธ 0x00000000์ด ์๋ชป๋ ๊ฒฝ์ฐ.
- ๊ฐ ํธ์ถ์ ํ์ฌ ์์น๋ฅผ ์ฝ์ต๋๋ค. ๋์ผํ ๋ ์ฝ๋์ ์ผ์นํ๋ ํ ์คํธ ๋ฐ ํ๋์ ๊ฒฝ์ฐ ๋จผ์ Journal(์์ธ)์ ์ ๋ ฅํ ๋ค์ GetFoundedText/Line*์ ์ ๋ ฅํ์ธ์. Null ๊ฐ์ ์ค์ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetJournalSerial(0);
UO.Print("GetJournalSerial: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธ์ถ ์ ํ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ณ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ์ค 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.JournalSerial. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalSerial:bridge.JournalSerial(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string JournalSerial(int index) => bridge.JournalSerial(index);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.HighJournal();์ฌ์ฉ ๊ฐ๋ฅํ ์ต๋ ๋ก๊ทธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int: -1 ๋งค๊ฑฐ์ง์ด ๋น์ด ์์ ๋; ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฅ๋ ๋ ์ฝ๋ ์์์ 1๋ฅผ ๋บ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ์ค๋๋ ๋ ์ฝ๋์ ์ธ๋ฑ์ค์ ๋๋ค. Journal/GetJournal ์ ๋ ์ฝ๋๋ถํฐ ์ด์ ๋ ์ฝ๋๊น์ง 0 ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ InJournal๋ ๋ค๋ฅธ ๋จ์ผ ์นด์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๋ก์ด ๋ฉ์์ง์ ์ ๋ฆฌ๋ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๊ฟ๋๋ค. ์ฌ๊ธฐ์ ์์๋ ์ ๊ธฐ๋ก๋ถํฐ ๊ตฌ๊ธฐ๋ก ์์ผ๋ก Journal(0) ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.HighJournal();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ๊ฒฝ๊ณ๋ ๋น ๋ฒํผ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋ฒํผ๊ฐ ๋น์ด ์์ง ์์ผ๋ฉด 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- HighJournal=-1 ๋ก๊ทธ๊ฐ ๋น์ด ์์ผ๋ฉด total=0์ ๋๋ค. LowJournal๋ ์ค ์๊ฐ ์๋ ํํ์ ์ค๋ช ํฉ๋๋ค.
- ์ด๋ ๋ก์ปฌ์ ์ ์ฅ๋ ์ด ํ ์์ ๋๋ค. LineCount๋ ๋ง์ง๋ง ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var total = UO.HighJournal() + 1;
UO.Print("Rows: " + Convert.ToString(total));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalEntryCount:bridge.JournalEntryCount().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "highjournal": return new InjectionValue(bridge.JournalEntryCount() == 0 ? -1 : bridge.JournalEntryCount() - 1);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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()๋ฅผ ํธ์ถํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.InJournal("You see");
UO.Print("InJournal: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํจํด=๋ถ๋ถ ๋ฌธ์์ด์ด๋ฏ๋ก ๋์๋ฌธ์๊ฐ ์ค์ํฉ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๋ฒ์งธ ์ธ์ -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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: pattern (Any/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.InJournal:InJournal(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "injournal": return new InjectionValue(InJournal(Text(0)));๋งค๊ฐ๋ณ์: pattern (Any/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.InJournal. -
InjectionScript.Runtime.InjectionApiUO.InJournalCore:InJournalCore(pattern, -1, ignoreCase: false).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int InJournal(string pattern)
=> InJournalCore(pattern, -1, ignoreCase: false);๋งค๊ฐ๋ณ์: pattern (String), maxLinesOrIgnoreCase (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.InJournal. -
InjectionScript.Runtime.InjectionApiUO.InJournalCore:InJournalCore(pattern, maxLinesOrIgnoreCase == -1 ? -1 : Math.Max(0, maxLinesOrIgnoreCase), ignoreCase: maxLinesOrIgnoreCase == -1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int InJournal(string pattern, int maxLinesOrIgnoreCase)
=> InJournalCore(pattern,
maxLinesOrIgnoreCase == -1 ? -1 : Math.Max(0, maxLinesOrIgnoreCase),
ignoreCase: maxLinesOrIgnoreCase == -1);๋งค๊ฐ๋ณ์: pattern (Any), serial (Any), color (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [InJournal]. -
InjectionScript.Runtime.InjectionApiUO.CompactInJournal:CompactInJournal(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactInJournal(values))๋งค๊ฐ๋ณ์: pattern (Any), serial (Any), color (Any), startTime (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [InJournal]. -
InjectionScript.Runtime.InjectionApiUO.CompactInJournal:CompactInJournal(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactInJournal(values))๋งค๊ฐ๋ณ์: pattern (Any), serial (Any), color (Any), startTime (Any), endTime (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [InJournal]. -
InjectionScript.Runtime.InjectionApiUO.CompactInJournal:CompactInJournal(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [InJournal]. -
InjectionScript.Runtime.InjectionApiUO.CompactInJournal:CompactInJournal(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [InJournal]. -
InjectionScript.Runtime.InjectionApiUO.CompactInJournal:CompactInJournal(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactInJournal(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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()๋ฅผ ํธ์ถํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.InJournalBetweenTimes("You see", 0, Now());
UO.Print("InJournalBetweenTimes: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์๋ ๋ด์ฉ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง -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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: pattern (Any/String), startTime (Any/Integer)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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)));๋งค๊ฐ๋ณ์: pattern (Any/String), startTime (Any/Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimesCore:InJournalBetweenTimesCore(pattern, startTime, CurrentJournalTime(), -1, ignoreCase: false). -
InjectionScript.Runtime.InjectionApiUO.CurrentJournalTime:CurrentJournalTime().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int InJournalBetweenTimes(string pattern, int startTime)
=> InJournalBetweenTimesCore(pattern, startTime, CurrentJournalTime(), -1, ignoreCase: false);๋งค๊ฐ๋ณ์: pattern (Any/String), startTime (Any/Integer), endTime (Any/Integer)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimesCore:InJournalBetweenTimesCore(pattern, startTime, endTime, -1, ignoreCase: false).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes:InJournalBetweenTimes(Text(0), Arg(1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimes. -
InjectionScript.Runtime.InjectionApiUO.InJournalBetweenTimesCore:InJournalBetweenTimesCore(pattern, startTime, endTime, limit == -1 ? -1 : Math.Max(0, limit), ignoreCase: limit == -1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ; .
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Journal(0);
UO.Print("Journal: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๋ ์ต์ ๋ผ์ธ์ ๋๋ค. ๋จผ์ ํ ์คํธ์ ์ ์๋ฅผ ์ฝ์ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํฉ๋๋ค.
- Print๋ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ์ฅ๋ ํ ์คํธ/์์ฑ์๋ ์ด์ ์ ์ ํํ ํญ๋ชฉ์ ์ฐธ์กฐํฉ๋๋ค.
var text = UO.Journal(0);
var author = UO.LineName();
UO.Print(author + ": " + text);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Any/Integer)
๊ฒฐ๊ณผ: string / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetJournalText:GetJournalText(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "journal": return new InjectionValue(GetJournalText(Arg(0)));๋งค๊ฐ๋ณ์: index (Any/Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetJournalText. -
InjectionScript.Runtime.InjectionApiUO.SelectJournalEntry:SelectJournalEntry(ReadJournalSnapshot(index)). -
InjectionScript.Runtime.InjectionApiUO.ReadJournalSnapshot:ReadJournalSnapshot(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetJournalText(int index)
{
SelectJournalEntry(ReadJournalSnapshot(index));
return selectedJournalEntry?.Text ?? string.Empty;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.JournalColor(object? index);์ ํํ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์๋ ํ์ hue ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
index- ํ์ int - ํ์ฌ ์์ธ: 0๋ ์ต์ ์ค์ ์๋ฏธํ๊ณ , 1 - ์ด์ ์ค์ ์๋ฏธํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ด๋๋ฉ๋๋ค. ์ด๋ serial๋ ์๋๊ณ ํจํด์ ID ๋ณํ๋ ์๋๋ฉฐ InJournal์ ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
string - UO hue 0x0044; ์์ธ 0x0000๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ. ์ด๊ฒ์ RGB์ด ์๋๋๋ค.
- ๊ฐ ํธ์ถ์ ํ์ฌ ์์น๋ฅผ ์ฝ์ต๋๋ค. ๋์ผํ ๋ ์ฝ๋์ ์ผ์นํ๋ ํ ์คํธ ๋ฐ ํ๋์ ๊ฒฝ์ฐ ๋จผ์ Journal(์์ธ)์ ์ ๋ ฅํ ๋ค์ GetFoundedText/Line*์ ์ ๋ ฅํ์ธ์. Null ๊ฐ์ ์ค์ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.JournalColor(0);
UO.Print("JournalColor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธ์ถ ์ ํ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ณ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ์ค 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.JournalColor. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalColor:bridge.JournalColor(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string JournalColor(int index) => bridge.JournalColor(index);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.JournalSerial(object? index);์ ํํ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์๋ ํ์ serial ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
index- ํ์ int - ํ์ฌ ์์ธ: 0๋ ์ต์ ์ค์ ์๋ฏธํ๊ณ , 1 - ์ด์ ์ค์ ์๋ฏธํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ด๋๋ฉ๋๋ค. ์ด๋ serial๋ ์๋๊ณ ํจํด์ ID ๋ณํ๋ ์๋๋ฉฐ InJournal์ ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
string - serial ์ ์์ 0x00001234; ์์ธ 0x00000000์ด ์๋ชป๋ ๊ฒฝ์ฐ.
- ๊ฐ ํธ์ถ์ ํ์ฌ ์์น๋ฅผ ์ฝ์ต๋๋ค. ๋์ผํ ๋ ์ฝ๋์ ์ผ์นํ๋ ํ ์คํธ ๋ฐ ํ๋์ ๊ฒฝ์ฐ ๋จผ์ Journal(์์ธ)์ ์ ๋ ฅํ ๋ค์ GetFoundedText/Line*์ ์ ๋ ฅํ์ธ์. Null ๊ฐ์ ์ค์ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.JournalSerial(0);
UO.Print("JournalSerial: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธ์ถ ์ ํ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ณ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ์ค 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.JournalSerial. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalSerial:bridge.JournalSerial(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string JournalSerial(int index) => bridge.JournalSerial(index);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.JournalTimer(object? index);์ ํํ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์๋ ํ์ ํ์์คํฌํ ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
index- ํ์ int - ํ์ฌ ์์ธ: 0๋ ์ต์ ์ค์ ์๋ฏธํ๊ณ , 1 - ์ด์ ์ค์ ์๋ฏธํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ด๋๋ฉ๋๋ค. ์ด๋ serial๋ ์๋๊ณ ํจํด์ ID ๋ณํ๋ ์๋๋ฉฐ InJournal์ ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
int โ ๋ฐํ์ ์์๋ถํฐ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ ์ด๋ธ์ ๊ธฐ๋กํ๋ฉฐ Now()์ ํธํ๋ฉ๋๋ค. 0 ๋ฐํ์ ์ ๋ นํ์ฉ; -1: ์๋ชป๋ ์ธ๋ฑ์ค/์๊ฐ. ์ด๊ฒ์ ๊ธฐ๋ก์ ๋์ด๋ ์๋๊ณ 10๋ถ์ 1์ด UO.Timer()๋ ์๋๋๋ค.
- ๊ฐ ํธ์ถ์ ํ์ฌ ์์น๋ฅผ ์ฝ์ต๋๋ค. ๋์ผํ ๋ ์ฝ๋์ ์ผ์นํ๋ ํ ์คํธ ๋ฐ ํ๋์ ๊ฒฝ์ฐ ๋จผ์ Journal(์์ธ)์ ์ ๋ ฅํ ๋ค์ GetFoundedText/Line*์ ์ ๋ ฅํ์ธ์. Null ๊ฐ์ ์ค์ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.JournalTimer(0);
UO.Print("JournalTimer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธ์ถ ์ ํ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ณ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ์ค 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.JournalTimer. -
InjectionScript.Runtime.InjectionApiUO.JournalEntryTime:JournalEntryTime(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int JournalTimer(int index) => JournalEntryTime(index);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LastJournalMessage();์ต์ ๋ก์ปฌ ๋ก๊ทธ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ์ ํญ๋ชฉ์ ํ ์คํธ์ ๋๋ค. ๋ก๊ทธ๊ฐ ์๊ฑฐ๋ ํญ๋ชฉ ์์ฒด์ ๋น ํ ์คํธ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Journal(0)๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก Line* ์ ํ ๋ฐ ํ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LastJournalMessage();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. text๋ ํ์ฌ ๋ง์ง๋ง ์ค์ ๋ณต์ฌํฉ๋๋ค.
- ์ฝ์ ํ ์ธ์๋ ๋ด์ฉ ์์ฒด๊ฐ ๋ง์ง๋ง ๋ฉ์์ง๊ฐ ๋ ์ ์์ต๋๋ค.
var text = UO.LastJournalMessage();
UO.Print(text);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ์นํ๋ ํญ๋ชฉ์ ์ต์ ํญ๋ชฉ์ ์ฝ์ ๋๊น์ง ์ ์ฅ๋๋ฏ๋ก ์ ์ ํ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ๋ง์ง๋ง ๋ฉ์์ง๋ ๋ฐ๊ฒฌ๋ ๋ฉ์์ง์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ฐ๊ฒฌ > 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetJournalText:GetJournalText(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lastjournalmessage": return new InjectionValue(GetJournalText(0));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.LastMessage();์ต์ ๋ก์ปฌ ๋ก๊ทธ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ์ ํญ๋ชฉ์ ํ ์คํธ์ ๋๋ค. ๋ก๊ทธ๊ฐ ์๊ฑฐ๋ ํญ๋ชฉ ์์ฒด์ ๋น ํ ์คํธ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค.
- ์ด getter๋ ์ ํญ๋ชฉ์ ์ฝ์ง๋ง ์ด์ ์ ํ ํญ๋ชฉ์ธ GetFoundedText/Line*์ ์ ์งํฉ๋๋ค. ๋ง์ง๋ง ํญ๋ชฉ์ ์ ํํ๋ ค๋ฉด LastJournalMessage ๋๋ Journal(0)๋ฅผ ์ฌ์ฉํ์ธ์.
- ๊ธฐ๋ณธ ๋๋ ํฐ๋ฆฌ: https://forum.yoko.com.ua/viewtopic.php?p=27633.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastMessage();
UO.Print("LastMessage: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. text๋ ํ์ฌ ๋ง์ง๋ง ์ค์ ๋ณต์ฌํฉ๋๋ค.
- ์ฝ์ ํ ์ธ์๋ ๋ด์ฉ ์์ฒด๊ฐ ๋ง์ง๋ง ๋ฉ์์ง๊ฐ ๋ ์ ์์ต๋๋ค.
var text = UO.LastMessage();
UO.Print(text);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ์นํ๋ ํญ๋ชฉ์ ์ต์ ํญ๋ชฉ์ ์ฝ์ ๋๊น์ง ์ ์ฅ๋๋ฏ๋ก ์ ์ ํ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ๋ง์ง๋ง ๋ฉ์์ง๋ ๋ฐ๊ฒฌ๋ ๋ฉ์์ง์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ฐ๊ฒฌ > 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.LastMessage. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastMessage:bridge.LastMessage().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string LastMessage() => bridge.LastMessage();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineCount();๋ง์ง๋ง ๊ฒ์์์ ์ผ์นํ๋ ํ ์๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ ๋ง์ง๋ง์ผ๋ก ํ์ธํ ์์ญ์์ ์ผ์นํ๋ ๋ ์ฝ๋ ์์ ๋๋ค. 0 ์ผ์นํ๋ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ; newestOnly=true์ ๊ฒฝ์ฐ 1 ์ดํ์ ๋๋ค. ์ด๋ ์ ์ฒด ๋ก๊ทธ์ ์ค ์, ํ ๋ฉ์์ง์ ํ์ ๋ฌธ์์ด ๋ฐ์ ํ์, ๋ฐ๊ฒฌ๋ ํ ์คํธ์ ์์น๊ฐ ์๋๋๋ค.
- ๊ฒ์์๋ ์ ํ, ์๊ฐ, serial, hue ๋ฐ ๋จ์ผ ์ธ์ SetJournalLine๊ฐ ๊ณ ๋ ค๋ฉ๋๋ค. ์ง์ Journal/GetJournal๋ ์นด์ดํฐ๋ฅผ ๋ค์ ๊ณ์ฐํ์ง ์์ต๋๋ค. ์ฒญ์ํ๋ฉด ์ฌ์ค์ ๋ฉ๋๋ค. ์นด์ดํฐ๋ ํ์ฌ ์คํฌ๋ฆฝํธ์ ๋ธ๋ฆฌ์ง์ ์ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineCount();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌด์ ํ์ผ๋ก ๊ฒ์ํ๊ณ ๋ฑ๋กํ์ธ์. ๋ผ์ธ ๋ด์ ๊ด์ ์๊ฐ ์๋๋ผ ๋ผ์ธ์ ๊ณ์ฐํฉ๋๋ค.
- ๊ฒฐ๊ณผ โ ์์น ๋ํ๊ธฐ 1; ์ผ์น - ๋ณ๋์ ์๋์ ๋๋ค.
var result = UO.InJournal("ore", -1);
var matches = UO.LineCount();
UO.Print(Convert.ToString(matches));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 10 โ ํ์ธํ ์ต๋ ์ค; ๊ฒฝ์ฐ๊ฐ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ด์ ์ผ์น ํญ๋ชฉ์ด ๋ ๋ง๋๋ผ๋ ๊ฐ์์ ๋ฒ์๋ 0๋ถํฐ 10๊น์ง์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var result = UO.InJournal("ore", 10);
UO.Print(Convert.ToString(UO.LineCount()));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalMatchCount:bridge.JournalMatchCount().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linecount": return new InjectionValue(bridge.JournalMatchCount());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineID();์ ํํ ์ ๋ ํญ๋ชฉ์ ์ ์์ ์ซ์ serial๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ์์ฑ์์ 32๋นํธ serial. ์ ํ์ ์ฌ์ง๊ฐ ์์ต๋๋ค - 0. ์ต์์ ๋นํธ๋ ๋ถํธ ์๋ int๋ก ์ธํด ์์๊ฐ ๋ ์ ์์ต๋๋ค. GetFoundedTextSerial๋ ์ ์ฒด 16์ง์ ํํ์ ์ ์งํฉ๋๋ค. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lineid": return new InjectionValue(selectedJournalEntry?.Serial ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineIndex();์ ํํ ํญ๋ชฉ์ด ๋ก๊ทธ์ ์์ง ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ ํด๋น ํญ๋ชฉ์ ํ์ฌ ์์ธ์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ 0(์ต์ ํ)์ ํ์ฌ ์ธ๋ฑ์ค์ ๋๋ค. -1๋ ์ ํ์ ์ฌ์ง๊ฐ ์๊ฑฐ๋ ์ ํํ ํญ๋ชฉ์ด ์ด๋ฏธ ์ญ์ /์ ์ ๋์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ InJournal์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค. 1๋ ์์ธ์์ ๋บ ํ์๊ฐ ์์ต๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- ์ธ๋ฑ์ค๋ ๋ ์ฝ๋์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ๊ณ์ฐ๋ฉ๋๋ค. ์๋ก์ด ๋ฉ์์ง๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์ด์ ์ ์ ์ฅ๋ ์ธ๋ฑ์ค๊ฐ ์ผ์ ํ์ง ์์ต๋๋ค ID; ํ ์คํธ์ ๊ฒฝ์ฐ GetFoundedText๊ฐ ๋ ์์ ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineIndex();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetFoundedTextIndex:GetFoundedTextIndex().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lineindex": return new InjectionValue(GetFoundedTextIndex());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineMsgType();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linemsgtype": return new InjectionValue(selectedJournalEntry?.MessageType ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineName();์ ํํ ๋ถ๊ฐ ํญ๋ชฉ์ ์ ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ์ ํํ ํญ๋ชฉ์ ์์ฑ์ ์ด๋ฆ(์: ์์คํ ์ด๋ฆ ๋๋ ์บ๋ฆญํฐ ์ด๋ฆ) ์ ํ ํญ๋ชฉ์ด ์๊ฑฐ๋ ์ด๋ฆ์ด ์๋ ๋น ๋ฌธ์์ด์ ๋๋ค. ์ด๋ฆ์ด ์บ๋ฆญํฐ์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linename": return new InjectionValue(selectedJournalEntry?.Name ?? string.Empty);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineTextColor();์ ํํ ๋ก๊ทธ ํญ๋ชฉ์ ์ซ์ ์์์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ์ ํํ ํญ๋ชฉ์ UO hue(0โฆ65535); ์ ํ์ ์ฌ์ง๊ฐ ์์ต๋๋ค 0. 0์ ์์์ผ๋ก ํ์ฉ๋ฉ๋๋ค. ์์ฑ์์ RGB ๋๋ ID๊ฐ ์๋๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineTextColor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linetextcolor":
return new InjectionValue(selectedJournalEntry?.Color ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineTextFont();์ ํํ ๋ก๊ทธ ํญ๋ชฉ์ ๊ธ๊ผด์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ ํํ ๋ ์ฝ๋์ UO ๊ธ๊ผด ID(ํด๋ผ์ด์ธํธ์์๋ 0โฆ255); ์ ํ์ ์ฌ์ง๊ฐ ์์ต๋๋ค 0. IDE ๊ธ๊ผด ํฌ๊ธฐ๊ฐ ์๋ ID ๊ฒ์ ๊ธ๊ผด์ ๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineTextFont();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linetextfont": return new InjectionValue(selectedJournalEntry?.Font ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LineTime();์ ํํ ๋ก๊ทธ ํญ๋ชฉ์ ๋ฌ๋ ฅ ํ์์คํฌํ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
double โ OLE ์๋ํ Date, 30.12.1899์ ์ผ์, ์์ ๋ถ๋ถ์ ์๊ฐ์ ์ง์ ํฉ๋๋ค. ์ ํ์ ์ฌ์ง๊ฐ ์์ต๋๋ค 0. Now() ๋ฐ๋ฆฌ์ด๋ ์๋๊ณ ์ ์ฒด Unix ํ์์คํฌํ๋ ์๋๋๋ค. ์ด๋ฌํ ๋ ํ์์ ์ฐจ์ด์ ๋ฐ๋ฆฌ์ด ๋์ 86400000๋ฅผ ๊ณฑํฉ๋๋ค.
- ๊ฒ์ ๋ฐ Journal/GetJournal/LastJournalMessage๋ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋จ์ผ ํญ๋ชฉ์ ํ ์คํธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ๋ฉ์์ง๋ ์ด ํ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ํ๋ ์ ๋์์ ๋ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์ ์ง๋ ํ๋๋ ์ ์ง๋์ง๋ง LineIndex/GetFoundedTextIndex๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ๊ฒ์ ๋๋ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ์คํจํ ๊ฒ์, ์๋ชป๋ ์์ธ ๋ฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ญ์ ๋ ์ ํ์ ์ฌ์ค์ ํฉ๋๋ค.
- Getter๋ ๊ฒ์์ ์คํํ์ง ์๊ณ ์ต์ ํ์ ์ ํํฉ๋๋ค. Null/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linetime": return new InjectionValue(selectedJournalEntry?.Timestamp ?? 0d);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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/๋น ๊ฐ์ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LineType();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํต์ง โ ๊ฒ์๋ ํ ์คํธ์ ์์ ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ๊ฒ์์์๋ ์ฑ๊ณต์ ์ ํํ๊ณ , ๋ ๋ฒ์งธ ๊ฒ์์์๋ ์ ํ ํญ๋ชฉ์ ๋ฐ๊พธ๊ฑฐ๋ ์ฌ์ค์ ํฉ๋๋ค. ์ ์ฅ๋ ํญ๋ชฉ์๋ ์ด๋ฏธ ํ์ ํ๋์ ์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ ์ฅ๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "linetype": return new InjectionValue(selectedJournalEntry?.TextType ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LowJournal();์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ๋ก๊ทธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int: -1 ๋งค๊ฑฐ์ง์ด ๋น์ด ์์ ๋; ๊ทธ๋ ์ง ์์ผ๋ฉด 0๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ๋ ์ฝ๋์ ์์ธ์ ๋๋ค. Journal/GetJournal ์ ๋ ์ฝ๋๋ถํฐ ์ด์ ๋ ์ฝ๋๊น์ง 0 ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ InJournal๋ ๋ค๋ฅธ ๋จ์ผ ์นด์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๋ก์ด ๋ฉ์์ง์ ์ ๋ฆฌ๋ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๊ฟ๋๋ค. ์ฌ๊ธฐ์ ์์๋ ์ ๊ธฐ๋ก๋ถํฐ ๊ตฌ๊ธฐ๋ก ์์ผ๋ก Journal(0) ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LowJournal();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ๊ฒฝ๊ณ๋ ๋น ๋ฒํผ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋ฒํผ๊ฐ ๋น์ด ์์ง ์์ผ๋ฉด 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค๋ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.JournalEntryCount:bridge.JournalEntryCount().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lowjournal": return new InjectionValue(bridge.JournalEntryCount() == 0 ? -1 : 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetJournalLine");
UO.SetJournalLine(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ์ค์ ํ ์คํธ๋ฅผ ๋์ฒดํ์ง๋ง ํญ๋ชฉ์ด๋ ์์ฑ์๋ฅผ ์ ๊ฑฐํ์ง๋ ์์ต๋๋ค.
- ์๋ชป๋ ์ธ๋ฑ์ค๋ ๊ฑด๋๋๋๋ค. ์กด์ฌํ๋ ๊ฒ์ 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ๊ฐ์ง ์ธ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetJournalLine. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetJournalLine:bridge.SetJournalLine(index).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetJournalLine(int index) => bridge.SetJournalLine(index);๋งค๊ฐ๋ณ์: stringIndex (Any/Integer), text (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetJournalLine:bridge.SetJournalLine(Arg(0), Text(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetJournalLine:bridge.SetJournalLine(Arg(0)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setjournalline":
if (arguments.Length > 1) bridge.SetJournalLine(Arg(0), Text(1));
else bridge.SetJournalLine(Arg(0));
return InjectionValue.Unit;๋งค๊ฐ๋ณ์: stringIndex (Any/Integer), text (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetJournalLine. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetJournalLine:bridge.SetJournalLine(index, text).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetJournalLine(int index, string text) => bridge.SetJournalLine(index, text);