KO UO Topic client ui - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๋ฉ์์ง, ์๋น์ค ์ฐฝ, ๊ฐ์ฒด ํ์ ๋ฐ ์ด๊ธฐ IDE๋ฅผ ํ์ํฉ๋๋ค. ์ด ๋จ๊ณ๋ ์๋ฒ์ ์์ฑ์ ๋ณด๋ด๋ ๊ฒ์ ๋์ฒดํ์ง ์์ต๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| UO.Print | |
| ClientPrint | UO.ClientPrint |
| Info Window | UO.FillInfoWindow ยท UO.ClearInfoWindow ยท UO.FillNewWindow |
| Text Window | UO.TextOpen ยท UO.TextPrint ยท UO.TextClear ยท UO.TextClose |
| ๋จ์๊ฒํ | UO.CloseSimpleGump |
| Close UI Window | UO.CloseClientUIWindow |
| Circle Transparency | UO.CircleTrans |
| Show Z | UO.SetShowZ |
| Open IDE | UO.OpenIDE |
UO.Print ยท UO.ClientPrint ยท UO.ClientPrintEx ยท UO.CharPrint ยท UO.ColorPrint ยท UO.ConsolePrint ยท UO.ServerPrint ยท UO.SetSilentMode ยท UO.ConColor ยท UO.FontColor
UO.ClearInfoWindow ยท UO.FillInfoWindow ยท UO.FillNewWindow ยท UO.TextOpen ยท UO.TextClear ยท UO.TextClose ยท UO.TextPrint ยท UO.CloseSimpleGump ยท UO.CloseClientUIWindow ยท UO.ShowJournal ยท UO.OpenIDE ยท UO.HelpRequest ยท UO.ActivateHandle ยท UO.CloseHandle ยท UO.Snap
UO.Hide ยท UO.ClientHide ยท UO.ClientMarkChar ยท UO.CircleTrans ยท UO.SetShowZ ยท UO.Morph
UO.AddFigure ยท UO.UpdateFigure ยท UO.RemoveFigure ยท UO.ClearFigures
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.FillInfoWindow("Status ready");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ActivateHandle();Windows/SDL์ ํ์ฌ ํด๋ผ์ด์ธํธ ์ฐฝ์ ์์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ์์ฒญํฉ๋๋ค. ๋ ผ์์ด๋ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ด๋ ์์ดํ , ์คํฌ ๋๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ์ฐฝ ๋ช ๋ น์ ๋๋ค. ์ค์ ์ด์ ์ ์ฐฝ ์์คํ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void. ํธ์ถ์ ์ฐฝ ํ์ฑํ๋ง์ ์์ฒญํฉ๋๋ค. ์๋์ฐ ์์คํ
์ด ๊ทธ๊ฒ์ ํฌ๊ทธ๋ผ์ด๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ ์ธ์ ํ์ง ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ SDL๋ฅผ ํตํด ๊ฒ์ ๋ณด๊ธฐ ์ฐฝ์ ์ฌ๋ฆฝ๋๋ค. ์ด ๋ช ๋ น์ ๊ฒ์ ํจํท์ ๋ณด๋ด๊ฑฐ๋ ์๋์์ ์์ ์ ์ํํ์ง ์์ต๋๋ค. ์ต์ํ๋ ์ฐฝ์ด๋ ์ฐฝ ์์คํ ์ ์ ํ์ผ๋ก ์ธํด ์ค์ ์ด์ ์ด ๋ง์ง ์์ ์ ์์ต๋๋ค.
- RequireGameView์๋ Client.Game์ด ํ์ํฉ๋๋ค. ClassicUO ๊ทธ๋ํฝ ์ฐฝ์ด ์ด๋ ค ์์ง ์์ผ๋ฉด ๋ธ๋ฆฌ์ง๋ InvalidOperationException์ ๋ฐ์์ํต๋๋ค. SDL_RaiseWindow๋ ๊ธฐ์กด ์ฐฝ์ ์ฌ๋ฆฌ๋๋ก ์์ฒญํฉ๋๋ค. ์ด์ ์ ๋ํ ๊ฒฐ์ ์ ์๋์ฐ ์์คํ ์ ๋ฌ๋ ค ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ActivateHandle");
UO.ActivateHandle();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ผ์ด์ธํธ ์ฐฝ์ ์ ๊ฒฝ์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ์์ฒญํฉ๋๋ค.
UO.ActivateHandle();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ ์ฐฝ ํฌ์ปค์ค๋ฅผ ์์ฒญํ์ง ๋ง์ธ์.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.ActivateHandle();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 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()
{
RunAction();
return null;
}
void RunAction()
{
UO.ActivateHandle();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ActivateHandle. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ActivateHandle:bridge.ActivateHandle().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ActivateHandle() => bridge.ActivateHandle();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.AddFigure(object? figure);ClassicUO ์ธ๊ณ ์ง๋์ ์ง์ญ ๊ทธ๋ฆผ์ ์ถ๊ฐํ๊ณ ํด๋น ID๋ฅผ ๋ฐํํฉ๋๋ค. ์์น๋ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ฉฐ ๊ฒ์ ์๋ฒ์๋ ํต๋ณด๋์ง ์์ต๋๋ค.
int๋ ์ถ๊ฐ๋ ์์น์ ์์ ID์
๋๋ค. 0 ๋ํ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์๊ฑฐ๋ ์นด๋๊ฐ ์ถ๊ฐ๋ฅผ ๊ฑฐ๋ถํ๋ฉด ๋ฐํ๋ฉ๋๋ค. ์์ ๋ ID๋ฅผ UO.UpdateFigure ๋๋ UO.RemoveFigure๋ก ์ ์กํฉ๋๋ค.
-
WorldMapGump์ ๋ํ ๋ก์ปฌ ๊ทธ๋ฆผ์ ์์ฑํฉ๋๋ค. ์ , ํ์, ์ง์ฌ๊ฐํ, ๋ฐฉํฅ ํ์ดํ ๋ฐ ํ ์คํธ๊ฐ ์ง์๋ฉ๋๋ค.fcWorld์ขํ๋ ์ง๋ ๋ณํ ๋ฐ ์ถ์ฒ์ ๋ฐ๋ฆ ๋๋ค.fcScreen๋ ์ง๋ ์ฐฝ์ ๊ธฐ์ค์ผ๋ก ์ธก์ ๋ฉ๋๋ค. ์ ํํ ๋ฉด์ ๋ชจ์์ด ํ์๋ฉ๋๋ค.
๋ฐฐ์ด ํ์: [kind, coord, x1, y1, x2, y2, brushColor, brushStyle, color, worldNum, text]. kind: 0 ์ , 1 ํ์, 2 ์ง์ฌ๊ฐํ, 3 ๋ฐฉํฅ ํ์ดํ, 4 ํ
์คํธ. coord: 0 world, 1 ํ๋ฉด. color๋ Delphi TColor(0x00BBGGRR) ๋ฐ์ดํธ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ธ๊ณ ์ขํ์ x2=0,y2=0๊ฐ ์๋ ํ์ดํ์ ๊ฒฝ์ฐ ์์์ ์ ํ์ฌ ๋ฌธ์์
๋๋ค. ํธํ์ฑ์ ์ํด ๊ธฐ์กด brushColor ๋ฐ brushStyle๊ฐ ์ฑํ๋์์ต๋๋ค. ์๊ฐ์ ์์์ Delphi์์ ์์ ํ ์ผ์น๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ทธ๋ฆผ์ ์ญ์ /์ ๊ฑฐ๋๊ฑฐ๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ํด๋ผ์ด์ธํธ ์ปฌ๋ ์ ์ ๋จ์ ์์ต๋๋ค. ํจ์ฏ์ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ํจ์ฏ์ ์ํ ์์น๋ง ์จ๊ฒจ์ง๋๋ค.
- ์ต์ 9 ํ๋๊ฐ ํ์ฉ๋ฉ๋๋ค. worldNum๊ฐ ์์ผ๋ฉด ํ์ฌ ์นด๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ ์คํธ๊ฐ ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ข ๋ฅ๋ 0..4, coord - 0..1๋ก ์ ํ๋ฉ๋๋ค. ๋ค๋ฅธ ์๋ฏธ๋ 0์ ์ ๊ณตํฉ๋๋ค. ์์ worldNum๋ ๋ชจ๋ ํจ์ฏ์ ํ์ํ ์ ์์ต๋๋ค. ID ์นด์ดํฐ๋ SetYokoMapFigure๊ฐ ํ์ธ๋๊ธฐ ์ ์ ์ฆ๊ฐํ๋ฏ๋ก ๊ฑฐ๋ถ๋ ๋ถ๋ถ์ด ID์ ๊ณต๋ฐฑ์ ๋จ๊ธธ ์ ์์ต๋๋ค. ์์ง WorldMapGump ์ ์ ์งํ ์ค; ํ ๊ด๋ฆฌ์์ ์ผ๋ฐ ์คํฌ๋ฆฝํธ๋ ๊ณตํต ์๊ตฌ ๋ฐํ์ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- brushColor ๋ฐ brushStyle๋ ํญ๋ชฉ์ ์ ์ฅ๋์ง๋ง ํ์ฌ ๋ ๋๋ฌ์์๋ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ ๊ณผ ์ง์ฌ๊ฐํ์ ์ค๊ณฝ์ ์ผ๋ก ๊ทธ๋ ค์ง๋๋ค. ํ์์ 32 ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ ์คํธ ์๋ช ์ kind=4;์ ๋ํด์๋ง ๊ทธ๋ ค์ง๋๋ค. ๋ค๋ฅธ ์ข ๋ฅ๋ ์ถ๋ ฅํ์ง ์์ต๋๋ค. ์์์ COLORREF 0x00BBGGRR ํ์์ผ๋ก ์ค๊ณฝ์ ์ ์ง์ ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- kind=2 ๋นจ๊ฐ์ ์ค๊ณฝ์ ์ ๊ทธ๋ฆฝ๋๋ค. ๊ฐ์ด Area์ธ ํ ์คํธ ํ๋๊ฐ ์ ์ฅ๋์ง๋ง ์ด ์ข ๋ฅ์ ๊ฒฝ์ฐ ๋ ์ด๋ธ์ด ๊ทธ๋ ค์ง์ง ์์ต๋๋ค. ํ ์คํธ๋ kind=4๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
dynamic[] fig = new dynamic[checked((int)(11) + 1)];
fig[0] = 2;
fig[1] = 0;
fig[2] = UO.GetX("self")-3;
fig[3] = UO.GetY("self")-3;
fig[4] = UO.GetX("self")+3;
fig[5] = UO.GetY("self")+3;
fig[6] = 0;
fig[7] = 1;
fig[8] = 255;
fig[9] = UO.WorldNum();
fig[10] = "Area";
var figureId = UO.AddFigure(fig);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- world ์ขํ ๋ฐ x2=0,y2=0๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ดํ์ ์์ ์ ๊ทธ๋ฆด ๋ ์บ๋ฆญํฐ์ ์์น์์ ๊ฐ์ ธ์ต๋๋ค. kind=3์ ๋ํด East ๊ฐ์ด ์๋ ํ ์คํธ๋ ์ถ๋ ฅ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
dynamic[] dirFig = new dynamic[checked((int)(11) + 1)];
dirFig[0] = 3;
dirFig[1] = 0;
dirFig[2] = UO.GetX("self") + 10;
dirFig[3] = UO.GetY("self");
dirFig[4] = 0;
dirFig[5] = 0;
dirFig[6] = 0;
dirFig[7] = 1;
dirFig[8] = 65280;
dirFig[9] = UO.WorldNum();
dirFig[10] = "East";
var arrowId = UO.AddFigure(dirFig);
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()
{
dynamic[] lineFig = new dynamic[checked((int)(11) + 1)];
lineFig[0] = 0;
lineFig[1] = 0;
lineFig[2] = UO.GetX("self");
lineFig[3] = UO.GetY("self");
lineFig[4] = UO.GetX("self") + 8;
lineFig[5] = UO.GetY("self");
lineFig[6] = 0;
lineFig[7] = 1;
lineFig[8] = 16711680;
lineFig[9] = UO.WorldNum();
lineFig[10] = "";
var lineId = UO.AddFigure(lineFig);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: figure (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::TryMapFigureArg:TryMapFigureArg(0, out int[] figure, out string figureText). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMapFigure:bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::SerializeMapFigure:SerializeMapFigure(figure, figureText).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addfigure":
{
if (!TryMapFigureArg(0, out int[] figure, out string figureText))
return InjectionValue.Zero;
int id = state.NextMapFigureId++;
if (bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText) == 0)
return InjectionValue.Zero;
state.MapFigures[id] = SerializeMapFigure(figure, figureText);
return new InjectionValue(id);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CharPrint(object? color, object? msg);
void UO.CharPrint(object? id, object? color, object? msg);๋ก๋๋ ๊ฐ์ฒด ์์ ์ฌ์ฉ์์๊ฒ๋ง ํ์๋๋ ๋น๋ฌธ(์: ์ ํํ ๋์์ ํ์ ๋๋ ์บ๋ฆญํฐ ์์ ๊ฒฝ๊ณ )์ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ์บ๋ฆญํฐ์ ๋ง์ด๋ ๊ฒ์์ฐฝ ํ๋จ์ ๋ฉ์์ง๊ฐ ์๋๋๋ค.
-
id๋ graphic/type ๋๋ ์ขํ๊ฐ ์๋ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ์ ๋๋ค. 3์ธ์ ํ์์ UO.CharPrint์ self, lasttarget ๋ฐ ์ ์ฅ๋ ๊ฐ์ฒด ์ด๋ฆ๋ ์ดํดํฉ๋๋ค. UO.ClientPrintEx์ SenderID์๋ UO.Hex2Int(UO.GetSerial("self")์ ๊ฐ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ธ์. ๋ฌธ์์ด ๋ณ์นญ์ ๊ฐ์ฒด๋ก ํ์ธ๋์ง ์์ต๋๋ค. -
color๋ UO hue์ด๊ณ , RGB๋ ์๋๋๋ค. ์ซ์์ ์ตํ์ 16 ๋นํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. 0x0044๋ ์์์ ๋๋ค. -1์ "๋ชจ๋ ์์"์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ 0xFFFF์ด ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ConColor ์์์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๊ฐ์ฒด๋ ๋ก๋๋ ์ธ๊ณ์ ์กด์ฌํด์ผ ํ๋ฉฐ ์ญ์ ๋์ด์๋ ์ ๋ฉ๋๋ค. ๋น ํ ์คํธ๋ ๋๋ฝ๋ ๋์์ ๊ทธ๋ ค์ง์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ์๋ฒ์์ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค. ์๋ฒ์ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ง ์์ต๋๋ค. ๊ฒ์ ์ฐฝ์ด ์์ผ๋ฉด ์ธ๊ณ์์ ๋น๋ฌธ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๊ด๋ฆฌ์์ syslog๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
- UO.CharPrint(color, msg)๋ ์์ ์ ์บ๋ฆญํฐ๋ฅผ ์ ํํฉ๋๋ค. UO.CharPrint(id, color, msg)๋ ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. ๋ ํ์ ๋ชจ๋ 3 ๊ธ๊ผด์ ์ฌ์ฉํฉ๋๋ค. UO.ClientPrintEx์๋ SenderID, Color, Font, Text ์์๋ก ๋ค ๊ฐ์ง ์ธ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค.
- ๊ธ๊ผด ๋ฒํธ๋ ํฌ์ธํธ ํฌ๊ธฐ๋ Windows ๊ธ๊ผด ์ด๋ฆ์ด ์๋ UO์ ๋๋ค. ์ซ์๋ 0..255 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. ํน์ ๊ธ๊ผด์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ ๊ฒ์ ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์์์ 3๋ ์ผ๋ฐ ๊ธ๊ผด ๋ฒํธ์ ๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.ClientPrintEx ยท UO.AddToSystemJournalEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CharPrint");
UO.CharPrint(0x0044, "Ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ํ์ CharPrint๋ ํด๋น ๋ฌธ์ ์์ Ready๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ClientPrintEx๋ UO.Hex2Int(UO.GetSerial("self")๋ฅผ ํตํด serial๋ฅผ ์์ ํ๊ณ ํด๋น ๊ธ๊ผด์ ๋ช ์์ ์ผ๋ก 3์ ์ ๋ฌํฉ๋๋ค. ๋น๋ฌธ์๋ ๊ฒ์ ๋ชจ๋๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
UO.CharPrint(0x0044, "Ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target โ ๋ง์ง๋ง ํ๊ฒ์ serial. 0์ ์ด ์์์ ํ๊ทธํ ์ฌ๋์ด ์์์ ์๋ฏธํฉ๋๋ค. ์ ํ๋ ๋์ - ๋ก์ปฌ ์๋ช ๋ง: ๋์์ ๊ณต๊ฒฉ๋ฐ์ง ์์ผ๋ฉฐ ํ์ฑ ์๋ฒ ๋์์ ์ฑ์์ง์ง ์์ต๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
if (Truth(target != 0))
{
UO.CharPrint(target, 0x0044, "Selected target");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ShowWeightWarning๋ ์๋์ ์ ์ฒด ์ ์ธ๋์ด ์์ต๋๋ค. ๊ทธ๋ ๋ ์ฒด์ค์ ์๋ ค์ง ์์ ํ๊ณ์ ๋น๊ตํ๊ณ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ์บ๋ฆญํฐ ์์ ๊ธ์ ์๋๋ค. ์๋ฌด๊ฒ๋ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค. Convert.ToString๋ ๊ฐ์ค์น๋ฅผ ํ ์คํธ๋ก ๋ณํํฉ๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 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()
{
ShowWeightWarning(UO.Weight(), UO.MaxWeight());
return null;
}
void ShowWeightWarning(dynamic weight, dynamic maximum)
{
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.CharPrint(UO.Hex2Int(UO.GetSerial("self")), 0x0044, "Too heavy: " + Convert.ToString(weight));
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: color (Integer/String), msg (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CharPrint. -
InjectionScript.Runtime.InjectionApiUO.CharPrint:CharPrint(bridge.Self, color, msg). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CharPrint(int color, string msg) => CharPrint(bridge.Self, color, msg);๋งค๊ฐ๋ณ์: color (Integer/String), msg (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CharPrint. -
InjectionScript.Runtime.InjectionApiUO.CharPrint:CharPrint(bridge.Self, NumberConversions.ToInt(color), msg). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CharPrint(string color, string msg) => CharPrint(bridge.Self, NumberConversions.ToInt(color), msg);๋งค๊ฐ๋ณ์: id (Any/Integer), color (Any/Integer), msg (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CharPrint. -
InjectionScript.Runtime.InjectionApiUO.CharPrint:CharPrint(GetObject(id), NumberConversions.ToInt(color), (string)msg). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CharPrint(InjectionValue id, InjectionValue color, InjectionValue msg)
=> CharPrint(GetObject(id), NumberConversions.ToInt(color), (string)msg);๋งค๊ฐ๋ณ์: id (Any/Integer), color (Any/Integer), msg (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CharPrint. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CharPrint:bridge.CharPrint(id, color, msg).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CharPrint(int id, int color, string msg) => bridge.CharPrint(id, color, msg);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.CircleTrans();
void UO.CircleTrans(object? enabled);ํ์ฑ ํ๋กํ์ ํฌ๋ช ๋ ์ ์ค์ ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํฉ๋๋ค.
-
enabled- int: 0 ๋นํ์ฑํ, 0์ด ์๋ ๊ฐ์ ํ์ฑํ๋ฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ์ค์ ์ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค.
์ธ์ ์์ int 1/0; ์ธ์๊ฐ ์๋ ์์์ null์ ๋ฐํํฉ๋๋ค.
- ํ๋กํ ์์ด ์ฝ์ผ๋ฉด 0์ด ํ์๋ฉ๋๋ค. ํ๋กํ์ด ์๋ ํญ๋ชฉ์ ์ค๋ฅ๋ฅผ ์ธ์ํฉ๋๋ค. ํ๋กํ์ด ์์ผ๋ฉด UseCircleOfTransparency๋ฅผ ๋ณ๊ฒฝํ๊ณ ํ๋กํ์ ์ ์ฅํฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ์ ์๊ฐ์ ์ฌ์ฉ์ ์ ์์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CircleTrans();
UO.Print("CircleTrans: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ์ด๋ ํ๋กํ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
var enabled = UO.CircleTrans();
UO.Print(Convert.ToString(enabled));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ น์ ์ ํฌ๋ช ๋ ์์ด ์ผ์ง ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CircleTrans(1);
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()
{
var previous = UO.CircleTrans();
UO.CircleTrans(0);
UO.CircleTrans(previous);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CircleTrans. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CircleTrans:bridge.CircleTrans().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int CircleTrans() => bridge.CircleTrans();๋งค๊ฐ๋ณ์: enabled (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CircleTrans. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CircleTrans:bridge.CircleTrans(enabled).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CircleTrans(int enabled) => bridge.CircleTrans(enabled);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearFigures();๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์ง๋ ๋ชจ์๊ณผ ํด๋น ๋ฐํ์ ํญ๋ชฉ์ ์ญ์ ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- WorldMapGump.ClearYokoMapFigures ๋ฐ ์ํ.MapFigures๋ฅผ ์ง์๋๋ค. ๊ธฐ๋ณธ ์ง๋์ UserStatics๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ClearYokoMapFigures๋ ์งํ ์ค์ธ WorldMapGump์ ์ ์ ์์ง์ ์ง์ด ๋ค์, ๋ช ๋ น์ MapFigures์ ๋ฐํ์ ์ํ๋ฅผ ์ง์๋๋ค. ์ด ์ ๋ฆฌ ๋ฒ์๋ ํธ์ถ ์คํฌ๋ฆฝํธ์ ์ด๋ฆ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ํด๋ผ์ด์ธํธ ์ปฌ๋ ์ ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ์ผ๋ฐ ๋ง์ถค ์ง๋ ๋ผ๋ฒจ(userMarkers.usr)์ ์ ์ง๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearFigures");
UO.ClearFigures();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์ง๋ ๋ชจ์๊ณผ ํด๋น ๋ฐํ์ ํญ๋ชฉ์ ์ญ์ ํฉ๋๋ค.
UO.ClearFigures();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ง๋์ ๋ํ ๋ก์ปฌ ๋ชจ์์ ๋ง๋ ๋ค์ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ๋ชจ์์ ์ญ์ ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
dynamic[] figure = new dynamic[checked((int)(9) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = figure[2] + 1;
figure[5] = figure[3] + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
var figureId = UO.AddFigure(figure);
UO.ClearFigures();
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.ClearFigures();
UO.ClearFigures();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearMapFigures:bridge.ClearMapFigures().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearfigures":
bridge.ClearMapFigures();
state.MapFigures.Clear();
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearInfoWindow();ํด๋ผ์ด์ธํธ ํ ์คํธ ์ฐฝ์ ์ค์ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- TextClear ๋ฒํผ๋ฅผ ์ง์๋๋ค. ์ฐฝ์ด ์ด๋ ค ์์ผ๋ฉด ๋น ๋ด์ฉ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ฐฝ์ด ๋ฐ๋์ ๋ซํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearInfoWindow");
UO.ClearInfoWindow();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ผ์ด์ธํธ ํ ์คํธ ์ฐฝ์ ์ค์ ์ง์๋๋ค.
UO.ClearInfoWindow();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ถ๊ฐํ ํ ์คํธ ์ฐฝ ์ค์ ์ง์๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.FillInfoWindow("status");
UO.ClearInfoWindow();
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.ClearInfoWindow();
UO.ClearInfoWindow();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextClear:bridge.TextClear().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearinfowindow": bridge.TextClear(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ClientHide(object? objID);serial ๋ก๋๋ ์์ดํ ์ด๋ ClassicUO ๋์คํ๋ ์ด์ ๊ธฐํ ์บ๋ฆญํฐ(์ปจํ ์ด๋, ์ข ์ด์ธํ, ์ฅ์ฐฉ๋ ์์ดํ ํฌํจ)๋ฅผ ์จ๊น๋๋ค.
-
objIDโ ๋ก๋๋ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ: int ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์ ์ฅ๋ ์ด๋ฆ์ GetSerial(์ด๋ฆ)์ ์ฌ์ฉํ์ธ์. ๋งค๊ฐ๋ณ์๋ ํ์์ ๋๋ค. ๊ด๊ฒฝ์ ๋ํ๋์ง ์์ต๋๋ค.
int 1 ๋ธ๋ฆฌ์ง ๋ช ๋ น์ ์ ์กํ ํ. ๊ธฐ๋ก ๊ฒฐ๊ณผ๋ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ ์ ์๋ serial ๋๋ self ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ์๋ ์คํจ๋ฅผ ์ถ๋ ฅํ๊ณ ๋ฐํ์์ 1๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ์ ์ฑ๊ณต์ ์ธ ์จ๊ธฐ๊ธฐ ํ ์คํธ๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ํธํ์ฑ ๋ฉํ๋ฐ์ดํฐ์๋ object?๊ฐ ํ์๋ฉ๋๋ค.
- ์ ํํ ํ๋์ ์ธ์๊ฐ ํ์ํฉ๋๋ค. ๋ง์ฐ์ค๋ก ์ ํํ๋ ค๋ฉด UO.Hide()๋ฅผ ์ฌ์ฉํ์ธ์.
- Hide(serial)๋ ์๋ ค์ง ๋ก๋๋ ๊ฐ์ฒด์ ์ฆ์ ์๋ํฉ๋๋ค. graphic/type ๋์ ํน์ ์คํ/ํญ๋ชฉ์ serial๋ฅผ ์ ๋ฌํ์ธ์. ์ ํํ ์คํ์ ์์ ๊ด๊ณ์์ด ์์ ํ ์จ๊ฒจ์ง๋๋ค.
- ํญ๋ชฉ์ ์ปจํ ์ด๋์ ๋จ์ ์์ต๋๋ค. ์๋, ์์ ์, ์ฝํ ์ธ ๋ฐ ์๋ฒ ์ํ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. FindType/GetContent์์๋ ์์ง ์ฐพ์ ์ ์์ต๋๋ค. ์จ๊ธฐ๊ธฐ๋ ๊ฒ์ ํํฐ, ์ด์, ์ญ์ , ์จ๊ธฐ๊ธฐ ์คํฌ ๋๋ ์๋ฒ ์ธก ํฌ๋ช ํ๊ฐ ์๋๋๋ค.
- ์ผ๋ฐ ์ปจํ ์ด๋, ๊ฑฐ๋ ์ฐฝ ๋ฐ ์ ๋ฆฌํ ๊ทธ๋ฆฌ๋๋ ์จ๊ฒจ์ง ์์ดํ ์ ๊ทธ๋ฆฌ์ง ์์ผ๋ฉฐ ํด๋ฆญ/๋๋๊ทธ๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. ๋์ผํ ๋ก๋๋ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ ์ค์ธ ๋์ ์ฐฝ์ด ๋ค์ ์์ฑ๋๊ณ ๋ค์ ์ด๋ฆด ๋ ํ๋๊ทธ๊ฐ ์ ์ง๋ฉ๋๋ค.
- ์ฅ์ฐฉํ ์์ดํ ์ ์ข ์ด์ธํ, ์์ ์ฌ๋กฏ, ์บ๋ฆญํฐ ์ด๋ฏธ์ง์์ ์ฌ๋ผ์ง๋๋ค. ์ฅ์ฐฉ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์๋ฒ์ ๋ ์ด์ด, ๊ฐ์ท ๋ฐ ์ํ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์จ๊ฒจ์ง ๊ฐ์ด์ด ๋ ์ด์ ์์ท๊ณผ ๊ฒน์น์ง ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์บ๋ฆญํฐ ์ด๋ฏธ์ง๋ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ค์ ์ฅ๋น ๋ชฉ๋ก์ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- Hide๋ ์์ ์ ์บ๋ฆญํฐ, ํ ์ง, ์ ์ ์ ์จ๊ธฐ์ง ์์ต๋๋ค. ์กด์ฌํ์ง ์๋ serial๋ ๋ฉ์์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐฉ ์์ฒด๋ฅผ ์จ๊ฒจ๋ ์ด๋ฏธ ์ด๋ ค ์๋ ์ฝํ ์ธ ์ฐฝ์ ๋ซํ์ง ์์ผ๋ฉฐ, ํฌํจ๋ ๊ฐ ํญ๋ชฉ์ด ์๋์ผ๋ก ์จ๊ฒจ์ง์ง๋ ์์ต๋๋ค.
- ํ์ฌ API์๋ ๋ณ๋์ ์จ๊ธฐ๊ธฐ ํด์ ๋ช ๋ น์ด ์์ต๋๋ค. ์จ๊ธฐ๋ ๊ฒ์ ๋ก๋๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ธ๊ณ์์ ์ด๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ ๋ก๋ํ๋ฉด(์: ๋ค์ ์ฐ๊ฒฐํ ๋) ํ๋๊ทธ๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ๋จ์ํ ์์๋ฅผ ๋ซ๊ฑฐ๋ ์ฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์์ดํ ๋ฐํ์ด ๋ณด์ฅ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ClientHide(0x40001234);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID๋ type๊ฐ ์๋ ํน์ ํญ๋ชฉ์ ๋๋ค. ๋์คํ๋ ์ด์์ ์ฌ๋ผ์ง๊ณ ์ปจํ ์ด๋์ ๋จ์ ์์ต๋๋ค.
var item = 0x40001234;
if (Truth(UO.Exists(item)))
{
UO.ClientHide(item);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- FindType๋ backpack์์ ์ํ๋ ์์์ graphic 0x0EED๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ฐํ๋ serial๋ ClientHide๋ก ์ ์ก๋ฉ๋๋ค. ์ ์ฒด ์คํ์ด ์์ ํ ์จ๊ฒจ์ง๋๋ค.
return RunScenario();
object? RunScenario()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
UO.ClientHide(item);
UO.Print("Amount is still: " + Convert.ToString(UO.GetQuantity(item)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetSerial๋ ์ด์ ์ ์ ์ฅ๋ ์ฅ์ ์ด๋ฆ์ ํ์ธํฉ๋๋ค. ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ๋ฑ ๋ฌผํ์ ๋จผ์ ์ ์ฌํด์ผ ํฉ๋๋ค.
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 item = UO.GetSerial("decoration");
if (Truth(UO.Exists(item)) && Truth(item != UO.GetSerial("self")))
{
UO.ClientHide(item);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientHide:bridge.ClientHide(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clienthide": bridge.ClientHide(Arg(0)); return InjectionValue.True;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClientMarkChar(object? actionIndex, object? id);ํด๋ผ์ด์ธํธ ๋ผ๋ฒจ LastTarget ๋ฐ/๋๋ LastAttack์ ์ ๋ฐ์ดํธํฉ๋๋ค.
-
actionIndex- int: 1 - LastTarget; 2 - LastAttack; 3 - ๋ ๋ค. ๋ค๋ฅธ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ธ์ํฉ๋๋ค. -
idโ self/backpack/lasttarget/์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ผ๋ จ๋ฒํธ ๋๋ ์ง์๋๋ ์ด๋ฆ์ ๋๋ค. ์ซ์ ๋ฌธ์์ด๊ณผ 0x ๋ฌธ์์ด์ ๋ฐํ์์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ClientMarkChar ์๋ฒ ๋์์ ๊ณต๊ฒฉ์ ๋ณด๋ด๊ฑฐ๋ ์๋ตํ์ง ์๊ณ ์ ์ฅ๋ ๋์์ ์์ ํฉ๋๋ค. ํ์ ๋ช ๋ น์ ์ ๋ ์ด๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClientMarkChar");
UO.ClientMarkChar(1, "self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋์์ ๋๋ง์ ์บ๋ฆญํฐ๊ฐ ๋ฉ๋๋ค.
UO.ClientMarkChar(1,"self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์์ ๋์์ ๋ ํด๋ผ์ด์ธํธ ํ๊ทธ ๋ชจ๋์ ์ฌ์ฉ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.LastTarget();
if (Truth(UO.Exists(target)))
{
UO.ClientMarkChar(3, target);
}
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()
{
UO.ClientMarkChar(0, "self");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: actionIndex (Any), id (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ClientMarkChar. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientMarkChar:bridge.ClientMarkChar(NumberConversions.ToInt(actionIndex), GetObject(id)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(actionIndex). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ClientMarkChar(InjectionValue actionIndex, InjectionValue id)
=> bridge.ClientMarkChar(NumberConversions.ToInt(actionIndex), GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClientPrint(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, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.ClientPrint("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.ClientPrint("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.ClientPrint("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.ClientPrint("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.ClientPrintEx(object? senderID, object? color, object? font, object? text);๋ก๋๋ ๊ฐ์ฒด ์์ ์ฌ์ฉ์์๊ฒ๋ง ํ์๋๋ ๋น๋ฌธ(์: ์ ํํ ๋์์ ํ์ ๋๋ ์บ๋ฆญํฐ ์์ ๊ฒฝ๊ณ )์ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ์บ๋ฆญํฐ์ ๋ง์ด๋ ๊ฒ์์ฐฝ ํ๋จ์ ๋ฉ์์ง๊ฐ ์๋๋๋ค.
-
senderID๋ graphic/type ๋๋ ์ขํ๊ฐ ์๋ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ์ ๋๋ค. 3์ธ์ ํ์์ UO.CharPrint์ self, lasttarget ๋ฐ ์ ์ฅ๋ ๊ฐ์ฒด ์ด๋ฆ๋ ์ดํดํฉ๋๋ค. UO.ClientPrintEx์ SenderID์๋ UO.Hex2Int(UO.GetSerial("self")์ ๊ฐ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ธ์. ๋ฌธ์์ด ๋ณ์นญ์ ๊ฐ์ฒด๋ก ํ์ธ๋์ง ์์ต๋๋ค. -
color๋ UO hue์ด๊ณ , RGB๋ ์๋๋๋ค. ์ซ์์ ์ตํ์ 16 ๋นํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. 0x0044๋ ์์์ ๋๋ค. -1์ "๋ชจ๋ ์์"์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ 0xFFFF์ด ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ConColor ์์์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค. -
fontโ ํฌ์ธํธ ํฌ๊ธฐ๋ Windows ๊ธ๊ผด ์ด๋ฆ์ด ์๋ ๊ธ๊ผด ๋ฒํธ UO. ์ซ์๋ 0..255 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. ํน์ ๊ธ๊ผด์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ ๊ฒ์ ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์์์ 3๋ ์ผ๋ฐ ๊ธ๊ผด ๋ฒํธ์ ๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๊ฐ์ฒด๋ ๋ก๋๋ ์ธ๊ณ์ ์กด์ฌํด์ผ ํ๋ฉฐ ์ญ์ ๋์ด์๋ ์ ๋ฉ๋๋ค. ๋น ํ ์คํธ๋ ๋๋ฝ๋ ๋์์ ๊ทธ๋ ค์ง์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ์๋ฒ์์ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค. ์๋ฒ์ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ง ์์ต๋๋ค. ๊ฒ์ ์ฐฝ์ด ์์ผ๋ฉด ์ธ๊ณ์์ ๋น๋ฌธ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๊ด๋ฆฌ์์ syslog๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
- UO.CharPrint(color, msg)๋ ์์ ์ ์บ๋ฆญํฐ๋ฅผ ์ ํํฉ๋๋ค. UO.CharPrint(id, color, msg)๋ ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. ๋ ํ์ ๋ชจ๋ 3 ๊ธ๊ผด์ ์ฌ์ฉํฉ๋๋ค. UO.ClientPrintEx์๋ SenderID, Color, Font, Text ์์๋ก ๋ค ๊ฐ์ง ์ธ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค.
- ๊ธ๊ผด ๋ฒํธ๋ ํฌ์ธํธ ํฌ๊ธฐ๋ Windows ๊ธ๊ผด ์ด๋ฆ์ด ์๋ UO์ ๋๋ค. ์ซ์๋ 0..255 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. ํน์ ๊ธ๊ผด์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ ๊ฒ์ ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์์์ 3๋ ์ผ๋ฐ ๊ธ๊ผด ๋ฒํธ์ ๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.ClientPrintEx ยท UO.AddToSystemJournalEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClientPrintEx");
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ํ์ CharPrint๋ ํด๋น ๋ฌธ์ ์์ Ready๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ClientPrintEx๋ UO.Hex2Int(UO.GetSerial("self")๋ฅผ ํตํด serial๋ฅผ ์์ ํ๊ณ ํด๋น ๊ธ๊ผด์ ๋ช ์์ ์ผ๋ก 3์ ์ ๋ฌํฉ๋๋ค. ๋น๋ฌธ์๋ ๊ฒ์ ๋ชจ๋๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target โ ๋ง์ง๋ง ํ๊ฒ์ serial. 0์ ์ด ์์์ ํ๊ทธํ ์ฌ๋์ด ์์์ ์๋ฏธํฉ๋๋ค. ์ ํ๋ ๋์ - ๋ก์ปฌ ์๋ช ๋ง: ๋์์ ๊ณต๊ฒฉ๋ฐ์ง ์์ผ๋ฉฐ ํ์ฑ ์๋ฒ ๋์์ ์ฑ์์ง์ง ์์ต๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 0๋ก ํ์ธํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
if (Truth(target != 0))
{
UO.ClientPrintEx(target, 0x0044, 3, "Selected target");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ShowWeightWarning๋ ์๋์ ์ ์ฒด ์ ์ธ๋์ด ์์ต๋๋ค. ๊ทธ๋ ๋ ์ฒด์ค์ ์๋ ค์ง ์์ ํ๊ณ์ ๋น๊ตํ๊ณ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ์บ๋ฆญํฐ ์์ ๊ธ์ ์๋๋ค. ์๋ฌด๊ฒ๋ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค. Convert.ToString๋ ๊ฐ์ค์น๋ฅผ ํ ์คํธ๋ก ๋ณํํฉ๋๋ค.
- GetSerial๋ 16์ง์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Hex2Int๋ ์ซ์ 0์ ๋น๊ตํ๊ธฐ ์ ์ int๋ก ๋ฐ๊ฟ๋๋ค. ๋ฌธ์์ด "0x00000000"์ ์ซ์ 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()
{
ShowWeightWarning(UO.Weight(), UO.MaxWeight());
return null;
}
void ShowWeightWarning(dynamic weight, dynamic maximum)
{
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Too heavy: " + Convert.ToString(weight));
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: senderID (Any), color (Any), font (Any), text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CharPrintEx:bridge.CharPrintEx(Arg(0), Arg(1), Arg(2), Text(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(3).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clientprintex":
bridge.CharPrintEx(Arg(0), Arg(1), Arg(2), Text(3)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CloseClientUIWindow(object? uiWindowType, object? id);ํน์ ๊ฐ์ฒด์ ๋ํด ์ง์ ๋ ์ ํ์ ๋ก์ปฌ ํด๋ผ์ด์ธํธ ์ฐฝ์ ๋ซ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์บ๋ฆญํฐ์ ์ข ์ด ์ธํ, ์ํ, ๋ฐฐ๋ญ ์ฐฝ ๋ฑ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๊ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ซ์ง ์์ผ๋ฉฐ ์๋ฒ ๊ฒํ ๋ฒํผ์ ์๋ตํ์ง ์์ต๋๋ค.
-
uiWindowTypeโ ํ์ ์ซ์ ์ฐฝ ์ฝ๋: 0 โ ์ข ์ด์ธํ(์ฅ๋น), 1 โ ์บ๋ฆญํฐ ์ํ, 2 โ ํ๋กํ, 3 โ ์ปจํ ์ด๋. ์ด๊ฒ์ graphic/type ๋ณธ๋ฌธ๋ ์๋๊ณ ID ์๋ฒ ๊ฒํ๋ ์๋ 4๊ฐ์ ์ฝ๋๋ก ๊ตฌ์ฑ๋ ๋ณ๋์ ๋ชฉ๋ก์ ๋๋ค. ๋ค๋ฅธ ๋ฒํธ๋ ์ฐฝ์ ์ฐพ์ ์ ์์ต๋๋ค. -
idโ ์ฐฝ์ด ์ํ ๊ฐ์ฒด์ ์ผ๋ จ ๋ฒํธ: ์ ํ์ ๊ฒฝ์ฐ self/serial ๋ฌธ์ 0..2, 3 ์ ํ์ ๊ฒฝ์ฐ backpack/serial ์ปจํ ์ด๋. ์ซ์, 16์ง์ ๋ฌธ์์ด ๋๋ ํ์ธ ๊ฐ๋ฅํ ๊ฐ์ฒด ๋ณ์นญ์ ํ์ฉํฉ๋๋ค. ์ด๋ ๋ชฉ๋ก InfoGumps์ ์๋ ์ฐฝ ๋ฒํธ๊ฐ ์๋๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด ๋ณ์นญ์ 0๋ก ๋ณํ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ํธ์ถ์ var result = ๋ฐ if UO.CloseClientUIWindow(...) ์์ด ๋ณ๋์ ์ค์ ์์ฑ๋ฉ๋๋ค. ์ ํฉํ ์ด๋ฆฐ ์ฐฝ์ด ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ช ๋ น์ true/false๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
- ๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ์ฐฝ ํด๋์ค์ LocalSerial๊ฐ ๋ชจ๋ ๋น๊ต๋ฉ๋๋ค. (3, self)๋ก ์ฝํ๋ ๊ฒ์ ๋ฐฐ๋ญ์ ์๋ฏธํ์ง ์์ต๋๋ค. ๋ฐฐ๋ญ์๋ backpack๊ฐ ํ์ํฉ๋๋ค.
- ์ฐํ๋ ์ด ์ ํ/serial์ ์ด๋ ค ์์ง๋ง ์์ง ํ๊ดด๋์ง ์์ ์ฐฝ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ผ์นํ๋ ๋ชจ๋ ์ฐฝ์ ๊ฒ์ ์ค๋ ๋์์ ๋ซํ๋๋ค. ๋๋จธ์ง ์ฐฝ์ ์ด๋ ค ์์ต๋๋ค.
- ์ธํฐํ์ด์ค๊ฐ ๋ซํ๊ณ ํญ๋ชฉ์ด ์ปจํ ์ด๋์์ ์ ๊ฑฐ๋์ง ์์ผ๋ฉฐ ์บ๋ฆญํฐ๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง์ง ์์ต๋๋ค. ๋ฐ๋ณตํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์ฐฝ์ด ์ด๋ฏธ ๋ซํ ์์ผ๋ฉด ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ต๋๋ค.
- ์๋ฒ ์ธก ๋ํ ์์์ ๊ฒฝ์ฐ UO.CloseSimpleGump ๋ฐ UO.NumGumpButton์ ์ฐ๊ตฌํ์ธ์. ์ด ๋ช ๋ น์ ์ฝ๋ 0..3๋ ์ฌ๊ธฐ์ ์ ์ฉ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CloseClientUIWindow");
UO.CloseClientUIWindow(0, "self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ์ฅ๋น ์ฐฝ๋ง ๋ซํ๋๋ค. ๊ทธ์ ์ํ, ํ๋กํ ๋ฐ ๋ฐฐ๋ญ์ ๋ณ๋์ ์ฐฝ์ผ๋ก ์ ์ง๋ฉ๋๋ค.
UO.CloseClientUIWindow(0, "self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ๋ญ์ด ์ด๋ฆฌ์ง ์์ ๊ฒฝ์ฐ ํด๋น ์์ ์ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ํญ๋ชฉ์ ์ด๋ํ์ง ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()) && Truth(UO.Exists("backpack")))
{
UO.CloseClientUIWindow(3, "backpack");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1 - ์ํ, 2 - ํ๋กํ. id๋ ์ ํ๋ mobile์ serial์ ๋๋ค. ASC(text,0) ์ฌ๊ธฐ์๋ ๋ฌธ์์ด serial๋ฅผ ์ฌ๋ถ์ 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 selected = Asc(UO.GetSerial("lasttarget"), 0);
CloseMobilePanels(selected);
return null;
}
void CloseMobilePanels(dynamic id)
{
if (Truth(id == 0) || !(Truth(UO.Exists(id))))
{
return;
}
UO.CloseClientUIWindow(1, id);
UO.CloseClientUIWindow(2, id);
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: uiWindowType (Any), id (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseClientWindow:bridge.CloseClientWindow(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "closeclientuiwindow": bridge.CloseClientWindow(Arg(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CloseHandle();Client.Game.Exit๋ฅผ ํตํด ํ์ฌ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋๋ก ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- CloseUO์ ๊ฐ์ ๋ค๋ฆฌ๋ก ํฅํ๊ณ ์์ต๋๋ค. CloseHandle. ์ข ๋ฃ๋ ๊ฒ์ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค. Client.Game์ด ๋๋ฝ๋ ๊ฒฝ์ฐ ์๋ฌด๋ฐ ์กฐ์น๋ ์ทจํ์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ณ๋์ ๊ฒํ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ด ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CloseHandle");
UO.CloseHandle();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.CloseHandle();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ์ด๋ ์กฐ๊ฑด์ ๋ณด์ฌ์ค๋๋ค. 0 ๊ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ด๋ฆฐ ์ํ๋ก ์ ์งํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var finishClient = 0;
if (Truth(finishClient))
{
UO.CloseHandle();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 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()
{
FinishClient(0);
return null;
}
void FinishClient(dynamic enabled)
{
if (Truth(enabled))
{
UO.CloseHandle();
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CloseHandle. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseHandle:bridge.CloseHandle().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CloseHandle() => bridge.CloseHandle();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CloseSimpleGump(object? gumpIndex);์๊ฒฉํ ์ธ๋ฑ์ค์ ์ํด ๋ซํ ์ ์๋ ์๋ฒ ๊ฒํ๋ฅผ ๋ก์ปฌ์์ ๋ซ์ต๋๋ค.
-
gumpIndexโ ํ์ int โ 0๋ถํฐ GetGumpsCount()-1๊น์ง ํ์ฑ ์๋ฒ ๊ฒํ์ ์ธ๋ฑ์ค์ ๋๋ค. GumpID/serial๊ฐ ์๋๋๋ค. ๋ชฉ๋ก ์ธ๋ถ์ ์์์ ์ธ๋ฑ์ค๋ ์ ํจํ์ง ์์ต๋๋ค. ์ฐฝ์ ์ด๊ณ ๋ซ๊ณ ์ฌ์ ๋ ฌํ๋ฉด ์์ธ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํ๋ํ๊ธฐ ์ ์ GetGumpID/GetGumpSerial๋ฅผ ํ์ธํ์ธ์.
void - ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์๋ฒ์ ํ์ธ์ด๋ bool๋ก ํด์๋์ด์๋ ์ ๋ฉ๋๋ค.
- ํ์ฑ ์๋ฒ ๊ฒํ์ ํจ๊ป ์๋ํฉ๋๋ค. ๋ฐฐ๋ญ, ์ง๋, ์ค์ ๋ฐ ๊ธฐํ ๋ก์ปฌ ์ฐฝ์ ์ด ๋ชฉ๋ก์ ํฌํจ๋์ง ์์ต๋๋ค. ํ ๋ฒ์ ํธ์ถ์ ๊ฒ์ ์ค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ํตํ๋ง๋ค ๋ชฉ๋ก์ ์ํ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ์๋ชป๋ ์ธ๋ฑ์ค ๋ฐ NoClose๋ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฒํผ ์๋ต์ ์๋ฒ๋ก ๋ณด๋ด์ง ์์ต๋๋ค. ์ด ๋ต๋ณ์๋ SendGumpSelect๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ซ์ผ๋ฉด ๋ชฉ๋ก๊ณผ ์ธ๋ฑ์ค๊ฐ ์์ ๋ฉ๋๋ค. ์ผ๊ด ์ข ๋ฃํ๋ ค๋ฉด ๋ง์ง๋ง ์ธ๋ฑ์ค๋ถํฐ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ๋ชฉ๋ก์ ์ํํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CloseSimpleGump");
UO.CloseSimpleGump(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0์ ID๊ฐ ์๋ ์ธ๋ฑ์ค์ ๋๋ค. ์ฐฝ์ ๋ซ์ ์ ์์ผ๋ฉด ์ด๋ฆฐ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
UO.CloseSimpleGump(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ญ์ํ๋ ๋ง๊ฐ ํ ์ง์ ์ด๋์ ์ํฅ์ ์ค์ ๋๋ค. ์ ์ฐฝ์ ๋์์ ์ด ๋ ๋ชฉ๋ก์ ๋ค์ ํ์ธํ์ธ์.
return RunScenario();
object? RunScenario()
{
var i = UO.GetGumpsCount() - 1;
while (Truth(i >= 0))
{
UO.CloseSimpleGump(i);
i = i - 1;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- info[1] - GumpID๊ฐ ์ ์ฅ๋์์ต๋๋ค. ์์ ์ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ณ์์ ํ ๋น๋์ง ์์ต๋๋ค.
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 info = UO.GetGumpInfo(0);
if (Truth(ArrayLength(info) == 5))
{
UO.CloseSimpleGump(0);
UO.Print(Hex(info[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: gumpIndex (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseSimpleGump:bridge.CloseSimpleGump(Arg(0)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "closesimplegump":
if (bridge is IApiGumpAccess gumpAccess) gumpAccess.CloseGumpAtIndex(Arg(0));
else bridge.CloseSimpleGump(Arg(0));
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ColorPrint(object? color, object? msg);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
-
color- UO hue, RGB ์๋. ์ซ์ ๋๋ 16์ง์ ๋ฌธ์์ด. ๋ธ๋ฆฌ์ง๋ ๋ฎ์ 16 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. graphic/type์ ํผ๋ํ์ง ๋ง์ธ์. ์์์์๋ 0x0044๊ฐ ์ ํ๋ hue์ ๋๋ค. ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.ColorPrint(0x0044, "Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.ColorPrint(0x0044, "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.ColorPrint(0x0044, "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.ColorPrint(0x0044, "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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: color (Any), msg (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ColorPrint. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Print:bridge.Print(NumberConversions.ToInt(color), msg.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
InjectionScript.Runtime.InjectionValue.ToString:msg.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ColorPrint(InjectionValue color, InjectionValue msg) => bridge.Print(NumberConversions.ToInt(color), msg.ToString());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ConColor(object? color);์ด ์คํฌ๋ฆฝํธ ๋ฐํ์์ ํ์ ์์คํ ๋ฉ์์ง์ ๋ํด UO hue๋ฅผ ์ค์ ํฉ๋๋ค.
-
color- UO hue, RGB ์๋. ์ซ์ ๋๋ 16์ง์ ๋ฌธ์์ด. ๋ธ๋ฆฌ์ง๋ ๋ฎ์ 16 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. graphic/type์ ํผ๋ํ์ง ๋ง์ธ์. ์์์์๋ 0x0044๊ฐ ์ ํ๋ hue์ ๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ํ์ UO.ClientPrint, UO.AddToJournal ๋ฐ UO.AddToSystemJournal์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด์ ์ค์ ๋ค์ ์น ํ์ง ์๊ณ , SpeechHue ํ๋กํ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ์์ ์ธ์ ์์ด UO.Print์ ์์์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์์ getter๋ ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ ํํ ์ผ๋ฐ hue๋ฅผ ํด๋น ๋ณ์์ ์ ์ฅํ์ธ์.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ConColor");
UO.ConColor(0x0044);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0044์ ๋ค์ ์์คํ ๋ผ์ธ์ ์์์ด ๋ฉ๋๋ค. ConColor ์์ฒด๋ ์๋ฌด๊ฒ๋ ์ธ์ํ์ง ์์ต๋๋ค.
UO.ConColor(0x0044);
UO.AddToSystemJournal("Notice");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ๋ฐ Print์ 0x03B2 ์์์ ์ ์งํ๊ณ AddToJournal๋ ์ง์ ๋ 0x0044๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ฉ์์ง ๋ชจ๋ ๋ก์ปฌ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ConColor(0x0044);
UO.Print("Normal Print color");
UO.AddToJournal("System color");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- usualHue=0x0440๋ ์ฝ์ ์ด์ ๊ฐ์ด ์๋๋ผ ๋ถ๋ช
ํ ์ ํ๋ ์ผ๋ฐ ์์์
๋๋ค. ์๋๋ ์์ 0x0035๋ฅผ ์ฌ์ฉํฉ๋๋ค.
finally๋ usualHue๋ฅผ ๋ฐํํ๊ณ ๋ค์ ์ค์ ๋ค์ ์ผ๋ฐ ์์์ผ๋ก ์ธ์๋ฉ๋๋ค.
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 usualHue = 0x0440;
UO.ConColor(usualHue);
try
{
UO.ConColor(0x0035);
UO.AddToSystemJournal("Temporary warning");
}
finally
{
UO.ConColor(usualHue);
}
UO.AddToSystemJournal("Normal messages again");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ConColor. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ConColor(InjectionValue color)
{
systemMessageColor = NumberConversions.ToInt(color);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ConsolePrint(object? msg);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
- ์ด๋ฆ์ ์ฝ์์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด๋ ๋ณ๋์ Windows ํฐ๋ฏธ๋์ด ์๋ ๋์ผํ ๋ก์ปฌ ๊ฒ์ ์ถ๋ ฅ์ ๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.ConsolePrint("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.ConsolePrint("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.ConsolePrint("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.ConsolePrint("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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: msg (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ConsolePrint. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Print:bridge.Print(msg.ToString()). -
InjectionScript.Runtime.InjectionValue.ToString:msg.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ConsolePrint(InjectionValue msg) => bridge.Print(msg.ToString());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FillInfoWindow(object? s);ํ ์คํธ ์ฐฝ์ ํ ์ค์ ์ถ๊ฐํ์ฌ ํ์ํฉ๋๋ค.
-
sโ ์ค ํ ์คํธ; ๊ฐ์ string๋ก ๋ณํ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ด์ ์ ๋์ ๋ ํ์ MaxTextWindowLines ํ๋๊น์ง ์ ์ง๋ฉ๋๋ค.
- TextPrint๋ ํ ์ค์ ์ถ๊ฐํ๊ณ YokoTextWindowGump ์์ฒด๋ฅผ ํ์ํฉ๋๋ค. TextOpen๋ ์ด๋ฆฐ ์ํ๋ฅผ ํ๋ณดํฉ๋๋ค. ๋ฒํผ๊ฐ ์ค๋ฒํ๋ก๋๋ฉด ๊ฐ์ฅ ์ค๋๋ ์ค์ด ์ญ์ ๋ฉ๋๋ค. ์ด๊ฒ์ ์๋ฒ ๊ฒํ๋ ์๋๊ณ UO.GetInfo๋ ์๋ ๋ณ๋์ ํ ์คํธ ์ฐฝ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FillInfoWindow");
UO.FillInfoWindow("Status ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ์คํธ๊ฐ ํด๋ผ์ด์ธํธ ํ ์คํธ ์ฐฝ์ผ๋ก ์ ์ก๋ฉ๋๋ค.
UO.FillInfoWindow("Status ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์คํธ๋ง์ ๊ตญ๋ถ ์ ๋ฅ HP๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var status = "HP: " + Convert.ToString(UO.GetHP());
UO.FillInfoWindow(status);
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.FillInfoWindow("first");
UO.FillInfoWindow("second");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: s (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextPrint:bridge.TextPrint(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextOpen:bridge.TextOpen().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "fillinfowindow":
bridge.TextPrint(Text(0));
bridge.TextOpen();
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FillNewWindow(object? s);ํ ์คํธ ์ฐฝ์ ์ง์ฐ๊ณ ํ ์ค์ ์ถ๊ฐํ์ฌ ํ์ํฉ๋๋ค.
-
sโ ์ค ํ ์คํธ; ๊ฐ์ string๋ก ๋ณํ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- TextPrint ์ด์ ์๋ TextClear์ด ์คํ๋ฉ๋๋ค. ์ด์ ์ ๋์ ๋ ํ์ด ์ญ์ ๋ฉ๋๋ค.
- TextPrint๋ ํ ์ค์ ์ถ๊ฐํ๊ณ YokoTextWindowGump ์์ฒด๋ฅผ ํ์ํฉ๋๋ค. TextOpen๋ ์ด๋ฆฐ ์ํ๋ฅผ ํ๋ณดํฉ๋๋ค. ๋ฒํผ๊ฐ ์ค๋ฒํ๋ก๋๋ฉด ๊ฐ์ฅ ์ค๋๋ ์ค์ด ์ญ์ ๋ฉ๋๋ค. ์ด๊ฒ์ ์๋ฒ ๊ฒํ๋ ์๋๊ณ UO.GetInfo๋ ์๋ ๋ณ๋์ ํ ์คํธ ์ฐฝ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FillNewWindow");
UO.FillNewWindow("Status ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ์คํธ๊ฐ ํด๋ผ์ด์ธํธ ํ ์คํธ ์ฐฝ์ผ๋ก ์ ์ก๋ฉ๋๋ค.
UO.FillNewWindow("Status ready");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์คํธ๋ง์ ๊ตญ๋ถ ์ ๋ฅ HP๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var status = "HP: " + Convert.ToString(UO.GetHP());
UO.FillNewWindow(status);
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.FillNewWindow("first");
UO.FillNewWindow("second");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: s (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextClear:bridge.TextClear(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextPrint:bridge.TextPrint(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextOpen:bridge.TextOpen().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "fillnewwindow": bridge.TextClear(); bridge.TextPrint(Text(0)); bridge.TextOpen(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FontColor(object? color);hue๋ฅผ ์ด ์คํฌ๋ฆฝํธ์ ํ์ ๋ก์ปฌ UO.UOAMessage๋ก ์ค์ ํฉ๋๋ค. ์บ๋ฆญํฐ์ ์์ฑ ์์, ์ผ๋ฐ UO.Print, InfoFindList ๋๋ IDE ํ ๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
-
colorโ ํ์ ์ซ์ ์ธ๋ฑ์ค hue 0..65535(์: 0x0044). ์ด๊ฒ์ RGB์ด ์๋๋๋ค. int๋ ๋ด๋ถ์ ์ ์ฅ๋๋ฉฐ, ์ถ๋ ฅ์ด ushort๋ก ์ค์ด๋ค๋ฉด; -1์ ์ฌ์ค์ ์ ์๋ฏธํ์ง ์์ผ๋ฉฐ 65535๊ฐ ๋ฉ๋๋ค. ์ ๋ฐํ์์ ์ด๊ธฐ ๊ฐ์ 0x03B2์ ๋๋ค. ๋ ผ์์ด ์์ผ๋ฉด ํ์๋ ์์ต๋๋ค.
void: ๊ฒฐ๊ณผ ์์, ์ค๋๋ ์์ ๋๋ ์ฑ๊ณต ๊ธฐํธ. ๋์ค์ ์ค์ ์ ๋๋๋ฆฌ๋ ค๋ฉด ์ ํํ hue๋ฅผ ์คํฌ๋ฆฝํธ ๋ณ์์ ์ ์ฅํ์ธ์.
- ์ํ๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค.FontColor, ๋ฉ์์ง๋ฅผ ์ธ์ํ๊ฑฐ๋ ๋คํธ์ํฌ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๋์ผํ ๋ฐํ์์์ ๋ค์ FontColor๊น์ง ์ ํจํฉ๋๋ค. ๋ ๋ค๋ฅธ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ์๋ ์์ฒด ์ํ๊ฐ ์์ต๋๋ค. UO.Print(text,color)๋ ์์์ ์ง์ ์ค์ ํ๊ณ FontColor๋ฅผ ์ฝ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FontColor");
UO.FontColor(0x0021);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0021 โ ์์ธ hue; ์ต์ข ์์์ ํด๋ผ์ด์ธํธ์ ์์ ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ฉ์์ง๋ ๋ก์ปฌ์์ ๋ณผ ์ ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ๋งํ์ง ์์ต๋๋ค.
UO.FontColor(0x0021);
var first = UO.FindList("0x0EED", "backpack");
if (Truth(first == ""))
{
UO.UOAMessage("No gold in the loaded backpack");
}
else
{
UO.UOAMessage("Gold units: " + Convert.ToString(UO.FindFullQuantity()));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฒด ๊ณต์ง์๋ ํ ์คํธ์ hue๊ฐ ํ์ฉ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ค์น๋ hue๋ ์ด ๋ฐํ์์ ๋ค์ UOAMessage์๋ ๋จ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์๋ ์ฝ์ ์ ์๋ ๋ด์ฅ FontColor()์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
Notice("Supplies checked", 0x0044);
Notice("Restock needed", 0x0021);
return null;
}
void Notice(dynamic text, dynamic hue)
{
UO.FontColor(hue);
UO.UOAMessage(text);
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x03B2 โ ์ ๋ฐํ์์ ์ด๊ธฐ ๊ฐ FontColor. ๋ง์ง๋ง์ผ๋ก ์ ์์ ์ธ ์๋ฃ/์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ํํ ๊ธฐ๋ฐ์ ์ ํํ๊ฒ ๋ฐํํฉ๋๋ค. ์ ์ ์๋ ์ด์ ๊ฐ์ ๋ณต์๋์ง ์์ต๋๋ค.
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 baseHue = 0x03B2;
try
{
UO.FontColor(0x0021);
UO.UOAMessage("Check the route before moving");
}
finally
{
UO.FontColor(baseHue);
}
UO.UOAMessage("Ready");
UO.Print("Regular Print keeps its own color");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, state.FontColor).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "fontcolor": state.FontColor = Arg(0, state.FontColor); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.HelpRequest();์๋ฒ ๋์๋ง ๋ฉ๋ด๋ฅผ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteClientApiCompatibility๋ HelpRequest์ ํธ์ถํ๊ณ Invoke๋ฅผ ํตํด GameActions.RequestHelp๋ฅผ ๋ณด๋ ๋๋ค. ๋ฉ๋ด์ ๋ด์ฉ์ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.HelpRequest");
UO.HelpRequest();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ ๋์๋ง ๋ฉ๋ด๋ฅผ ์์ฒญํฉ๋๋ค.
UO.HelpRequest();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ HelpRequest์ ํธ์ถํ๊ณ Invoke๋ฅผ ํตํด GameActions.RequestHelp๋ฅผ ๋ณด๋ ๋๋ค. ๋ฉ๋ด์ ๋ด์ฉ์ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsOnline()))
{
UO.HelpRequest();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
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.IsOnline()))
{
UO.HelpRequest();
UO.Print("Help requested");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.HelpRequest:bridge.HelpRequest().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "helprequest": bridge.HelpRequest(); return InjectionValue.Unit;void UO.Hide();
void UO.Hide(object? serial);
string UO.Hide(object? type, object? x, object? y);
string UO.Hide(object? type, object? x, object? y, object? z);Hide๋ ๋ก๋๋ ๋ฌผ์ฒด๋ฅผ ๋ก์ปฌ์์ ์จ๊ธฐ๋ฉฐ Hiding ๊ธฐ์ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. Resend/Resync๋ ์ด ์จ๊น์ ํด์ ํ๊ณ ์ด์ ๊ทธ๋ฆฌ๊ธฐ ์ํ๋ฅผ ๋ณต์ํฉ๋๋ค. Hide๋ฅผ ๋ฐ๋ณตํ ๊ฒฝ์ฐ๋ ๊ฐ์ต๋๋ค. ๋ฌผ์ฒด ๋ฐ์ดํฐ์ ์๋ฒ Hidden ํ๋๊ทธ๋ ๋ฐ๋์ง ์์ต๋๋ค.
-
serialโ ๊ฐ์ฒด ์๋ฆฌ์ผ ๋ฒํธ ๋๋ ์ ์ฅ๋ ๋ณ์นญ. -
typeโ ์์ดํ ๊ทธ๋ํฝ ID. -1์ ์ง์ ์์น์ ๋ชจ๋ ์ข ๋ฅ์ ์ผ์น. -
xโ ์๋ X ์ขํ. -
yโ ์๋ Y ์ขํ. -
zโ Z ๋์ด. ์งง์ ํ์์ 0 ์ฌ์ฉ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#hide
#hide id 0x40001234
#hide type 0x0EED
#hide xy 1450 1690
#hide type 0x0EED xy 1450 1690 0
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.Hide(0x40001234);UO.Print(UO.Hide(0x0EED, 1450, 1690, 0));foreach (int serial in new[] { 0x40001234, 0x40005678 })
UO.Hide(serial);new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.Hide(0x40001234);
}
}CSharpGameApi.Hide
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.Hide
ClassicUOInjectionApiBridge -> target / serial / type-position selection
-> local hidden-object state -> renderer visibility
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Morph(object? @type);ํ์ฌ ์บ๋ฆญํฐ์ graphic๋ฅผ ๋ก์ปฌ์์ ๋ณ๊ฒฝํฉ๋๋ค.
-
type- int body graphic ๋๋ ResolveType๋ก ํด๊ฒฐ๋ ๋ฌธ์์ด type. 0๋ ์ฒซ ๋ฒ์งธ Morph์ ์ ์ฅ๋ graphic์ ๋ณต์ํฉ๋๋ค. 0์ด ์๋ ์ซ์๋ ushort๋ก ์ค์ด๋ญ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Bridge.Morph ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ฒ์ ํธ์ถ๋๋ฉด _originalGraphic์ ์ ์ฅํ ๋ค์ Player.Graphic์ ํ ๋นํฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ด๋ ๋ฐํ์ ์ ๋ฐ์ดํธ ticksAnim=Timer.
- ์ด๋ ์๋ฒ ๋ณ์ ์ด๋ ์ข ์กฑ/์ฌ์ฉ ๊ฐ๋ฅ ์คํฌ์ ๋ณํ๊ฐ ์๋ ๋ก์ปฌ ๋ชจ์ต์ ๋๋ค. ushort ์ธ๋ถ์ ๊ฐ์ ์ด ๋ธ๋ฆฌ์ง ๊ธฐ๋ฅ์ผ๋ก ํ์ธ๋์ง ์์ผ๋ฉฐ 16 ๋นํธ๋ก ๊ฐ์๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Morph");
UO.Morph("0x0190");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์บ๋ฆญํฐ์ graphic๋ฅผ ๋ก์ปฌ์์ ๋ณ๊ฒฝํฉ๋๋ค.
UO.Morph("0x0190");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.Morph ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ฒ์ ํธ์ถ๋๋ฉด _originalGraphic์ ์ ์ฅํ ๋ค์ Player.Graphic์ ํ ๋นํฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ด๋ ๋ฐํ์ ์ ๋ฐ์ดํธ ticksAnim=Timer.
return RunScenario();
object? RunScenario()
{
UO.Morph(0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ์๋ฒ ๋ณ์ ์ด๋ ์ข ์กฑ/์ฌ์ฉ ๊ฐ๋ฅ ์คํฌ์ ๋ณํ๊ฐ ์๋ ๋ก์ปฌ ๋ชจ์ต์ ๋๋ค. ushort ์ธ๋ถ์ ๊ฐ์ ์ด ๋ธ๋ฆฌ์ง ๊ธฐ๋ฅ์ผ๋ก ํ์ธ๋์ง ์์ผ๋ฉฐ 16 ๋นํธ๋ก ๊ฐ์๋ฉ๋๋ค.
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.Morph("0x0190");
UO.Wait(500);
UO.Morph(0);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Morph. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Morph:bridge.Morph(type). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Morph(int type)
{
bridge.Morph(type);
ticksAnim = Timer();
}๋งค๊ฐ๋ณ์: type (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Morph. -
InjectionScript.Runtime.InjectionApiUO.Morph:Morph(ResolveType(type)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Morph(string type) => Morph(ResolveType(type));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.OpenIDE();
void UO.OpenIDE(object? filePath);-
filePathโ ์ ํ์ ๊ฒฝ๋ก. ๊ณต๋ฐฑ/๊ณต๋ฐฑ - ํ์ผ์ ์ ํํ์ง ์๊ณ ํธ์ง๊ธฐ๋ฅผ ์ฝ๋๋ค. ์๋๋ _manager.AutoloadPath์์ ํ์ธ๋๋ฉฐ ์ ๋๊ฐ์ ์ ์ง๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Bridge.OpenIDE๋ ์์ฒญ๋ ๊ฒฝ๋ก๋ฅผ ์ค๋นํ ๋ค์ Invoke ํธ์ถ YokoScriptEditorGump.Open(_world,requested)์ ํธ์ถํฉ๋๋ค. ํ์ผ์ ์คํฌ๋ฆฝํธ๋ OpenIDE ๋ช ๋ น์ผ๋ก ์คํ๋์ง ์์ต๋๋ค.
- ํธ์ง๊ธฐ๋ ์ธ๋ถ Launch ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ๊ทธ๋ํฝ ์ฐฝ์ ๋๋ค. ํ์ผ ์ฝ๊ธฐ/ํ์๋ ๊ฒฝ๋ก ๋ฐ ํธ์ง๊ธฐ ๋ ผ๋ฆฌ์ ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.OpenIDE");
UO.OpenIDE();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ทธ๋ํฝ ํธ์ง๊ธฐ C# IDE๋ฅผ ์ฝ๋๋ค.
UO.OpenIDE();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.OpenIDE๋ ์์ฒญ๋ ๊ฒฝ๋ก๋ฅผ ์ค๋นํ ๋ค์ Invoke ํธ์ถ YokoScriptEditorGump.Open(_world,requested)์ ํธ์ถํฉ๋๋ค. ํ์ผ์ ์คํฌ๋ฆฝํธ๋ OpenIDE ๋ช ๋ น์ผ๋ก ์คํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.OpenIDE("Example.csx");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ง๊ธฐ๋ ์ธ๋ถ Launch ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ๊ทธ๋ํฝ ์ฐฝ์ ๋๋ค. ํ์ผ ์ฝ๊ธฐ/ํ์๋ ๊ฒฝ๋ก ๋ฐ ํธ์ง๊ธฐ ๋ ผ๋ฆฌ์ ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
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 path = "C:\\UO Scripts\\Example.csx";
UO.OpenIDE(path);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.OpenIDE. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenIDE:bridge.OpenIDE(string.Empty).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void OpenIDE() => bridge.OpenIDE(string.Empty);๋งค๊ฐ๋ณ์: filePath (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.OpenIDE. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenIDE:bridge.OpenIDE(filePath.ToString()). -
InjectionScript.Runtime.InjectionValue.ToString:filePath.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void OpenIDE(InjectionValue filePath) => bridge.OpenIDE(filePath.ToString());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Print(object? msg);
void UO.Print(object? msg, object? color);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
-
color- UO hue, RGB ์๋. ์ซ์ ๋๋ 16์ง์ ๋ฌธ์์ด. ๋ธ๋ฆฌ์ง๋ ๋ฎ์ 16 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. graphic/type์ ํผ๋ํ์ง ๋ง์ธ์. ์์์์๋ 0x0044๊ฐ ์ ํ๋ hue์ ๋๋ค. ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
UO.Print("C# script started");
UO.Print($"Position: {UO.GetX()}, {UO.GetY()}");๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.Print("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ ์ฝ์ด์ต๋๋ค. 0/์ ์ ์๋ ์ต๋๊ฐ์ ๊ณผ๋ถํ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. ๋ฌด๊ฒ๊ฐ ์ต๋๊ฐ๋ณด๋ค ํฌ๋ฉด ํ ์ค์ด ์ธ์๋๊ณ Main์ด ๋๋ฉ๋๋ค. ๋ฌผ๊ฑด์ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.Print("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum), 0x0044);
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.Print("Weight changed: " + Convert.ToString(current), 0x0044);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: msg (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Print. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Print:bridge.Print(msg.ToString()). -
InjectionScript.Runtime.InjectionValue.ToString:msg.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Print(InjectionValue msg)
{
bridge.Print(msg.ToString());
}๋งค๊ฐ๋ณ์: msg (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Print. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Print:bridge.Print(NumberConversions.ToInt(color), msg.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
InjectionScript.Runtime.InjectionValue.ToString:msg.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Print(InjectionValue msg, InjectionValue color)
{
bridge.Print(NumberConversions.ToInt(color), msg.ToString());
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.RemoveFigure(object? figureID);ID๋ก ์ง์ญ ์ง๋ ๊ทธ๋ฆผ์ ์ญ์ ํฉ๋๋ค.
-
figureID- int ID, AddFigure๋ฅผ ๋ฐํํ์ต๋๋ค. ์ด๊ฒ์ serial ์์ดํ ๋ ์๋๊ณ ID ๊ฒํ๋ ์๋๋๋ค.
int โ ๋ธ๋ฆฌ์ง์ ๊ฒฐ๊ณผ.RemoveMapFigure: 1/0 ์ ๊ฑฐ๋ ๊ทธ๋ฆผ์ ์กด์ฌ ์ฌ๋ถ. ๋ธ๋ฆฟ์ง ๊ฒฐ๊ณผ์ ๊ด๊ณ์์ด ๋ฐํ์ ํญ๋ชฉ์ด ์ญ์ ๋ฉ๋๋ค.
- ๋จผ์ bridge.RemoveMapFigure๋ฅผ ํธ์ถํ ๋ค์ state.MapFigures.Remove(id)๋ฅผ ํธ์ถํ๊ณ ๋ธ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์ ์์ ID๋ ๋ชจ์์ ์์ฑํ์ง ์๊ฑฐ๋ ์๋ฒ ์์ ์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค.
- ์ง๋์ ์ง์ญ์ ๋ชจ์ต์ ์ธ๊ณ์ ๋์์ด ์๋๋ค. ๋ค๋ฅธ ๋ชจ์๊ณผ ์๋ฒ ํ์์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- WorldMapGump๋ ํ๋ก์ธ์ค์ ์ ์ ์ฌ์ ์ ๊ทธ๋ฆผ์ ์ ์ฅํฉ๋๋ค. ํ ์ธ๊ณ/ํ๋กํ์ ์ผ๋ฐ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก๋ ๊ณตํต GetPersistentState ๋ฐ ์นด์ดํฐ ID๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ณ ๊ด๋ฆฌ์ ํ๋ก์ธ์ค๋ ๋๋ฉด์ ๊ณต์ ํ์ง ์์ต๋๋ค. World.Clear/YokoScripts.Clear ๋ฐ ํ๋กํ ๋ก๋ ๋ก๋๋ ์ด ์ฌ์ ์ ์ง์ฐ๊ฑฐ๋ ๋ณต์ํ์ง ์์ต๋๋ค(๋ก๋๋ UserStatics๋ง ๋ณต์ํฉ๋๋ค). ๋ฐ๋ผ์ ๋๋ฉด์ worldNum๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ผํ ํ๋ก์ธ์ค์์ ์๋/ํ๋กํ ๋ณ๊ฒฝ์๋ ์ด์๋จ์ ์ ์์ต๋๋ค. ์๋ก์ด ์ํ๋ ๊ธฐ์กด ID ๋๋ฉด์ ๋ค์ ๊ฐ์กฐํ ์ ์์ต๋๋ค. ClearFigures ๋๋ฉด๊ณผ ํ์ฌ ์ํ ๊ธฐ๋ก์ ๋ช ์์ ์ผ๋ก ์ง์๋๋ค. ์ฑ๊ณต - ํ์ ์ฆ๋ช ์ด ์๋ ๋ฐ์ดํฐ ์ฐ๊ธฐ/์ญ์ .
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
var id = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print("Removed flag: " + Convert.ToString(UO.RemoveFigure(id)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID๋ก ์ง์ญ ์ง๋ ๊ทธ๋ฆผ์ ์ญ์ ํฉ๋๋ค.
UO.Print(UO.RemoveFigure(1));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ bridge.RemoveMapFigure๋ฅผ ํธ์ถํ ๋ค์ state.MapFigures.Remove(id)๋ฅผ ํธ์ถํ๊ณ ๋ธ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์ ์์ ID๋ ๋ชจ์์ ์์ฑํ์ง ์๊ฑฐ๋ ์๋ฒ ์์ ์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
dynamic[] figure = new dynamic[checked((int)(10) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = UO.GetX() + 1;
figure[5] = UO.GetY() + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
figure[10] = "Example";
var id = UO.AddFigure(figure);
if (Truth(id > 0))
{
UO.Print(UO.RemoveFigure(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 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 id = 1;
var first = UO.RemoveFigure(id);
var second = UO.RemoveFigure(id);
UO.Print(Convert.ToString(first) + " " + Convert.ToString(second));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: figureID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RemoveMapFigure:bridge.RemoveMapFigure(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removefigure":
{
int id = Arg(0);
int removed = bridge.RemoveMapFigure(id);
state.MapFigures.Remove(id);
return new InjectionValue(removed);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ServerPrint(object? message);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
- ์๋ฒ ์ด๋ฆ์ด๋ ๋คํธ์ํฌ ๋ฉ์์ง์์ ์ ์ฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ์ด ๋ช ๋ น์ ๋ก์ปฌ ํ ์คํธ๋ง ์ธ์ํฉ๋๋ค. ์ ์ธ๊ณ์ ๋ํํ๋ ค๋ฉด UO.Say๋ฅผ ์ฌ์ฉํ์ธ์.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.ServerPrint("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.ServerPrint("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.ServerPrint("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.ServerPrint("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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: message (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ServerPrint. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ServerPrint:bridge.ServerPrint(message).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ServerPrint(string message) => bridge.ServerPrint(message);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetShowZ(object? stateValue);๋ก์ปฌ ํ๋๊ทธ showZ ๋ฐํ์์ ๋ณ๊ฒฝํฉ๋๋ค.
-
stateValue- 0๊ฐ ๊บผ์ง๋๋ค. 0์ด ์๋ ๋ชจ๋ ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- showZ์ NumberConversions.ToInt ๋ค์ 0 ๋๋ 1 ๊ฐ์ ํ ๋นํฉ๋๋ค. ์ด ํจ์ ์์ฒด๋ ์ขํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง๋ ์์ต๋๋ค.
- ์ด๋ ํ์ฌ ๋ฐํ์์ ํธํ์ฑ ์ ์ฅ์์ ๋๋ค. ํ๋ก์ ํธ ๋น๊ณต๊ฐ mulPath/showZ์๋ ์๋น์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์์ฐ์ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ๋์ด ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetShowZ");
UO.SetShowZ(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํ๋๊ทธ showZ ๋ฐํ์์ ๋ณ๊ฒฝํฉ๋๋ค.
UO.SetShowZ(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- showZ์ NumberConversions.ToInt ๋ค์ 0 ๋๋ 1 ๊ฐ์ ํ ๋นํฉ๋๋ค. ์ด ํจ์ ์์ฒด๋ ์ขํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง๋ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetShowZ(0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ํ์ฌ ๋ฐํ์์ ํธํ์ฑ ์ ์ฅ์์ ๋๋ค. ํ๋ก์ ํธ ๋น๊ณต๊ฐ mulPath/showZ์๋ ์๋น์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์์ฐ์ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ๋์ด ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
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()
{
ApplyValue(1);
return null;
}
void ApplyValue(dynamic value)
{
UO.SetShowZ(value);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: stateValue (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetShowZ. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(stateValue).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetShowZ(InjectionValue stateValue) => showZ = NumberConversions.ToInt(stateValue) != 0 ? 1 : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetSilentMode(object? value);๋ก์ปฌ ํ๋๊ทธ SilentMode ๋ฐํ์์ ๋ณ๊ฒฝํฉ๋๋ค.
-
value- 0๊ฐ ๊บผ์ง๋๋ค. 0์ด ์๋ ๋ชจ๋ ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- SilentMode๋ฅผ 0/1๋ก ์ ์ฅํฉ๋๋ค. GumpLinesResult๋ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ด ์์ง ์์ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ ์ถ๊ฐ๋ก ํ ์คํธ ์ฐฝ์ ์ธ์๋์ด ์ด๋ฆฝ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ถ๊ฐ ํ์๊ฐ ์ต์ ๋ฉ๋๋ค. ๋ฐํ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ธฐํ Print ์ฌ์ด๋์ ์๋ฒ ๋ฉ์์ง๋ ์ต์ ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetSilentMode");
UO.SetSilentMode(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SilentMode๋ฅผ 0/1๋ก ์ ์ฅํฉ๋๋ค. GumpLinesResult๋ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ด ์์ง ์์ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ ์ถ๊ฐ๋ก ํ ์คํธ ์ฐฝ์ ์ธ์๋์ด ์ด๋ฆฝ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ถ๊ฐ ํ์๊ฐ ์ต์ ๋ฉ๋๋ค. ๋ฐํ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ธฐํ Print ์ฌ์ด๋์ ์๋ฒ ๋ฉ์์ง๋ ์ต์ ๋์ง ์์ต๋๋ค.
UO.SetSilentMode(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SilentMode๋ฅผ 0/1๋ก ์ ์ฅํฉ๋๋ค. GumpLinesResult๋ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ด ์์ง ์์ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ ์ถ๊ฐ๋ก ํ ์คํธ ์ฐฝ์ ์ธ์๋์ด ์ด๋ฆฝ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ถ๊ฐ ํ์๊ฐ ์ต์ ๋ฉ๋๋ค. ๋ฐํ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ธฐํ Print ์ฌ์ด๋์ ์๋ฒ ๋ฉ์์ง๋ ์ต์ ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetSilentMode(0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SilentMode๋ฅผ 0/1๋ก ์ ์ฅํฉ๋๋ค. GumpLinesResult๋ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ด ์์ง ์์ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ ์ถ๊ฐ๋ก ํ ์คํธ ์ฐฝ์ ์ธ์๋์ด ์ด๋ฆฝ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ถ๊ฐ ํ์๊ฐ ์ต์ ๋ฉ๋๋ค. ๋ฐํ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ธฐํ Print ์ฌ์ด๋์ ์๋ฒ ๋ฉ์์ง๋ ์ต์ ๋์ง ์์ต๋๋ค.
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()
{
ApplyValue(1);
return null;
}
void ApplyValue(dynamic value)
{
UO.SetSilentMode(value);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setsilentmode": state.SilentMode = Arg(0) != 0 ? 1 : 0; return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ShowJournal();๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ก๊ทธ ์ฐฝ์ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ShowJournal๋ GameActions.OpenJournal(_world)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ธฐ๋ก์ด ์ง์์ง์ง ์์ผ๋ฉฐ ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ShowJournal");
UO.ShowJournal();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ก๊ทธ ์ฐฝ์ ์ฝ๋๋ค.
UO.ShowJournal();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ShowJournal๋ GameActions.OpenJournal(_world)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ธฐ๋ก์ด ์ง์์ง์ง ์์ผ๋ฉฐ ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print("Journal example");
UO.ShowJournal();
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.ShowJournal();
UO.Print(UO.LineCount());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShowJournal:bridge.ShowJournal().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "showjournal": bridge.ShowJournal(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Snap();
int UO.Snap(object? name);
int UO.Snap(object? name, object? quality);
int UO.Snap(object? file, object? quality, object? includeUI);ํด๋ผ์ด์ธํธ ๊ทธ๋ํฝ ์ฐฝ์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค.
-
nameโ ์ ํ์ ํ์ผ ์ด๋ฆ. .jpg/.jpeg๋ JPEG๋ฅผ ์ ํํ๊ณ , ๊ธฐํ/์์์ PNG๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ฆ์ ๋๋ ํ ๋ฆฌ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๊ธฐ๋ณธ ์ด๋ฆ๋ง ์ฌ์ฉ๋ฉ๋๋ค. -
fileโ ์ ํ์ ํ์ผ ์ด๋ฆ. .jpg/.jpeg๋ JPEG๋ฅผ ์ ํํ๊ณ , ๊ธฐํ/์์์ PNG๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ฆ์ ๋๋ ํ ๋ฆฌ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๊ธฐ๋ณธ ์ด๋ฆ๋ง ์ฌ์ฉ๋ฉ๋๋ค. -
qualityโ ์ ํ ์ฌํญ int, ๊ธฐ๋ณธ๊ฐ์ 100, 1..100๋ก ์ ํ๋ฉ๋๋ค. JPEG์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. PNG๋ ์์ค ํ์ง์ ์ฌ์ฉํ์ง ์์ต๋๋ค. -
includeUI- ์ ํ ์ฌํญ bool, ๊ธฐ๋ณธ๊ฐ true. false๋ UI ์์ด ์ธ๊ณ/์กฐ๋ช ์ ๊ทธ๋ฆฝ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ์ด๋ฏธ์ง ํ์ผ์ด ์ ์ฅ๋จ, 0 - ์บก์ฒ/์ฐ๊ธฐ ์ค๋ฅ. ๊ทธ๋ํฝ ์ฐฝ์ด ์์ผ๋ฉด RequireGameView๋ TakeScreenshot ์ด์ ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
- TakeScreenshot๋ ExecutablePath/Data/Client/Screenshots์ ๊ธฐ๋กํ๊ณ , ์๋ชป๋ ์ด๋ฆ ๋ฌธ์๋ฅผ ์ญ์ ํ๊ณ , ๋น์ด ์๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ ์ง๋ณ๋ก ์ด๋ฆ์ ์ ํํ๊ณ , ๊ธฐ์กด ํ์ผ์ด ์๋ ๊ฒฝ์ฐ _2/_3์ ์ถ๊ฐํฉ๋๋ค. ์์์ ์ ๋ ๊ฒฝ๋ก๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- UI๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฑ๋ฒํผ๋ฅผ ์ฝ์ต๋๋ค. UI ์์ด RenderTarget2D๋ฅผ ๋ง๋ค๊ณ ์ธ์์ ๋ ๋๋งํฉ๋๋ค. JPEG๋ ๋ณต์์ ํตํด FNA_GRAPHICS_JPEG_SAVE_QUALITY๋ฅผ ์์๋ก ์ค์ ํฉ๋๋ค. PNG SaveAsPng. TakeScreenshot ๋ด๋ถ์ ์ค๋ฅ๋ ๊ธฐ๋ก๋์ด 0๋ก ํ์๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Snap();
UO.Print("Snap: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ผ์ด์ธํธ ๊ทธ๋ํฝ ์ฐฝ์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค.
UO.Print(UO.Snap());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- TakeScreenshot๋ ExecutablePath/Data/Client/Screenshots์ ๊ธฐ๋กํ๊ณ , ์๋ชป๋ ์ด๋ฆ ๋ฌธ์๋ฅผ ์ญ์ ํ๊ณ , ๋น์ด ์๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ ์ง๋ณ๋ก ์ด๋ฆ์ ์ ํํ๊ณ , ๊ธฐ์กด ํ์ผ์ด ์๋ ๊ฒฝ์ฐ _2/_3์ ์ถ๊ฐํฉ๋๋ค. ์์์ ์ ๋ ๊ฒฝ๋ก๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Snap("manual-example.jpg", 85));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UI๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฑ๋ฒํผ๋ฅผ ์ฝ์ต๋๋ค. UI ์์ด RenderTarget2D๋ฅผ ๋ง๋ค๊ณ ์ธ์์ ๋ ๋๋งํฉ๋๋ค. JPEG๋ ๋ณต์์ ํตํด FNA_GRAPHICS_JPEG_SAVE_QUALITY๋ฅผ ์์๋ก ์ค์ ํฉ๋๋ค. PNG SaveAsPng. TakeScreenshot ๋ด๋ถ์ ์ค๋ฅ๋ ๊ธฐ๋ก๋์ด 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.Print(UO.Snap("manual-world.png", 100, false));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Snap. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Snap:bridge.Snap(null, 100, true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Snap() => bridge.Snap(null, 100, true);๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Snap. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Snap:bridge.Snap(name, 100, true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Snap(string name) => bridge.Snap(name, 100, true);๋งค๊ฐ๋ณ์: name (String), quality (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Snap. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Snap:bridge.Snap(name, Math.Max(1, Math.Min(100, quality)), true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Snap(string name, int quality) => bridge.Snap(name, Math.Max(1, Math.Min(100, quality)), true);๋งค๊ฐ๋ณ์: file (Any), quality (Any), includeUI (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Snap]. -
InjectionScript.Runtime.InjectionApiUO.Snap:Snap(values[0].ToString(), NumberConversions.ToInt(values[1]), ToBoolean(values[2])). -
InjectionScript.Runtime.InjectionValue.ToString:values[0].ToString(). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[2]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(Snap(values[0].ToString(), NumberConversions.ToInt(values[1]), ToBoolean(values[2])))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TextClear();๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ๋ฒํผ๋ฅผ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- _textWindow๋ฅผ ์ง์๋๋ค. ์ฐฝ์ด ์ด๋ ค ์์ผ๋ฉด ๋น ๋ชฉ๋ก์ผ๋ก ๋ค์ ํ์ํฉ๋๋ค. ๋ซํ ์ฐฝ์ ๋ซํ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ก๊ทธ๋ ์ง์์ง์ง ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ ์ธํฐํ์ด์ค/๋ฒํผ์ ๋๋ค. ๋คํธ์ํฌ ๋ฉ์์ง๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TextClear");
UO.TextClear();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ๋ฒํผ๋ฅผ ์ง์๋๋ค.
UO.TextClear();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- _textWindow๋ฅผ ์ง์๋๋ค. ์ฐฝ์ด ์ด๋ ค ์์ผ๋ฉด ๋น ๋ชฉ๋ก์ผ๋ก ๋ค์ ํ์ํฉ๋๋ค. ๋ซํ ์ฐฝ์ ๋ซํ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ก๊ทธ๋ ์ง์์ง์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.TextPrint("Old line");
UO.TextClear();
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.TextClose();
UO.TextClear();
UO.TextOpen();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TextClear. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextClear:bridge.TextClear().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void TextClear() => bridge.TextClear();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TextClose();๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ๋ซ๊ณ ๋ฒํผ๋ฅผ ์ ์ฅํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- _textWindowOpen=false๋ฅผ ์ค์ ํ๊ณ ๊ธฐ์กด YokoTextWindowGump๋ฅผ ์ญ์ ํฉ๋๋ค. _textWindow ๋ชฉ๋ก์ ์ง์์ง์ง ์์ต๋๋ค. TextOpen๋ ํด๋น ํ์ ๋ค์ ํ์ํฉ๋๋ค.
- ์์ ์ ๋ก์ปฌ ์ธํฐํ์ด์ค/๋ฒํผ์ ๋๋ค. ๋คํธ์ํฌ ๋ฉ์์ง๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TextClose");
UO.TextClose();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ๋ซ๊ณ ๋ฒํผ๋ฅผ ์ ์ฅํฉ๋๋ค.
UO.TextClose();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- _textWindowOpen=false๋ฅผ ์ค์ ํ๊ณ ๊ธฐ์กด YokoTextWindowGump๋ฅผ ์ญ์ ํฉ๋๋ค. _textWindow ๋ชฉ๋ก์ ์ง์์ง์ง ์์ต๋๋ค. TextOpen๋ ํด๋น ํ์ ๋ค์ ํ์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.TextPrint("Retained line");
UO.TextClose();
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.TextPrint("Retained line");
UO.TextClose();
UO.Wait(250);
UO.TextOpen();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TextClose. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextClose:bridge.TextClose().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void TextClose() => bridge.TextClose();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TextOpen();๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- _textWindowOpen=true์ ์ ์ฅํ๊ณ YokoTextWindowGump๋ฅผ ํธ์ถํฉ๋๋ค.ํ์ฌ _textWindow๋ก ํ์ํฉ๋๋ค. ๋ฒํผ๋ ์ง์์ง์ง ์์ต๋๋ค. ๋ค์ ์ด๋ฉด ๋์ ๋ ํ์ด ํ์๋ฉ๋๋ค.
- ์์ ์ ๋ก์ปฌ ์ธํฐํ์ด์ค/๋ฒํผ์ ๋๋ค. ๋คํธ์ํฌ ๋ฉ์์ง๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TextOpen");
UO.TextOpen();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ์ฝ๋๋ค.
UO.TextOpen();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- _textWindowOpen=true์ ์ ์ฅํ๊ณ YokoTextWindowGump๋ฅผ ํธ์ถํฉ๋๋ค.ํ์ฌ _textWindow๋ก ํ์ํฉ๋๋ค. ๋ฒํผ๋ ์ง์์ง์ง ์์ต๋๋ค. ๋ค์ ์ด๋ฉด ๋์ ๋ ํ์ด ํ์๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.TextPrint("Example");
UO.TextOpen();
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.TextOpen();
UO.Wait(500);
UO.TextClose();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TextOpen. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextOpen:bridge.TextOpen().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void TextOpen() => bridge.TextOpen();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TextPrint(object? text);๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ์ค์ ์ถ๊ฐํ๊ณ ์ฝ๋๋ค.
-
textโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ํ๊ณ์์ MaxTextWindowLines=2000๋ ์ด์ ์ค์ ์ ๊ฑฐํ ๋ค์ ํ ์คํธ๋ ๋น ์ค์ ์ถ๊ฐํ๊ณ _textWindowOpen=true๋ฅผ ์ค์ ํ๊ณ ์ฐฝ์ ํ์ํฉ๋๋ค. ์ด๋ ๋ก๊ทธ์ UO.Print๋ ์๋๊ณ ์๋ฒ์ ๋ํ ์์ฑ๋ ์๋๋๋ค.
- ์์ ์ ๋ก์ปฌ ์ธํฐํ์ด์ค/๋ฒํผ์ ๋๋ค. ๋คํธ์ํฌ ๋ฉ์์ง๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TextPrint");
UO.TextPrint("Example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํ ์คํธ ์ฐฝ์ ์ค์ ์ถ๊ฐํ๊ณ ์ฝ๋๋ค.
UO.TextPrint("Example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๊ณ์์ MaxTextWindowLines=2000๋ ์ด์ ์ค์ ์ ๊ฑฐํ ๋ค์ ํ ์คํธ๋ ๋น ์ค์ ์ถ๊ฐํ๊ณ _textWindowOpen=true๋ฅผ ์ค์ ํ๊ณ ์ฐฝ์ ํ์ํฉ๋๋ค. ์ด๋ ๋ก๊ทธ์ UO.Print๋ ์๋๊ณ ์๋ฒ์ ๋ํ ์์ฑ๋ ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var message = "Line 1";
UO.TextPrint(message);
UO.TextPrint("Line 2");
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.TextClear();
UO.TextPrint("Fresh report");
UO.TextClose();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TextPrint. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TextPrint:bridge.TextPrint(text).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void TextPrint(string text) => bridge.TextPrint(text);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.UpdateFigure(object? figureID, object? figure);๊ธฐ์กด ์ง์ญ ์ง๋ ๊ทธ๋ฆผ์ ์ค๋ช ์ ๋์ฒดํฉ๋๋ค.
-
figureID- int ID ์ํ์ ๋๋ค. MapFigures๊ฐ AddFigure์์ ์์ ๋์์ต๋๋ค. ์ ์ ์์ ID๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. -
figureโ [kind,coord,x1,y1,x2,y2,brushColor,brushStyle,color,worldNum,text]๊ฐ ํฌํจ๋ ๋ฐฐ์ด ๋๋ ๋ฌธ์์ด | ์ต์ ์ฒซ ๋ฒ์งธ 9 ์ซ์ ํ๋; worldNum๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ์ง๋์ด๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์คํธ๋ ๋น์ด ์์ต๋๋ค. -
figure[0] (kind)- ์ข ๋ฅ๋ 0..4, coord - 0..1, FigureID - ์์์ฌ์ผ ํฉ๋๋ค. WorldMapGump.SetYokoMapFigure๋ ์ด๋ฌํ ๊ฒฝ๊ณ๋ฅผ ์๋ฐํ๋ฉด 0๋ฅผ ๋ฐํํฉ๋๋ค. -
figure[1] (coord)- ์ข ๋ฅ๋ 0..4, coord - 0..1, FigureID - ์์์ฌ์ผ ํฉ๋๋ค. WorldMapGump.SetYokoMapFigure๋ ์ด๋ฌํ ๊ฒฝ๊ณ๋ฅผ ์๋ฐํ๋ฉด 0๋ฅผ ๋ฐํํฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ๊ตฌ๋ฌธ ๋ถ์์ด ์ฑ๊ณตํ๊ณ ๋ธ๋ฆฌ์ง๋์์ต๋๋ค. SetMapFigure๊ฐ 0์ด ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ํ ๋ ์ฝ๋๊ฐ ์ ๋ฐ์ดํธ๋์์ต๋๋ค. 0 - ์๋์ ID, ๊ตฌ์กฐ/์ซ์ ํ ์คํธ ํ๋ ์ค๋ฅ ๋๋ ๋ธ๋ฆฌ์ง ์คํจ.
- TryMapFigureArg๋ ๋ฐฐ์ด ๋๋ |string๋ฅผ ํ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ 9 ํ๋๊ฐ ๋ณํ๋ฉ๋๋ค. ์ซ์ ํ ์คํธ๋ TryStr2Int๋ก ํ์ธ๋ฉ๋๋ค. ์ง์๋์ง ์๋ ๋ณด๊ธฐ/์งง์ ํ๊ธฐ๋ฒ - 0, ๊ธฐํ ๋ณด๊ธฐ ๋ณํ ์ค๋ฅ๋ก ์ธํด ์คํฌ๋ฆฝํธ๊ฐ ์ค๋จ๋ ์ ์์ต๋๋ค.
- ๋ธ๋ฆฟ์ง๊ฐ ์คํจํ๋ฉด ๊ธฐ์กด ๋ฐํ์ ํญ๋ชฉ์ด ๋์ฒด๋์ง ์์ต๋๋ค. ์ฑ๊ณตํ๋ฉด SerializeMapFigure๋ฅผ 10 ์ซ์ ํ๋ ๋ฐ ํ ์คํธ์ ํจ๊ป ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฆผ์ ๋ก์ปฌ์๋ง ํด๋น๋๋ฉฐ ์๋ฒ ํญ๋ชฉ์๋ ํด๋น๋์ง ์์ต๋๋ค.
- ์ข ๋ฅ: 0 ์ , 1 ํ์(32 ์ค๊ณฝ์ ์ธ๊ทธ๋จผํธ), 2 ์ง์ฌ๊ฐํ ์ค๊ณฝ์ , 3 ํ์ดํ, 4 ํ ์คํธ. coord=0 โ ์ง๋๋ก ๋ณํ๋ ์ธ๊ณ ์ขํ, coord=1 โ ์ง๋ ๊ทธ๋ฆฌ๊ธฐ ์์ญ์ ๊ธฐ์ค์ผ๋ก ํ ํฝ์ . x1/y1 ๋ฐ x2/y2 - ๋/๊ฒฝ๊ณ; ์ธ๊ณ ํ์ดํ x2=y2=0์ ๊ฒฝ์ฐ ํ๋ ์ด์ด์ ์์๊ณผ x1/y1์ ๋ชฉํ๋ฅผ ์ค์ ํฉ๋๋ค. color โ 0x00BBGGRR (๋ง์ด๋ byte ๋นจ๊ฐ์), ์ค๊ณฝ์ ์์. brushColor/brushStyle๊ฐ ์ ์ฅ๋์์ง๋ง ๋ ๋๋ง์์๋ ์ด๋ฅผ ์ฝ์ง ์์ต๋๋ค. ์ฑ์ฐ๊ธฐ๊ฐ ์์ต๋๋ค. worldNum<0๋ ๋ชจ๋ ์ง๋์ ํ์๋๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ ๋ ์ง๋์๋ง ํ์๋ฉ๋๋ค. ํ ์คํธ๋ ์ธ๊ณฝ์ ์์์ด ์๋ ์ง๋ ๊ธ๊ผด์ ์ฒซ ๋ฒ์งธ ์ง์ (ํ ์คํธ๊ฐ ์๋ ๋ํ์ ๊ฒฝ์ฐ +3 ํฝ์ )์ ๊ทธ๋ ค์ง๋๋ค.
- WorldMapGump๋ ํ๋ก์ธ์ค์ ์ ์ ์ฌ์ ์ ๊ทธ๋ฆผ์ ์ ์ฅํฉ๋๋ค. ํ ์ธ๊ณ/ํ๋กํ์ ์ผ๋ฐ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก๋ ๊ณตํต GetPersistentState ๋ฐ ์นด์ดํฐ ID๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ณ ๊ด๋ฆฌ์ ํ๋ก์ธ์ค๋ ๋๋ฉด์ ๊ณต์ ํ์ง ์์ต๋๋ค. World.Clear/YokoScripts.Clear ๋ฐ ํ๋กํ ๋ก๋ ๋ก๋๋ ์ด ์ฌ์ ์ ์ง์ฐ๊ฑฐ๋ ๋ณต์ํ์ง ์์ต๋๋ค(๋ก๋๋ UserStatics๋ง ๋ณต์ํฉ๋๋ค). ๋ฐ๋ผ์ ๋๋ฉด์ worldNum๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ผํ ํ๋ก์ธ์ค์์ ์๋/ํ๋กํ ๋ณ๊ฒฝ์๋ ์ด์๋จ์ ์ ์์ต๋๋ค. ์๋ก์ด ์ํ๋ ๊ธฐ์กด ID ๋๋ฉด์ ๋ค์ ๊ฐ์กฐํ ์ ์์ต๋๋ค. ClearFigures ๋๋ฉด๊ณผ ํ์ฌ ์ํ ๊ธฐ๋ก์ ๋ช ์์ ์ผ๋ก ์ง์๋๋ค. ์ฑ๊ณต - ํ์ ์ฆ๋ช ์ด ์๋ ๋ฐ์ดํฐ ์ฐ๊ธฐ/์ญ์ .
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
object?[] figure = { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 };
var id = UO.AddFigure(figure);
figure[8] = 65280;
UO.Print("Updated flag: " + Convert.ToString(UO.UpdateFigure(id, figure)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธฐ์กด ์ง์ญ ์ง๋ ๊ทธ๋ฆผ์ ์ค๋ช ์ ๋์ฒดํฉ๋๋ค.
dynamic[] figure = new dynamic[checked((int)(8) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = 100;
figure[3] = 100;
figure[4] = 101;
figure[5] = 101;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
UO.Print(UO.UpdateFigure(1, figure));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- TryMapFigureArg๋ ๋ฐฐ์ด ๋๋ |string๋ฅผ ํ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ 9 ํ๋๊ฐ ๋ณํ๋ฉ๋๋ค. ์ซ์ ํ ์คํธ๋ TryStr2Int๋ก ํ์ธ๋ฉ๋๋ค. ์ง์๋์ง ์๋ ๋ณด๊ธฐ/์งง์ ํ๊ธฐ๋ฒ - 0, ๊ธฐํ ๋ณด๊ธฐ ๋ณํ ์ค๋ฅ๋ก ์ธํด ์คํฌ๋ฆฝํธ๊ฐ ์ค๋จ๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
dynamic[] figure = new dynamic[checked((int)(10) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = UO.GetX();
figure[3] = UO.GetY();
figure[4] = UO.GetX() + 1;
figure[5] = UO.GetY() + 1;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
figure[9] = UO.WorldNum();
figure[10] = "Example";
var id = UO.AddFigure(figure);
if (Truth(id > 0))
{
UO.Print(UO.UpdateFigure(id, figure));
UO.RemoveFigure(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ธ๋ฆฟ์ง๊ฐ ์คํจํ๋ฉด ๊ธฐ์กด ๋ฐํ์ ํญ๋ชฉ์ด ๋์ฒด๋์ง ์์ต๋๋ค. ์ฑ๊ณตํ๋ฉด SerializeMapFigure๋ฅผ 10 ์ซ์ ํ๋ ๋ฐ ํ ์คํธ์ ํจ๊ป ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฆผ์ ๋ก์ปฌ์๋ง ํด๋น๋๋ฉฐ ์๋ฒ ํญ๋ชฉ์๋ ํด๋น๋์ง ์์ต๋๋ค.
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 figure = "0|0|100|100|101|101|0|0|0";
UO.Print(UO.UpdateFigure(1, figure));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: figureID (Any), figure (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::TryMapFigureArg:TryMapFigureArg(1, out int[] figure, out string figureText). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMapFigure:bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::SerializeMapFigure:SerializeMapFigure(figure, figureText).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "updatefigure":
{
int id = Arg(0);
if (!state.MapFigures.ContainsKey(id) || !TryMapFigureArg(1, out int[] figure, out string figureText))
return InjectionValue.False;
if (bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText) == 0)
return InjectionValue.False;
state.MapFigures[id] = SerializeMapFigure(figure, figureText);
return InjectionValue.True;
}