KO UO Topic record playback - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์ง์๋๋ ์์ ์ ๊ธฐ๋กํ๊ณ ๋ฐ๋ณตํ์ธ์. ๋ น์ ๋ฐ ์ฌ์ ์ ํ์ ๊ตฌ์ฑ์ ๋ช ๋ น ๊ตฌํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| SetRec | UO.SetRec |
| UseRec | UO.UseRec |
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.SetRec();
UO.Light(15);๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.SetRec();
UO.Light(15);
UO.UseRec();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetRec();๋ค์ ๋ ๊ฑฐ์ ๋ช ๋ น UO์ ๊ธฐ๋ก์ ์ค๋นํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias ์ํ๋ฅผ ์ง์๋๋ค. RecordedAction ๋ฐ recordNextLegacyAction=true๋ก ์ค์ ํฉ๋๋ค. SetRec/UseRec๋ฅผ ์ ์ธํ๊ณ ๋์ผํ ๋ ๊ฑฐ์ ๋์คํจ์ฒ์ ๋ํ ๋ค์ ํธ์ถ์์๋ ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ์ง๋ ฌํํ ๋ค์ ํ๋๊ทธ๋ฅผ ์ง์๋๋ค.
- ์ด๊ฒ์ ๋ชจ๋ ๋ง์ฐ์ค ๋์, UO getter ๋๋ ์๋ฒ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ์ง ์์ต๋๋ค. ์ง์๋๋ ๋ ๊ฑฐ์ ๋์คํจ์ฒ์์ ํ๋์ ๋ช ๋ น๋ง ๋ฐ๋ณตํฉ๋๋ค. ์ด์ ์ ์ฅ์ ์ฆ์ ์ญ์ ๋ฉ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
- ํญ๋ชฉ์ int, double, string, recursive Array ๋ฐ void ์ธ์ ์ ํ์ ์ ์งํฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ ํ ์คํธ ToString๋ก ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ณตํด๋ ๋ผ์ด๋ธ ๊ฐ์ฒด/ํธ๋ค์ด ๋ณต์๋์ง ์์ต๋๋ค.
- RecordedAction๋ ํ๋กํ์ ์ผ๋ฐ์ ์ธ ์ํ์ด๊ณ , recordNextLegacyAction/replayingLegacyAction๋ ์ด InjectionApiUO์ ๋น๊ณต๊ฐ ํ๋์ ๋๋ค. ์ด ์ธ์คํด์ค๋ง ๋ค์ ๋ ๊ฑฐ์ ํธ์ถ์ ๋ น์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ ๊ณต์ ์ฐ๊ธฐ๋ฅผ ์ง์ฐ๊ฑฐ๋ ๋ค์ ์คํํ ์ ์์ง๋ง ํด๋น ์ธ์คํด์ค์ ์ฐ๊ธฐ ๋๊ธฐ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ์๊ฒฉํ๊ฒ ์ธ์ ์์ด SetRec()๋ง ๋ฑ๋ก๋ฉ๋๋ค. RecordedAction์ ์ฆ์ ์ง์์ง๋ฏ๋ก, ํด๋น ์ธ์คํด์ค๊ฐ ํ์ ๋ ๊ฑฐ์ ์์ ์ ์์ฑํ๊ธฐ ์ ์ stay()๋ 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ฐ๊ธฐ ๋๊ธฐ๋ฅผ ํ์ฑํํ๋ค๊ณ ํด์ ์ ์ฅ๋ ์์ ์ด ์์ฑ๋๋ ๊ฒ์ ์๋๋๋ค. stay()๋ ์ฝ๊ธฐ๋ง ํ๊ณ ๋๊ธฐ ํ๋๊ทธ๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetRec");
UO.SetRec();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ค์ ๋ ๊ฑฐ์ ๋ช ๋ น UO์ ๊ธฐ๋ก์ ์ค๋นํฉ๋๋ค.
UO.SetRec();
UO.Light(15);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias ์ํ๋ฅผ ์ง์๋๋ค. RecordedAction ๋ฐ recordNextLegacyAction=true๋ก ์ค์ ํฉ๋๋ค. SetRec/UseRec๋ฅผ ์ ์ธํ๊ณ ๋์ผํ ๋ ๊ฑฐ์ ๋์คํจ์ฒ์ ๋ํ ๋ค์ ํธ์ถ์์๋ ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ์ง๋ ฌํํ ๋ค์ ํ๋๊ทธ๋ฅผ ์ง์๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetRec();
UO.Sound(0x0040);
UO.UseRec();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๊ฒ์ ๋ชจ๋ ๋ง์ฐ์ค ๋์, UO 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()
{
UO.SetRec();
UO.TextPrint("This is not a legacy recording route");
UO.Light(15);
UO.UseRec();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setrec":
state.RecordedAction = string.Empty;
recordNextLegacyAction = true;
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseRec();์ ์ฅ๋ ๋ ๊ฑฐ์ ๋ช ๋ น UO์ ๋ฐ๋ณตํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- TryDeserializeRecordedLegacyAction๋ YOKOREC1 ์ ๋์ฌ์ ์ ๋ ฅ๋ ์ธ์๋ฅผ ํ์ธํฉ๋๋ค. ํญ๋ชฉ ์์/์๋ชป๋ ํญ๋ชฉ - ๋ก์ปฌ ๋ฉ์์ง, ์์ ์์. ์ ํจํ ํญ๋ชฉ์ ์ ์ฅ๋ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ExecuteLegacyManualAlias์ ํธ์ถํฉ๋๋ค.
- replayingLegacyAction ํ๋๊ทธ๋ ์ฌ์ ์์ฒด๊ฐ ์์ฑ๋์ง ์๋๋ก ๋ณดํธํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋
finally๊ฐ ์ง์์ง๋๋ค. ๋ฐ๋ณต ํ์๋ ํญ๋ชฉ์ด ์ญ์ ๋์ง ์์ต๋๋ค. UseRec๋ฅผ ๋ค์ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ฆ/serial์ ์ ์ฅ๋ ์ ํ๊ณผ ํ์ฌ ์ธ๊ณ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. - ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
- ํญ๋ชฉ์ int, double, string, recursive Array ๋ฐ void ์ธ์ ์ ํ์ ์ ์งํฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ ํ ์คํธ ToString๋ก ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ณตํด๋ ๋ผ์ด๋ธ ๊ฐ์ฒด/ํธ๋ค์ด ๋ณต์๋์ง ์์ต๋๋ค.
- RecordedAction๋ ํ๋กํ์ ์ผ๋ฐ์ ์ธ ์ํ์ด๊ณ , recordNextLegacyAction/replayingLegacyAction๋ ์ด InjectionApiUO์ ๋น๊ณต๊ฐ ํ๋์ ๋๋ค. ์ด ์ธ์คํด์ค๋ง ๋ค์ ๋ ๊ฑฐ์ ํธ์ถ์ ๋ น์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ ๊ณต์ ์ฐ๊ธฐ๋ฅผ ์ง์ฐ๊ฑฐ๋ ๋ค์ ์คํํ ์ ์์ง๋ง ํด๋น ์ธ์คํด์ค์ ์ฐ๊ธฐ ๋๊ธฐ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseRec");
UO.UseRec();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋ ๊ฑฐ์ ๋ช ๋ น UO์ ๋ฐ๋ณตํฉ๋๋ค.
UO.SetRec();
UO.Light(15);
UO.UseRec();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- TryDeserializeRecordedLegacyAction๋ YOKOREC1 ์ ๋์ฌ์ ์ ๋ ฅ๋ ์ธ์๋ฅผ ํ์ธํฉ๋๋ค. ํญ๋ชฉ ์์/์๋ชป๋ ํญ๋ชฉ - ๋ก์ปฌ ๋ฉ์์ง, ์์ ์์. ์ ํจํ ํญ๋ชฉ์ ์ ์ฅ๋ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ExecuteLegacyManualAlias์ ํธ์ถํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetRec();
UO.Sound(0x0040);
UO.Wait(250);
UO.UseRec();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- replayingLegacyAction ํ๋๊ทธ๋ ์ฌ์ ์์ฒด๊ฐ ์์ฑ๋์ง ์๋๋ก ๋ณดํธํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋
finally๊ฐ ์ง์์ง๋๋ค. ๋ฐ๋ณต ํ์๋ ํญ๋ชฉ์ด ์ญ์ ๋์ง ์์ต๋๋ค. UseRec๋ฅผ ๋ค์ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ฆ/serial์ ์ ์ฅ๋ ์ ํ๊ณผ ํ์ฌ ์ธ๊ณ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
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.SetRec();
UO.Light(15);
UO.UseRec();
UO.Wait(250);
UO.UseRec();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.TryDeserializeRecordedLegacyAction:TryDeserializeRecordedLegacyAction(state.RecordedAction, out string recordedName, out InjectionValue[] recordedArguments). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UseRec: no recorded UO action is available. Call UO.SetRec() before the action to record."). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias:ExecuteLegacyManualAlias(recordedName, recordedArguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "userec":
if (!TryDeserializeRecordedLegacyAction(state.RecordedAction, out string recordedName, out InjectionValue[] recordedArguments))
{
if (bridge != null) SystemMessage("UseRec: no recorded UO action is available. Call UO.SetRec() before the action to record.");
break;
}
replayingLegacyAction = true;
try
{
ExecuteLegacyManualAlias(recordedName, recordedArguments);
}
finally
{
replayingLegacyAction = false;
}
break;