KO UO Topic movement - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
UO.LimitMove โ ์ด๋ ๊ฑฐ๋ฆฌ ์ ํ.
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์บ๋ฆญํฐ ์ด๋, ๊ฒฝ๋ก ๊ตฌ์ถ, ๋ฌธ, ์ฅ์ ๋ฌผ ๋ฐ ๋จ๊ณ ์ง์ฐ. ๋ฌผ๊ฑด์ ์ฎ๊ธฐ๋ ๋ช ๋ น์ ์์ดํ โ Moving ์์ดํ ์ ์์ต๋๋ค.
UO.Move ยท UO.MoveXY ยท UO.MoveXYZ ยท UO.NewMoveXY ยท UO.Step ยท UO.StepQ ยท UO.PMove ยท UO.MoveOn ยท UO.MoveOff ยท UO.MoverStop ยท UO.CancelMove ยท UO.Moving ยท UO.IsMoving ยท UO.GetRun ยท UO.IsRunning ยท UO.AlwaysRun ยท UO.FixWalk
UO.Dir ยท UO.Direction ยท UO.GetDir ยท UO.GetDirection ยท UO.CalcDir ยท UO.PredictedDirection
UO.GetPathArray ยท UO.GetPathArray3D ยท UO.AddStep ยท UO.AddDir
UO.OpenDoor ยท UO.LastStepQUsedDoor
UO.moveBetweenTwoCorners ยท UO.moveCheckStamina ยท UO.moveExitOnDisconnect ยท UO.moveHeuristicMult ยท UO.moveOpenDoor ยท UO.moveThroughCorner ยท UO.moveThroughNPC ยท UO.moveTurnCost
UO.PredictedX ยท UO.PredictedY ยท UO.PredictedZ
UO.GetRunMountTimer ยท UO.GetRunUnMountTimer ยท UO.GetWalkMountTimer ยท UO.GetWalkUnmountTimer ยท UO.SetRunMountTimer ยท UO.SetRunUnmountTimer ยท UO.SetWalkMountTimer ยท UO.SetWalkUnmountTimer
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var x = UO.GetX() + 3;
var y = UO.GetY();
var ok = UO.NewMoveXY(x, y, true, 0, false);
if (Truth(ok))
{
UO.Print("Destination reached");
}
else
{
UO.Print("Destination not reached");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, false);
if (Truth(ArrayLength(path) > 0))
{
UO.Print("Steps: " + Convert.ToString(ArrayLength(path) - 1));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddDir(object? directions);-
directions๋ ๋ ๊ฑฐ์ ๋ชฉ๋ก์ ์ ์ฅ๋ ๋ฌธ์์ด์ ๋๋ค. ๊ฐ์ ์๋ฏธ์ ํ์์ ์ด๋ฅผ ์ฌ์ฉํ๋ ํธํ ์คํฌ๋ฆฝํธ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
void. ์ถ๊ฐ๋ ํญ๋ชฉ์ ์์ง์์ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ๊ฐ์ ํ์ฌ ๋ฐํ์ ์ํ์ ๋ชฉ๋ก
AddDir์ ์ถ๊ฐ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ๋ชจ์ ํจํท์ ์ ๋ฌํ์ง ์๊ณ , ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ์ง ์์ผ๋ฉฐ, ์ด ๋ชฉ๋ก์ ์ฝ๊ธฐ ์ํ ๋ฌธ์ํ๋ ๊ณต๊ฐ getter๊ฐ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddDir");
UO.AddDir("E");1. ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ์ง ์๊ณ ๋ฐฉํฅ์ ๋ ๊ฑฐ์ ํธํ ํญ๋ชฉ์ผ๋ก ์ ์ฅํฉ๋๋ค. - ์ง์ ์คํฌ๋ฆฝํธ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ์ง ์๊ณ ๋ฐฉํฅ์ ๋ ๊ฑฐ์ ํธํ ํญ๋ชฉ์ผ๋ก ์ ์ฅํฉ๋๋ค.
UO.AddDir("E");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ์์ ๊ฐ์ ๋ ๊ฑฐ์ ๋ชฉ๋ก AddDir๋ก ์ ๋ฌํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var directionEntry = "north-east";
UO.AddDir(directionEntry);
return null;
}3. ํธ์ถํ ๋๋ง๋ค ๋ฐํ์ ์ํ์ ๋ค๋ฅธ ๋ฌธ์์ด ํญ๋ชฉ์ด ์ถ๊ฐ๋ฉ๋๋ค. - ์คํฌ๋ฆฝํธ ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถํ ๋๋ง๋ค ๋ฐํ์ ์ํ์ ๋ค๋ฅธ ๋ฌธ์์ด ํญ๋ชฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
- ๋ณด์กฐ ์ ์ฐจ๋ ๋์ ๋ช ๋ น์ ๋ณด๋ด์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
AddLegacyDirection("W");
return null;
}
void AddLegacyDirection(dynamic entry)
{
UO.AddDir(entry);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: directions (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddStep(object? directions);-
directions๋ ๋ฐํ์์ด ํ ์คํธ๋ก ๋ณํํ๊ณ ํธํ์ฑ ๋ชฉ๋กAddStep์ ์ถ๊ฐํ๋ ๊ฐ์ ๋๋ค. ๋ฐฉํฅ ์์ฒด๋ ํด์ํ ์ ์์ต๋๋ค.
void. ํธ์ถ์ ๊ฐ์ ๋ฐํํ์ง ์์ผ๋ฉฐ ์ด๋์ ํ์ธํ์ง ์์ต๋๋ค.
- ๊ฐ ํธ์ถ์ ํ์ฌ ๋ฐํ์ ์ํ์ ๋ชฉ๋ก
AddStep์ ์ธ์์ ๋ฌธ์์ด ํํ์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ ๊ฑฐ์ ํญ๋ชฉ์ ๋ชจ์ ๋ช ๋ น์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ํ์ฌ ๊ตฌํ์๋ ๊ณต๊ฐ getter๊ฐ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddStep");
UO.AddStep(2);1. ๋ ๊ฑฐ์ ๋ชฉ๋ก์ ๊ฐ์ ์๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด์ง ์์ต๋๋ค. - ์ง์ ์คํฌ๋ฆฝํธ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฑฐ์ ๋ชฉ๋ก์ ๊ฐ์ ์๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด์ง ์์ต๋๋ค.
UO.AddStep(2);2. ํ ์คํธ ๊ฐ ์ ๋ฌ: ๋ฐฉํฅ์ผ๋ก ์คํ๋์ง ์๊ณ ๋ ์ฝ๋๋ก ์ ์ฅ๋ฉ๋๋ค. - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ์คํธ ๊ฐ ์ ๋ฌ: ๋ฐฉํฅ์ผ๋ก ์คํ๋์ง ์๊ณ ๋ ์ฝ๋๋ก ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var legacyValue = "east";
UO.AddStep(legacyValue);
return null;
}3. ๊ฐ ํธ์ถ์ ํ์ฌ ๋ฐํ์์ AddStep์ ๋ณ๋์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. - ์คํฌ๋ฆฝํธ ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ ํธ์ถ์ ํ์ฌ ๋ฐํ์์ AddStep์ ๋ณ๋์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค.
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.AddStep(1);
UO.AddStep(2);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: directions (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.AlwaysRun();
void UO.AlwaysRun(object? enabled);ํ์ฌ ClassicUO ํ๋กํ์ ์ง์์ ์ธ ์คํ ์ค์ ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํฉ๋๋ค.
-
enabled-0์ง์์ ์ธ ์คํ์ ๋นํ์ฑํํฉ๋๋ค. 0์ด ์๋ ๊ฐ์ด๋ฉด ์ผ์ง๋๋ค.
์ธ์ ์๋ ํ์์ ์ค์ ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ 1๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋ฐํํฉ๋๋ค. ์ธ์ ํ์์ null๋ฅผ ๋ฐํํฉ๋๋ค.
- ํ์ฌ ํ๋กํ์์ ๊ฐ์ ์ฝ์ต๋๋ค. ์ค์ ์ด
AlwaysRun๋ณ๊ฒฝ๋๊ณ ํ์ฌ ํ๋กํ์ด ์ ์ฅ๋ฉ๋๋ค. ํ์ฑ ํ๋กํ์ด ์์ผ๋ฉด getter๋0๋ฅผ ๋ฐํํ๊ณ setter๋ ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๊ณ ์ค์ ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.AlwaysRun();
UO.Print("AlwaysRun: " + Convert.ToString(result));1. ์ค์ ์ ์ฝ์ผ์ญ์์ค. 1์ ์ง์์ ์ธ ์คํ์ด ํ์ฑํ๋์์์ ์๋ฏธํฉ๋๋ค. - ์ง์ ์คํฌ๋ฆฝํธ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค์ ์ ์ฝ์ผ์ญ์์ค. 1๋ ์ง์์ ์ธ ์คํ์ด ํ์ฑํ๋์์์ ์๋ฏธํฉ๋๋ค.
var isAlwaysRunning = UO.AlwaysRun();
UO.Print(Convert.ToString(isAlwaysRunning));2. ์ง์์ ์ธ ์คํ์ ํ์ฑํํ๊ณ ํ์ฌ ํ๋กํ ์ค์ ์ ์ ์ฅํฉ๋๋ค. - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์์ ์ธ ์คํ์ ํ์ฑํํ๊ณ ํ์ฌ ํ๋กํ ์ค์ ์ ์ ์ฅํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AlwaysRun(1);
return null;
}3. ํ์ฌ ํ์ฑํ๋์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ง์์ ์ธ ์คํ์ ๋นํ์ฑํํ์ญ์์ค. - ์คํฌ๋ฆฝํธ ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ํ์ฑํ๋์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ง์์ ์ธ ์คํ์ ๋นํ์ฑํํ์ญ์์ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(UO.AlwaysRun() != 0))
{
UO.AlwaysRun(0);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.AlwaysRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AlwaysRun:bridge.AlwaysRun().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int AlwaysRun() => bridge.AlwaysRun();๋งค๊ฐ๋ณ์: enabled (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.AlwaysRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AlwaysRun:bridge.AlwaysRun(enabled).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void AlwaysRun(int enabled) => bridge.AlwaysRun(enabled);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.CalcDir(object? xfrom, object? yfrom, object? xto, object? yto);ํ ์ธ๊ณ ์ง์ ์์ ๋ค๋ฅธ ์ธ๊ณ ์ง์ ์ผ๋ก์ ๋ฐฉํฅ์ ๊ณ์ฐํฉ๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด์ง ์์ต๋๋ค.
-
xfromโ ์์์ ์ X ์ขํ์ ๋๋ค. -
yfromโ ์์์ ์ Y ์ขํ์ ๋๋ค. -
xtoโ X ํ ๋น ์ขํ์ ๋๋ค. -
ytoโ Y ํ ๋น ์ขํ์ ๋๋ค.
int โ ๋ฐฉํฅ ์ฝ๋: 0=๋ถ์ชฝ, 1=๋ถ๋์ชฝ, 2=๋์ชฝ, 3=๋จ๋์ชฝ, 4=๋จ์ชฝ, 5=๋จ์์ชฝ, 6=์์ชฝ, 7=๋ถ์์ชฝ. ๋งค์นญ ํฌ์ธํธ๋ 100๋ฅผ ์ ๊ณตํฉ๋๋ค. bool์ด ์๋๋๋ค. 0๋ ์คํจ๊ฐ ์๋๋ผ ๋ถ์ชฝ์ ์๋ฏธํฉ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ๋ถ๋์ชฝ์ ์๋ฏธํฉ๋๋ค. ๋จ๊ณ ๋ช ๋ น์ 100๋ฅผ ์ง์๋ก ์ ๋ฌํ์ง ๋ง์ญ์์ค.
- ์ขํ๋ง ๊ณ์ฐํฉ๋๋ค. ๋ฐฐ์น ์์, ๋๊ธฐ ์์, ์ง๋ ๋ก๋ ์์, ์ฅ์ ๋ฌผ ํ์ธ ์์, Z ์์, ์ธ๊ณ ์ง๋ ์์. ํ์ ํต๊ณผ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ์์ผ๋ฉฐ ๋ชฉํ ๋ฌ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ ์ ๋์ผํ ์ขํ๊ณ์ ์ํด์ผ ํฉ๋๋ค. ์ฅ์ ๋ฌผ์ ํผํ๋ฉด ๊ฒฝ๋ก๊ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
- ๋ค ๊ฐ์ง ๋งค๊ฐ๋ณ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ๋ฌธ์ํ๋ ๋ฒ์ 0..65535์ ์ธ๊ณ ์ขํ int๋ฅผ ๋ณด๋ ๋๋ค. object? ์๋ช ์ ์๋ ํญ๋ชฉ์ ID๊ฐ ์๋ ๋ฒ์ฉ ์ด๋ํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๋ช ๋ น์๋ ๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฉฐ ๊ฐ์ด ๋ด๋ถ์ ์ขํ, ๋ค์ฏ ๋ฒ์งธ Z ๋ฐ ํ๋์ ๊ฐ์ฒด๋ก ๊ณผ๋ถํ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์๋ ์ขํ๋ฅผ ๋์ ์ขํ์์ ๋บ ๋ค์ ์ฐจ์ด์ ๋ถํธ๋ฅผ ํ์ธํฉ๋๋ค. Y ๊ฐ์ - ๋ถ์ชฝ, ์ฆ๊ฐ X - ๋์ชฝ. ๋ ์ขํ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋ฉด ์ฐจ์ด ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋๊ฐ์ ์ด ์ ํ๋ฉ๋๋ค. ๋ ์ฐจ์ด๊ฐ ๋ชจ๋ 0์ธ ๊ฒฝ์ฐ - 100.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CalcDir(100, 100, 101, 100);
UO.Print("CalcDir: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ถ๋ฐ์ง(100,100), ๋์ฐฉ์ง(101,100): X๋ ์ฆ๊ฐํ๊ณ , Y๋ ๋ณํ์ง ์์ต๋๋ค. ์ฃผ์ ๋ฐํ int 2 - ๋์ชฝ. ์ด๋ ๋ช ๋ น์ด ํธ์ถ๋์ง ์์ต๋๋ค.
- int โ ๋ฐฉํฅ ์ฝ๋: 0=๋ถ์ชฝ, 1=๋ถ๋์ชฝ, 2=๋์ชฝ, 3=๋จ๋์ชฝ, 4=๋จ์ชฝ, 5=๋จ์์ชฝ, 6=์์ชฝ, 7=๋ถ์์ชฝ. ๋งค์นญ ํฌ์ธํธ๋ 100๋ฅผ ์ ๊ณตํฉ๋๋ค. bool์ด ์๋๋๋ค. 0๋ ์คํจ๊ฐ ์๋๋ผ ๋ถ์ชฝ์ ์๋ฏธํฉ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ๋ถ๋์ชฝ์ ์๋ฏธํฉ๋๋ค. ๋จ๊ณ ๋ช ๋ น์ 100๋ฅผ ์ง์๋ก ์ ๋ฌํ์ง ๋ง์ญ์์ค.
- ์๋ ์ขํ๋ฅผ ๋์ ์ขํ์์ ๋บ ๋ค์ ์ฐจ์ด์ ๋ถํธ๋ฅผ ํ์ธํฉ๋๋ค. Y ๊ฐ์ - ๋ถ์ชฝ, ์ฆ๊ฐ X - ๋์ชฝ. ๋ ์ขํ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋ฉด ์ฐจ์ด ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋๊ฐ์ ์ด ์ ํ๋ฉ๋๋ค. ๋ ์ฐจ์ด๊ฐ ๋ชจ๋ 0์ธ ๊ฒฝ์ฐ - 100.
return UO.CalcDir(100,100,101,100);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ์ ์ ๋์ผํฉ๋๋ค(100,100). ๋ฐฉํฅ=100์ ์ผ์น๋ฅผ ์๋ฏธํ๋ฏ๋ก Main์ string "์ด๋ฏธ ์กด์ฌํจ"์ ๋ฐํํฉ๋๋ค. ๋ค๋ฅธ ์ง์ ์์๋ ๋ค๋ฅธ ์ง์ ์ด ์๋ํฉ๋๋ค. ํ์ธ๋๋ ๊ฒ์ true์ด ์๋๋ผ 100์ ๋๋ค.
- int โ ๋ฐฉํฅ ์ฝ๋: 0=๋ถ์ชฝ, 1=๋ถ๋์ชฝ, 2=๋์ชฝ, 3=๋จ๋์ชฝ, 4=๋จ์ชฝ, 5=๋จ์์ชฝ, 6=์์ชฝ, 7=๋ถ์์ชฝ. ๋งค์นญ ํฌ์ธํธ๋ 100๋ฅผ ์ ๊ณตํฉ๋๋ค. bool์ด ์๋๋๋ค. 0๋ ์คํจ๊ฐ ์๋๋ผ ๋ถ์ชฝ์ ์๋ฏธํฉ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ๋ถ๋์ชฝ์ ์๋ฏธํฉ๋๋ค. ๋จ๊ณ ๋ช ๋ น์ 100๋ฅผ ์ง์๋ก ์ ๋ฌํ์ง ๋ง์ญ์์ค.
- ์๋ ์ขํ๋ฅผ ๋์ ์ขํ์์ ๋บ ๋ค์ ์ฐจ์ด์ ๋ถํธ๋ฅผ ํ์ธํฉ๋๋ค. Y ๊ฐ์ - ๋ถ์ชฝ, ์ฆ๊ฐ X - ๋์ชฝ. ๋ ์ขํ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋ฉด ์ฐจ์ด ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋๊ฐ์ ์ด ์ ํ๋ฉ๋๋ค. ๋ ์ฐจ์ด๊ฐ ๋ชจ๋ 0์ธ ๊ฒฝ์ฐ - 100.
return RunScenario();
object? RunScenario()
{
var direction = UO.CalcDir(100, 100, 100, 100);
if (Truth(direction == 100))
{
return "already there";
}
return "different point";
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- (20,20)์์ (19,21)๋ก ๊ฐ ๋, X๋ ๊ฐ์ํ๊ณ , Y๋ ์ฆ๊ฐ: UO.CalcDir๋ 5์ ๋ฐํํฉ๋๋ค. RebuildDirection์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๋ถ๊ธฐ๋ฅผ ํ์ํ๊ณ 5๋ ์ ๊ณตํฉ๋๋ค. ๋ฉ์ธ์ "5:5"์ ๋ฐํํฉ๋๋ค. ๋ค ๊ฐ์ง ๋ณด์กฐ ๋งค๊ฐ๋ณ์๋ ๋ชจ๋ ๋์ผํ ์ขํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
- int โ ๋ฐฉํฅ ์ฝ๋: 0=๋ถ์ชฝ, 1=๋ถ๋์ชฝ, 2=๋์ชฝ, 3=๋จ๋์ชฝ, 4=๋จ์ชฝ, 5=๋จ์์ชฝ, 6=์์ชฝ, 7=๋ถ์์ชฝ. ๋งค์นญ ํฌ์ธํธ๋ 100๋ฅผ ์ ๊ณตํฉ๋๋ค. bool์ด ์๋๋๋ค. 0๋ ์คํจ๊ฐ ์๋๋ผ ๋ถ์ชฝ์ ์๋ฏธํฉ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ๋ถ๋์ชฝ์ ์๋ฏธํฉ๋๋ค. ๋จ๊ณ ๋ช ๋ น์ 100๋ฅผ ์ง์๋ก ์ ๋ฌํ์ง ๋ง์ญ์์ค.
- ์๋ ์ขํ๋ฅผ ๋์ ์ขํ์์ ๋บ ๋ค์ ์ฐจ์ด์ ๋ถํธ๋ฅผ ํ์ธํฉ๋๋ค. Y ๊ฐ์ - ๋ถ์ชฝ, ์ฆ๊ฐ X - ๋์ชฝ. ๋ ์ขํ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋ฉด ์ฐจ์ด ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋๊ฐ์ ์ด ์ ํ๋ฉ๋๋ค. ๋ ์ฐจ์ด๊ฐ ๋ชจ๋ 0์ธ ๊ฒฝ์ฐ - 100.
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 actual = UO.CalcDir(20, 20, 19, 21);
var rebuilt = RebuildDirection(20, 20, 19, 21);
return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
return null;
}
dynamic RebuildDirection(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
{
var dx = Xto - Xfrom;
var dy = Yto - Yfrom;
if (Truth(dx == 0) && Truth(dy == 0))
{
return 100;
}
if (Truth(dx == 0))
{
if (Truth(dy < 0))
{
return 0;
}
return 4;
}
if (Truth(dy == 0))
{
if (Truth(dx > 0))
{
return 2;
}
return 6;
}
if (Truth(dx > 0))
{
if (Truth(dy < 0))
{
return 1;
}
return 3;
}
if (Truth(dy > 0))
{
return 5;
}
return 7;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CalculateDirection:CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "calcdir": return new InjectionValue(CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CancelMove();MoveOff๋ฅผ ํตํ ์คํฌ๋ฆฝํธ์ ์ถ๊ฐ ์ด๋ ํ์ฉ์ ๋นํ์ฑํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ฐํ์/๊ด๋ฆฌ์๋ฅผ MoveEnabled=false ์ํ๋ก ๋ง๋๋ MoveOff๋ฅผ ํธ์ถํฉ๋๋ค. ๋ค์ ์ด๋์ ํ์ฑํํ๋ ค๋ฉด MoveOn๊ฐ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ด๋ฏธ ์ ์ก๋ ๋จ๊ณ๋ฅผ ๋กค๋ฐฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CancelMove");
UO.CancelMove();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ค์ ๋์ ๋ช ๋ น์ ๊บผ์ง๋ ํด์๋๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.CancelMove();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MoveOn๋ ๋ช ์์ ์ผ๋ก ํด์๋๋ฅผ ๋ณต์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CancelMove();
UO.MoveOn();
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()
{
if (!(Truth(UO.Connected())))
{
UO.CancelMove();
}
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.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveOff:MoveOff().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "cancelmove": MoveOff(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Dir();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ ๋ฐฉํฅ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์คํ ๋นํธ๊ฐ ์๋ ๋ฐฉํฅ mobile: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ์ ์ ์๋ ๊ฒฝ์ฐ mobile๋ ๋ถ์ชฝ์ ์๋ฏธํ๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Dir();
UO.Print("Dir: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Dir();
UO.Print("Dir: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ๋ฌธ์์ ๋ฐฉํฅ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Dir();
if (Truth(value == 2))
{
UO.Print("Facing east");
}
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(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๊ต ๋ณ๊ฒฝ: ๋ฌธ์ ๋ฐฉํฅ. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Dir();
await Delay(1000);
var after = UO.Dir();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Dir]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetDir(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Direction();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ ๋ฐฉํฅ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์คํ ๋นํธ๊ฐ ์๋ ๋ฐฉํฅ mobile: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ์ ์ ์๋ ๊ฒฝ์ฐ mobile๋ ๋ถ์ชฝ์ ์๋ฏธํ๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Direction();
UO.Print("Direction: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Direction();
UO.Print("Direction: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ๋ฌธ์์ ๋ฐฉํฅ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Direction();
if (Truth(value == 2))
{
UO.Print("Facing east");
}
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(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๊ต ๋ณ๊ฒฝ: ๋ฌธ์ ๋ฐฉํฅ. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Direction();
await Delay(1000);
var after = UO.Direction();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Direction]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetDir(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FixWalk();๋ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ํด๋ผ์ด์ธํธ ํจ์น FixWalk๊ฐ ํ์ํ์ง ์์ ClassicUO์ ์๋ฆฌ๋ ์๋ฆผ์ ์ธ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ExecuteLegacyManualAlias ๋ถ๊ธฐ๋ SystemMessage๋ง ํธ์ถํฉ๋๋ค. ๋์, ์์ฑ, ์ปจํ ์ด๋ ๋๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ์์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FixWalk");
UO.FixWalk();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ์์ง๋ ์ด์ ํจ์น๊ฐ ํ์ํ์ง ์์์ ์ค๋ช ํฉ๋๋ค.
UO.FixWalk();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธํ์ฑ ์ ์ฐจ๋ ๊ฒ์ ์ธ๊ณ๋ฅผ ๋ฐ๊พธ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
CompatibilityNotice();
return null;
}
void CompatibilityNotice()
{
UO.FixWalk();
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง๋จ ๋ฉ์์ง ํ์ ์คํ์ด ๊ณ์๋ฉ๋๋ค.
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.FixWalk();
UO.Print("continued");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "boxhack":
case "fixtalk":
case "fixwalk":
SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");
break;Follow๋ UO.LimitMove, moveCheckStamina, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost, moveExitOnDisconnect, moveBetweenTwoCorners์ SetBadLocation/SetBadObject ์ค๋ ์ท์ ์ ์ฉํฉ๋๋ค. ์บ๋ฆญํฐ ์ ๊ทผ ๊ฑฐ๋ฆฌ์๋ 0์ ์ง์ ํ ์ ์์ผ๋ฉฐ UO.LimitMove ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ์ ๋ณ๊ฐ์ ๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Follow();
int UO.Follow(object? target);
int UO.Follow(object? target, object? distance);
int UO.Follow(object? target, object? distance, object? running);
int UO.Follow(object? target, object? distance, object? running, object? stopConditions);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running, object? stopConditions);๋ก๋๋ ์บ๋ฆญํฐ/NPC์ ๋ฐฐ๊ฒฝ ์ถ์ ๋๋ X, Y, Z ์ง์ ์ผ๋ก์ ์ด๋์ ํ์ฑํํฉ๋๋ค. ์ด๋ ์ค์ ํด๋ผ์ด์ธํธ๋ ์ ์ก๋ ์ค์ง ์กฐ๊ฑด์ ํ์ธํฉ๋๋ค. ํธ์ถ ์งํ ์คํฌ๋ฆฝํธ๊ฐ ๊ณ์ ์คํ๋ฉ๋๋ค.
-
targetโ ๋ฌธ์ ์ผ๋ จ/NPC: int, 16์ง์/10์ง์ ๋ฌธ์์ด, lasttarget ๋๋ ์ด์ ์ AddObject๋ฅผ ํตํด ์ ์ฅ๋ ์ด๋ฆ. graphic/type ๋๋ ์ขํ๊ฐ ์๋๋๋ค. ์์ ์ด๋ ์ฌ๋ฌผ์ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค. 0 ํ๋ก์ฐ๋ฅผ ์ค์งํฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด Follow()๋ ์ด๋ฅผ ์ค์งํฉ๋๋ค. ๊ด๊ฒฝ์ ๋ํ๋์ง ์์ต๋๋ค. -
distanceโ ์ ๋ด X/Y์ ๋ํ ํ์ฉ์ค์ฐจ: ์ต๋ |dx| ๊ทธ๋ฆฌ๊ณ |dy|. ๋ฌธ์ int 0..18์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค. Z์์ 16๊น์ง์ ์ฐจ์ด๋ ํ์ฉ๋ฉ๋๋ค. int 0..18 ์ง์ ์ ๊ฒฝ์ฐ ์ธ์๊ฐ ํ์ํฉ๋๋ค. 0์๋ ์ ํํ X/Y๊ฐ ํ์ํ๋ฉฐ, 2์์๋ ๋ ์ ๋ด์์ ์ค์งํ ์ ์์ต๋๋ค. Z๋ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ์๋ชป๋ ๊ฐ์ ์ด์ ๋์์ ๋์ฒดํ์ง ์์ต๋๋ค. -
running- bool ํธํ ๊ฐ: true/1 - ๋ฌ๋ฆฌ๊ธฐ, false/0 - ๊ฑท๊ธฐ; ๊ธฐ๋ณธ๊ฐ์ true์ ๋๋ค. ์๋ฒ ์๋ ์ ํ, ์ฒด๋ ฅ, ๋ง๋น ๋ฐ ์ฅ์ ๋ฌผ์ด ๋จ์ ์์ต๋๋ค. ํ๋๊ทธ๋ ์๋ฒ ๋จ๊ณ์ ์๋๋ฅผ ๋์ด์ง ์์ต๋๋ค. -
stopConditionsโ ์ค์ง ์กฐ๊ฑด์ ์ ํ์ ๋ฐฐ์ด: ๋ฌธ์์ ๋ํ ๋ค ๋ฒ์งธ ์ธ์, ์ขํ์ ๋ํ ์ฌ์ฏ ๋ฒ์งธ ์ธ์์ ๋๋ค. ๊ฐ ์์๋ ์ ํํ 3๊ฐ์ ๊ฐ[ํ๋, ๋น๊ต, ์๊ณ๊ฐ]์ ๋ฐฐ์ด์ ๋๋ค. ํ๋์ ๋น๊ต๋ ๋ฌธ์์ด์ด๊ณ ์๊ณ๊ฐ์ int/double์ ๋๋ค. ํ๋๊ทธ์ ๊ฒฝ์ฐ true/false (1/0)๊ฐ ์ ํฉํฉ๋๋ค. ANY ์กฐ๊ฑด์ด ํธ๋ฆฌ๊ฑฐ๋๋ฉด Follow(OR)์ด ์ข ๋ฃ๋ฉ๋๋ค. ๋น ๋ฐฐ์ด์ ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ์์ ์๋ ๊ณ ์ ๋ 3/5/10 ํญ๋ชฉ์ผ๋ก ์ ํ๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ํด ์ ํ๋ฉ๋๋ค. ํฐ ๋ชฉ๋ก์ ๋ฉ์ด๋ฆฌ๋ก ๊ฒ์ฌ๋ฉ๋๋ค. ํ์ฉ๋๋ ํ๋์ ๋จ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด์ Follow์ด ๋์ฒด๋๊ธฐ ์ ์ ์ ์ ์๋ ํ๋, ์ฐ์ฐ์ ๋๋ ์๋ชป๋ ๋ฐฐ์ด ํ์์ผ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. -
x- 5/6 ์ธ์๊ฐ ์๋ ์์๋ง ํด๋น: ํ์ฌ ์ง๋, 0..65535 ๋ฐ ๋ก๋๋ ์ง๋ ๊ฒฝ๊ณ ๋ด๋ถ์ ์ ์ ์ธ๊ณ ์ขํ์ ๋๋ค. ์ด๋ ์ฐฝ/๊ฒํ ์ขํ๋ serial๊ฐ ์๋๋๋ค. ๋ค๋ฅธ ์นด๋๋ก์ ์ด์ฒด๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. -
y- 5/6 ์ธ์๊ฐ ์๋ ์์๋ง ํด๋น: ํ์ฌ ์ง๋, 0..65535 ๋ฐ ๋ก๋๋ ์ง๋ ๊ฒฝ๊ณ ๋ด๋ถ์ ์ ์ ์ธ๊ณ ์ขํ์ ๋๋ค. ์ด๋ ์ฐฝ/๊ฒํ ์ขํ๋ serial๊ฐ ์๋๋๋ค. ๋ค๋ฅธ ์นด๋๋ก์ ์ด์ฒด๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. -
z- 5/6 ์ธ์๊ฐ ์๋ ํ์๋ง ๊ฐ๋ฅ: ์ ์ ์ธ๊ณ ๋์ด -128..127. ์์ฑ์ ํ์ํ ๋์ด์ด๋ฏ๋ก ์ํ๋ ๋ฐ๋ฅ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฉด์ Z ์ง์ ํฉ๋๋ค. ๋ณ๋์ "๋ชจ๋ Z" ๊ฐ์ด๋ ์๋ ๋์ด ์ ํ์ด ์์ต๋๋ค.
int 1 (true) โ ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ๋ชจ๋๋ฅผ ์น์ธํ๊ฑฐ๋ ์ค์ง ์์ฒญ์ด ์๋ฃ๋์์ต๋๋ค. int 0 (false) - ์ ํฉํ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์๊ฑฐ๋, ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์ฃฝ์๊ฑฐ๋, ๋์์ด ๋ณด์ด์ง ์๊ฑฐ๋, ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ์ง ์๊ฑฐ๋, ํด๋ผ์ด์ธํธ๊ฐ ํ์ ์ง์ํ์ง ์์ต๋๋ค. ์ด๋ ๋์ฐฉ ๊ฒฐ๊ณผ๋ ์๋๊ณ serial๋ ์๋๊ณ ๊ฑธ์ ์๋ ์๋๋๋ค. C#์์๋ if (๊ฒฐ๊ณผ != 0) ๋๋ if (๊ฒฐ๊ณผ == 1)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๊ณผ๋ bool์ด ์๋ int ์ ํ์ ๋๋ค. ์ ํ ์ค๋ฅ/์ ์ ์๋ ๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ์ธํด ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ขํ์ ๊ฒฝ์ฐ 0๋ ์ ํจํ์ง ์์ X/Y/Z ๋๋ ๊ณต์ฐจ๋ฅผ ์๋ฏธํฉ๋๋ค. 1์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ง ์๋ฝํจ์ ์๋ฏธํฉ๋๋ค. ๋์ฐฉ ์ฌ๋ถ์ ํฅํ ์ ์ฃผ ์ฌ๋ถ๋ ์์ง ํ์ธ๋์ง ์์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋น ์ ํํ ํ๋์ ๋ชจ๋ Follow(๋ฌธ์ ๋๋ ์ขํ). ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด ๋์๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ ๋์ฒด๋ฉ๋๋ค. ์คํจํ ๋์ ์ ์ด์ ๋ชฉํ๋ฅผ ์ทจ์ํ์ง ์์ต๋๋ค. ์บ๋ฆญํฐ๋ฅผ ํ๋ก์ฐํ๋ ค๋ฉด ํด๋น ์บ๋ฆญํฐ๊ฐ ClientViewRange ๋ด์ ๋ก๋๋ ๋ชจ๋ฐ์ผ ๋ชฉ๋ก์ ์ด๋ฏธ ์์ด์ผ ํฉ๋๋ค. ์ขํ ์ง์ ์ด ๋ทฐ๋ณด๋ค ๋ ๋ฉ ์๋ ์์ต๋๋ค.
- ์บ๋ฆญํฐ ๊ทผ์ฒ์ ๊ฑฐ๋ฆฌ์ ๋๋ฌํ๋ฉด ๊ฑท๊ธฐ๊ฐ ์ค์ง๋์ง๋ง ๋ชจ๋๋ ์ผ์ง ์ํ๋ก ์ ์ง๋๋ฉฐ ๋์์ด ๋ฉ์ด์ง๋ฉด ์ด๋์ ๋ค์ ์์ํฉ๋๋ค. ์ขํ์ ๊ทผ์ฒ์์ ๊ณต์ฐจ X/Y ๋ฐ ์ ํํ ๊ณต์ฐจ Z๊ฐ ์ถฉ์กฑ๋๋ฉด ์์ ์ด ์์ ํ ์๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์์ ์ ๊ฒฝ๋ก์ ๋ณด์ฅ๋ ์ฐ๊ฒฐ ๊ฐ๋ฅ์ฑ์ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
- Follow(), Follow(0), MoverStop(), ์๋ ๋ง์ฐ์ค/ํ์ดํ ์ด๋, ์ ์คํฌ๋ฆฝํธ ๊ฒฝ๋ก ๋๋ ํ์ค ํด๋ผ์ด์ธํธ ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ชจ๋๊ฐ ์ค์ง๋ฉ๋๋ค. TerminateAll/Terminate("all") ๋ ์ค์งํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ์์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ทจ์ํ๋ฉด ์ค์ง๋ฉ๋๋ค Follow.
- ๋ ๋ชจ๋ ๋ชจ๋ ๋งต์ด๋ ์บ๋ฆญํฐ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ํ๋ ์ด์ด๊ฐ ์ฃฝ๊ฑฐ๋, ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ข ๋ฃ๋ฉ๋๋ค. ๋์์ด ๋ฉ๋ชจ๋ฆฌ/๋ทฐ์์ ์ฌ๋ผ์ง๋ฉด ์บ๋ฆญํฐ ์ถ์ ์ด ์ถ๊ฐ๋ก ์ค์ง๋ฉ๋๋ค. ๋์ค์ ๋์์ด ๋ํ๋๋๋ผ๋ ์๋์ผ๋ก ๋ชจ๋๊ฐ ์คํ๋์ง ์์ต๋๋ค. ์๋ก์ด Follow๊ฐ ํ์ํฉ๋๋ค.
- IDE๋ฅผ ๋ซ์๋ ๋ชจ๋๊ฐ ์ค์ง๋์ง ์์ต๋๋ค. ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด Follow์ด ํ์ฑํ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง ์์ฒด๋ ํด๋น ํด๋ผ์ด์ธํธ ๋ชจ๋์ ๋ํ ์ผ์ ์ค์ง๊ฐ ์๋๋๋ค. ์ผ์์ ์งํ๊ธฐ ์ ์ ์์ง์์ ๋ฉ์ถฐ์ผ ํ ๋๋ Follow(0)๋ฅผ ์ฌ์ฉํ์ธ์.
- Pathfinder๋ ๊ฒ์ ์คํธ๋ฆผ์ ๊ฒฝ๋ก๋ฅผ ์ฒญํฌ๋ก ๊ณ์ฐํฉ๋๋ค. ๋ถ์์ ํ ๊ฒ์์ ๋ค์ ์์๋์ง ์์ต๋๋ค. mobile์ ๊ฒฝ์ฐ ์ผ๋ฐ ๊ฒฝ๋ก ์ ๋ฐ์ดํธ๋ 500 ms๋ก ์ ํ๋ฉ๋๋ค. ์ ๊ทผํ์ง ์๊ณ ๊ฒฝ๋ก๊ฐ ์คํจํ๊ฑฐ๋ ์ข ๋ฃ๋ ํ ์ฒ์ ์ธ ๋ฒ์ ์ฌ์๋ ์ง์ฐ์ 1000ms์ด๊ณ ๊ทธ ๋ค์์ 2000, 4000์ด๋ฉฐ ์ต๋ 5000ms์ ๋๋ค. X/Y/Z ํ๋ ์ด์ด ๋๋ ๋์์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐ์ด์ค ์นด์ดํฐ๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ๋ชฉํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋๊ธฐ ์๊ฐ์ ์ต๋ 500 ms๊น์ง ์ค์ผ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ mobile ๋์์ ๋ฐ๋ณต ํ์์๋ ์ผ๋ฐ์ ์ธ ์ ํ์ด ์์ต๋๋ค. ๋ชจ๋๋ ์ด๋ํ์ง ์๊ณ ๋ ํ์ฑ ์ํ๋ฅผ ์ ์งํ ์ ์์ผ๋ฏ๋ก ๊ฒฝ๊ณผ๋๋๋ก ์ค์ ํ๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ค์งํ๋๋ก ์ค์ ํ์ธ์. ๊ฒฝ๋ก๊ฐ ์์ ํ ์คํจํ๋ฉด ์ขํ ์์ ์ด ์ข ๋ฃ๋ฉ๋๋ค.
- ๊ฑฐ๋ฆฌ/์๊ฐ ํ๋: ๊ฑฐ๋ฆฌ โ ๋์๊น์ง์ ํ์ฌ ๊ฑฐ๋ฆฌ(์ ) max(abs(dx),abs(dy)); ๋์ด โ ์ธ๊ณ ๋จ์์ ์ ๋ ์ฐจ์ด Z; ๊ฒฝ๊ณผ๋จ - Follow์ด ์น์ธ๋ ์ดํ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๊ฑฐ๋ฆฌ > 12๋ 12 ์ ๋ณด๋ค ๋ ๋ฉ๋ฆฌ ์ด๋ํ๋ฉด ์ ์งํ๊ณ , ๊ฒฝ๊ณผ๋ ์๊ฐ์ >= 30000 - 30์ด ํ์ ๋๋ค. ๋ฐ๋ณต์ ์ผ๋ก ์ฑ๊ณตํ๋ฉด Follow ์นด์ดํธ๋ค์ด์ด ๋ค์ ์์๋ฉ๋๋ค.
- ์บ๋ฆญํฐ ์ํ: self.hp / self.mana / self.stam - ํ์ฌ ๊ฐ; self.hppercent / self.manapercent / self.stampercent - ํด๋น ์ต๋๊ฐ์ ๋ฐฑ๋ถ์จ 0..100์ ๋๋ค. ์ ์ ์๋ ์ต๋๊ฐ(<=0)์ ์ ์ ์๋ ๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ๊ฐ์์ 0์ ์์ ํ๋ ๋์ ์ด ํน์ฑ์ ๋ํ ์กฐ๊ฑด์ด ํธ๋ฆฌ๊ฑฐ๋์ง ์์ต๋๋ค.
- ์บ๋ฆญํฐ์ ๋ ผ๋ฆฌ ํ๋: self.poisoned(์ค๋ ๋จ), self.paralyzed(๋ง๋น๋จ), self.hidden(์จ๊น). ๊ฐ โ1/0. ์กฐ๊ฑด ๋ฐฐ์ด Follow์์ ์ฐ์ฐ์ "="์ ๊ฐ true๊ฐ ์๋ "self.paralyzed" ํ๋์ ๋ํ ๊ท์น์ ๋ง๋น๋๋ฉด ๋ฐ๋ผ๊ฐ๊ธฐ๋ฅผ ์ค์งํฉ๋๋ค. ์ด๋ C# ๋ณ์ self๊ฐ ์๋ ๊ท์น ํ๋์ ๋ฌธ์์ด ์ด๋ฆ์ ๋๋ค.
- ๋์ ํ๋: target.dead - ๋ฐ๋ mobile, target.hidden - ์จ๊น, target.visible - ํด๋ผ์ด์ธํธ์ ํ์(CheckLOS ์๋), target.hp / target.hppercent - ๋ก๋๋จ HP/percent. HP max๋ฅผ ์ ์ ์์ผ๋ฉด HP ์กฐ๊ฑด์ด ์คํจํฉ๋๋ค. ์๋ฒ์์๋ ๋ค๋ฅธ ์บ๋ฆญํฐ์ ์๋์ ์ธ ์ค์ผ์ผ HP์ ์ ์กํ ์ ์์ผ๋ฏ๋ก hppercent๊ฐ ๋ ํธ๋ฆฌํฉ๋๋ค.
- ์ถ๊ฐ ๋์ ํ๋: target.notoriety - ์ํ 0..7 (0 ์ ์ ์์, 1 ๋ฌด์ฃ, 2 ๋๋งน, 3 ํ์, 4 ๋ฒ์ฃ, 5 ์ , 6 ์ด์ธ์, 7 ๋ฌด์ ); target.body โ ๋ชธ์ฒด์ ์ซ์ graphic. type ์ท์ด ์๋๋๋ค. ์๋ฅผ ๋ค์ด target.notoriety != 2 ๋๋งน ์ํ๊ฐ ์์ค๋๋ฉด ์ถ์ ์ ์ค์งํฉ๋๋ค.
- ํธ์ถ ์ ์ซ์ ์๊ณ๊ฐ์ ํฌํจํ์ฌ ์กฐ๊ฑด์ ๋ณต์ฌ๋ณธ์ด ์บก์ฒ๋ฉ๋๋ค. ์์ค ๋ฐฐ์ด/๋ณ์๋ฅผ ๋ณ๊ฒฝํด๋ ๋ชจ๋๋ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ์ ์ด๋ ์ด๋ก Follow๋ฅผ ๋ฐ๋ณตํฉ๋๋ค. ์ทจ์๋ ๋ชจ๋๋ ์กฐ๊ฑด์ด ๋ ์ด์ ์ถฉ์กฑ๋์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ฌ๊ฐ๋์ง ์์ต๋๋ค.
- ์ด๋ํ๋ ๋์๊ณผ ์บ๋ฆญํฐ๊ฐ ์ด๋ฏธ ๋์ ๊ทผ์ฒ์ ์ ์์ ๋ ์กฐ๊ฑด์ ํ์ธํฉ๋๋ค. ์ต๋ 64 ์์์ ์ผ๋ฐ ๋ชฉ๋ก์ ํ๋์ ๊ฒ์ ํ๋ ์์์ ํ์ธ๋๋ฉฐ, ๋ค์ ํ์ธ์ 250 ms ์ดํ๋ณด๋ค ๋น ๋ฅด์ง ์์ต๋๋ค. ๋ ํฐ ๋ชฉ๋ก - ํ๋ ์๋น 64 ์์, ๊ทธ ๋ค์ ์ผ์ ์ ์ง 250 ms. ๊ฒฝ๊ณผ๋ ํ๋๋ ํ์ธ/ํ๋ ์ ๊ธฐ๊ฐ ๋์ ์๊ณ๊ฐ๋ณด๋ค ๋ฆ๊ฒ ์ค์ง๋ ์ ์์ต๋๋ค. ์ด๋ ์ ํํ ํ์ด๋จธ๊ฐ ์๋๋๋ค.
- ์ ์ฒด ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ ํ์ธ์ด ์๋ฃ๋ ๋๊น์ง ์๋ก์ด ๊ฒฝ๋ก๊ฐ ์์๋์ง ์์ต๋๋ค. ์กฐ๊ฑด์ด ์ด๋ฏธ ์ถฉ์กฑ๋ ๊ฒฝ์ฐ Follow๋ ์๋ฝ๋ ์์ฒญ์ ๋ํด 1๋ฅผ ๋ฐํํ๊ณ ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์์ด ์ ๋ฐ์ดํธ๋ฅผ ์ค์งํฉ๋๋ค. ์ด์ ์ด๋์ ๋จ๊ณ ํจํท์ด ์ด๋ฏธ ์ ์ก๋์์ ์ ์์ต๋๋ค.
- ์๋ก์ด ์กฐ๊ฑด์ ํ์ ์ค์ง ์ด์ ๋ฅผ ๋นํ์ฑํํ์ง ์์ต๋๋ค: ๋์/ํ๋ ์ด์ด/์นด๋/๋งํฌ ์์ค, ํ๋ ์ด์ด ์ฌ๋ง, ์์ ์ ์ทจ์, Terminate ์ ์ฒด ๋ฐ ์๋/๊ธฐํ ์ด๋. ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๊ฒ์ ์ค๋ ๋์์ ์คํ๋์ง ์์ต๋๋ค. ๋์ด๋ ๋ก์ปฌ ๊ฐ๋ง ํ์ธ๋ฉ๋๋ค.
- ์ขํ ํํ: โโFollow(x,y,z,distance,running) ๋ฐ Follow(x,y,z,distance,running,stopConditions). ์ฒ์ 5๊ฐ์ ์ธ์๊ฐ ํ์ํฉ๋๋ค. Follow(x,y,z)๋ ์ขํ์ ๋ํ ์ฝ์นญ ํ๊ธฐ๋ฒ์ด ์๋๋๋ค. ์ธ ๊ฐ์ง ์ธ์๋ ์ฌ์ ํ ๋ชฉํ, ๊ฑฐ๋ฆฌ, ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ขํ ๋ชจ๋์์ ์กฐ๊ฑด์ ๊ฑฐ๋ฆฌ๋ X/Y๋ฅผ ๋ฐ๋ผ ํด๋น ์ง์ ๊น์ง ๋จ์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๊ณ , ๋์ด๋ ํด๋น Z์์ ์ ๋ ์ฐจ์ด์ ๋๋ค. ์๊ฐ์ด ์ง๋๋ฉด ๋ชจ๋ self.๊ฐ ํ์๋๋ก ์๋ํฉ๋๋ค. target. ํ๋๊ฐ ์ ํจํ์ง ์์ต๋๋ค. ํฌ์ธํธ์ HP, ๋ณธ๋ฌธ ๋๋ ์ํ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ์ ๋ฌํ๋ ค๊ณ ํ๋ฉด ์ด์ ๋ชจ๋๊ฐ ๋์ฒด๋ ๋๊น์ง ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์กฐ๊ฑด์ ์ฒซ ๋ฒ์งธ ๊ฒฝ๋ก ์ด์ , ๊ณ์ฐ ์ค, ์บ๋ฆญํฐ๊ฐ ์ด๋ํ๋ ๋์ ํ์ธ๋ฉ๋๋ค. ์กฐ๊ฑด์ ํธ๋ฆฌ๊ฑฐํ๋ฉด ์์ ์ด ์ ๊ฑฐ๋๊ณ ํด๋น ์์ ์ ์ํ ๊ฒฝ๋ก๊ฐ ์ทจ์๋ฉ๋๋ค. ํฐ ๋ชฉ๋ก์ ๋น๋์ ์ฒ๋ฆฌ๋ ๋ฌธ์๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ด๋ฏธ ์๋ฒ๋ก ์ ์ก๋ ๋จ๊ณ๊ฐ ์๋ฃ๋ ์ ์์ต๋๋ค.
- ์ขํ ์์ ์ ํด๋น ์ง์ ์ ๋๋ฌํ๊ฑฐ๋ ๊ฒ์ ๋ฐ ์ด๋์ด ํด๋น ์ง์ ์ ๋๋ฌํ์ง ๋ชปํ ์ฑ ์คํจ/์ข ๋ฃ๋๋ฉด ์ข ๋ฃ๋ฉ๋๋ค. ๋๋ฌํ ์ ์๋ ์ง์ ์ ๋ํ ๋ฌดํ ์ฌ์๋๋ ํธ๋ฆฌ๊ฑฐ๋์ง ์์ต๋๋ค. ์ฅ์ ๋ฌผ์ ๋ํ Pathfinder์ ์ผ๋ฐ์ ์ธ ๋ด๋ถ ์ฌ๊ณ์ฐ์ ์ ์ง๋ฉ๋๋ค. ์๋ฃ๋๋ฉด ํด๋น ์์น๋ฅผ ๋ ๋๋ ์์ ์ด ์ฌ๊ฐ๋์ง ์์ต๋๋ค.
- Pathfinder๊ฐ ์ด๋ฏธ ๋ง์ง๋ง ๋จ๊ณ๋ฅผ ๋ณด๋ด๊ณ ๊ฒฝ๋ก๋ฅผ ์๋ฃํ์ง๋ง ํด๋น ๋จ๊ณ๊ฐ ์์ง ์คํ ์ค/ํ์ธ ๋๊ธฐ ์ค์ธ ๊ฒฝ์ฐ ์์ ์ ๊ณ์ํด์ ์กฐ๊ฑด์ ํ์ธํฉ๋๋ค. ์ ์ก๋ ๋จ๊ณ์ ๋๊ธฐ์ด ์์ฒด๋ ์ง์์ง์ง ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ ์๋ฒ ์ด๋ ๋ฐ ํ์ธ ๋ฉ์ปค๋์ฆ์ ํตํด ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
- ๋ชฉ๋ก์ DO ... ๋ฃจํ ๋ ๋๋ FOR์์ List.Add๋ฅผ ํตํด ์กฐํฉํ ๋ค์ ์ ์ ํ ํ์์ ๋ง์ง๋ง ์ธ์๋ก checks.ToArray()์ ํ ๋ฒ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ฐ๋ณตํ ๋๋ง๋ค Follow๋ฅผ ๋ค์ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋๊ฐ ๋์ฒด๋๊ณ ๊ฒฝ๊ณผ๋ ์๊ฐ์ด ์ฌ์ค์ ๋ฉ๋๋ค. ํ ์๋ ์์๋ก ์ ํ๋์ง ์์ง๋ง ์ง์๋๋ ํ๋ ์งํฉ์ ์์ ๋์ด๋ ํ๋๋ก ์ ํ๋ฉ๋๋ค.
- ๋ณ๊ฒฝํ์ง ์๊ณ 2000ms ํ์ X/Y/Z ํ๋ ์ด์ด mobile-Follow๋ ์ ์ง ๋์์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ค์ ์์ฒญํ ์ ์์ต๋๋ค. ๊ฒ์ฌ๋ ๋ค์ ๋ง๊ฐ์ผ์ด ๋ฐ์ํ ๋, ๊ฒ์ ์ธ๋ถ์์, Player.Steps ๋ฐ Walker ํ๊ฐ ํด์ ๋ ํ, ๋ค์ ๋จ๊ณ๊ฐ ํ์ฉ๋ ๋๋ง ์ํ๋ฉ๋๋ค. ๋๋ฆฐ ์๋๋ก ์ด๋ํ๊ณ ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ์๋ ๋น์ฉ์ด ๋ค์ง ์์ต๋๋ค. ์ ์ก๋ ๋จ๊ณ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์ขํ Follow๋ ์ธ๋ถ ๋ฌดํ ๋ฐ๋ณต์ ์์ํ์ง ์์ต๋๋ค. ๊ฒฝ๋ก ๋ณต์์ ์ ํ๋ Pathfinder์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ผ๋ฐ Pathfinder๋ ํด๋น ํ์ฑ ์์ฒญ์ ๊ฑฐ๋ถ๋ ์ด๋์๋ง 2000 ms ๋์ ๋ฐฉํฅ ์ ํ X/Y/Z์ ๋ํ ์ต๋ 8 ์์ ๊ธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ , ์ ์ ์๋ ์ํ์ค, ์ฌ๋๊ธฐํ ๋ฐ ์ด์ /์ธ๋ถ ์์ฒญ์ ์ด๋ฌํ ๊ธ์ง๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์๋ก์ด ์ธ๋ถ ์์ฒญ ๋ฐ ์ง๋/ํ๋ ์ด์ด ์ปจํ ์คํธ ์์ค๋ก ์ธํด ํด๋น ์ปจํ ์คํธ๊ฐ ์ง์์ง๋๋ค. ๋ก๋๋ ํ์ ๊ฒ์์ ์ ํ์ ์ฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ฒ์ ๋ชจ๋ ์ฅ์ ๋ฌผ์ ์๋ ๊ฒ์ ์๋๋๋ค. ํ๋ ์ด์ด์ X/Y/Z๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ต์ 40 ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 8 ๋ด๋ถ ์ฌ๊ณ์ฐ์ด ํ์ฉ๋ฉ๋๋ค. ์์ ํ ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋ ์ด ์์ฐ์ด ์์ง๋์์ต๋๋ค. ๊ฒฝ๋ก๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ถ๋ ๋จ๊ณ๋ฅผ ์ฒ๋ฆฌํ ํ ์กฐ์ ์์ ์ด ์๋ฃ๋ฉ๋๋ค. mobile~Follow๋ ์ง์ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ AutoWalking ์ฌ์ค์ด ์๋ ์์ฒด ๋ชจ์ ์์ฒญ ์๋ฅผ ๋น๊ตํฉ๋๋ค. ๊ฒฝ๋ก์ ์์ฐ์ค๋ฌ์ด ๋์ ์ธ๋ถ ๋ช ๋ น์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. StopOwnedPath์ ์ ์ฅ๋ ๋ฒํธ๋ฅผ StopAutoWalkIfRequestGeneration๋ก ์ ์กํฉ๋๋ค. ์๋ก์ด ์ธ๋ถ ์์ฒญ์ ๊ธฐ์กด Follow๋ฅผ ์ข ๋ฃํฉ๋๋ค. ์ด๋ฅผ ์ค์งํด๋ ๋ค๋ฅธ ์ฌ๋์ ์ ๊ฒฝ๋ก๊ฐ ์ทจ์๋์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Follow();
UO.Print("Follow: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฆฌ๋ โ ๋ง์ง๋ง ํ๊ฒ์ serial. ์ฅ์น๋ ๋์ฐฉ์ด ์๋ ์ ๊ถ ์๋ฝ์ ํ์ธํฉ๋๋ค. ๋ฉ์๋๊ฐ ๋๋๋ฉด ๋์์ด ์ค์ง/์์ค๋ ๋๊น์ง ๋ชจ๋๊ฐ ๊ณ์ ์๋ํฉ๋๋ค.
var leader = UO.GetSerial("lasttarget");
var accepted = UO.Follow(leader);
if (Truth(Truth(accepted) == true))
{
UO.Print("Following is enabled; script continues");
}
else
{
UO.Print("Select a loaded nearby character");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait๋ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ธก์ ๋ฉ๋๋ค. Follow(0)๋ ์ผ๋ฐ ํ๋ก์ฐ ๋ชจ๋๋ฅผ ๋๋๋ค. ์ดํ์ ๋์ ์ด๋์ผ๋ก ์ธํด ๋ ์ด์ ์ด๋์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var leader = UO.GetSerial("lasttarget");
if (Truth(UO.Follow(leader, 3, false) == 1))
{
await Delay(10000);
UO.Follow(0);
UO.Print("Following stopped");
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฑฐ๋ฆฌ=2, ๋ฌ๋ฆฌ๊ธฐ=true; 500 ms์ ๋ํ ์ต๋ 20 ๊ธฐ๋์น์
๋๋ค. Exists๋ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ํ์ธํ์ง๋ง ๊ฒฝ๋ก์ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
finally์ ์์ ์ธ ์ข ๋ฃ/์ค๋ฅ ์ค์ ๋ชจ๋๋ฅผ ์ค์งํฉ๋๋ค. ๊ธด๊ธ ์์ ์ ์ทจ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var leader = UO.GetSerial("leader");
if (Truth(UO.Follow(leader, 2, true) == 0))
{
UO.Print("Cannot start following");
return null;
}
try
{
var attempts = 0;
while (Truth(attempts < 20) && Truth(UO.Exists(leader)))
{
await Delay(500);
attempts = attempts + 1;
}
}
finally
{
UO.Follow();
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ค ์กฐ๊ฑด์์๋ ์ค์ง: ๋์์ด 12 ์ ๋ณด๋ค ๋ฉ๊ฑฐ๋ HP๊ฐ 40% ๋๋ 30์ด๋ฅผ ๋์ง ์์์ต๋๋ค. ์ด๊ฒ์ AND์ด ์๋๋๋ค. StopWhen๋ ์ ์ฒด๊ฐ ์ ๊ณต๋๋ฉฐ, ํฌํจ์ ํฌํจ๋ ์ ์์ต๋๋ค. ํ๋๋ ๋์ฐฉ์ด ์๋๋ผ ์๋ฝ์ ์๋ฏธํฉ๋๋ค.
var leader = UO.GetSerial("lasttarget");
dynamic[] conditions = new dynamic[checked((int)(2) + 1)];
conditions[0] = StopWhen("distance", ">", 12);
conditions[1] = StopWhen("self.hppercent", "<=", 40);
conditions[2] = StopWhen("elapsed", ">=", 30000);
var accepted = UO.Follow(leader, 2, true, conditions);
if (Truth(accepted == 0))
{
UO.Print("Cannot follow this target");
}
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์์ด ์ฌ๋ผ์ง๊ฑฐ๋ ์ฌ๋งํ๊ฑฐ๋ ๋ ์ด์ ์๊ตฐ์ด ์๋๊ฑฐ๋, ์ง๊ตฌ๋ ฅ์ด 5 ์ด์ ๋จ์ง ์๊ฑฐ๋, Z ์ฐจ์ด๊ฐ 16๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ ์ค์งํฉ๋๋ค. false๋ ๊ฑท๋๋ค๋ ๋ป์ ๋๋ค. ToArray๋ ์กฐ๊ฑด ์ค ๋ชฉ๋ก์ ์ ๋ฌํฉ๋๋ค. ํฌ๊ธฐ๋ ๋ฏธ๋ฆฌ ์ง์ ๋์ง ์์ต๋๋ค. ๋์์ด ๋ ์ด์ ์๊ตฐ์ด ์๋ ๊ฒฝ์ฐ ์ด๋์ด ์์๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var checks = new List<object?>();
checks.Add(StopWhen("target.hidden", "=", true));
checks.Add(StopWhen("target.dead", "=", true));
checks.Add(StopWhen("target.notoriety", "<>", 2));
checks.Add(StopWhen("self.stam", "<=", 5));
checks.Add(StopWhen("height", ">", 16));
var leader = UO.GetSerial("lasttarget");
var conditions = checks.ToArray();
UO.Follow(leader, 2, false, conditions);
return null;
}
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ง๊ฑฐ๋ฆฌ 1, ์ ์ง์ํ <=3; 250ms๋ง๋ค ํ์ธํ๋ฉด ์ฑ๊ณผ๊ฐ ์ง์ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. 15000 ms ์๊ฐ ์ ํ์ ์ถ์ ์ ๋ฌด๊ธฐํ์ผ๋ก ํ์ฉํ์ง ์์ต๋๋ค. Follow๋ฅผ ๋ฐํํ๋ฉด ์ฌ์ ํ ์๋ฝ์ ์๋ฏธํ๋ฉฐ ์ธ ์นธ์ ๋๋ฌํ์ง ์์ต๋๋ค.
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[] conditions = new dynamic[checked((int)(1) + 1)];
conditions[0] = StopWhen("distance", "<=", 3);
conditions[1] = StopWhen("elapsed", ">=", 15000);
UO.Follow(UO.GetSerial("lasttarget"), 1, true, conditions);
return null;
}
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- while์ ๊ฐ ์ํ ์์์ ๋ํด ๋ณ๋์ ์กฐ๊ฑด์ ์์งํฉ๋๋ค. 5 OR 6 ์ํ์์ ์ค์งํ๊ณ HP <=40% OR 30000ms ํ์ ์์ ํฉ๋๋ค. ๋น ์ํ๋ ๋ฃจํ๋ฅผ ๊ฑด๋๋ฐ์ง๋ง ๋ค์ ๋ ์กฐ๊ฑด์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ์ต๋ Follow๊น์ง ์ ์ค์ ์ถ๊ฐํ์ธ์. ์ดํ์ List๋ฅผ ๋ณ๊ฒฝํด๋ ์ด๋ฏธ ์ค์น๋ ๋ณต์ฌ๋ณธ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋ฐฐ๊ฒฝ ์กฐ์ฌ๋ฅผ ์ํด ๋ฃจํ ๋ณธ๋ฌธ์ ๋ฐ๋ณตํ ํ์๊ฐ ์์ต๋๋ค.
var statuses = new List<object?>();
statuses.Add(5);
statuses.Add(6);
var checks = new List<object?>();
var index = 0;
while (index < statuses.Count)
{
checks.Add(StopWhen("target.notoriety", "=", statuses[index]));
index += 1;
}
checks.Add(StopWhen("self.hppercent", "<=", 40));
checks.Add(StopWhen("elapsed", ">=", 30000));
var accepted = UO.Follow(UO.GetSerial("lasttarget"), 2, true, checks.ToArray());
if (Truth(accepted == 0))
{
UO.Print("Select a loaded nearby character");
}
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- StopEscort(๋ฆฌ๋, startedAt)๋ bool ํธํ 1/0์ ๋ฐํํฉ๋๋ค. 12 ์ ์ ์ด๊ณผํ๋ ๋์ ๋๋ ์์ ์ HP <=30 ๋๋ 30์ด๊ฐ ์ง๋ฌ์ต๋๋ค. ์ถ๊ฐ || (๋ค๋ฅธ_์กฐ๊ฑด); ๋ ๊ฐ์ง ๊ฒ์ฌ๋ฅผ ํ์๋ก ์กฐํฉํ๋ ค๋ฉด (conditionA && ConditionB)๋ฅผ ์ฌ์ฉํ์ธ์. ์ ์ ์์ HP๋ 0๋ก ์ฝ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ ๊ฐ ์์์ ๊ฑฐ๋ถํฉ๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๋์ ๋๋ต 250 ms๋ง๋ค ํํ์์ ํ์ธํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ผ์ ์ค์งํ๋ฉด ์ด๋ฌํ ๊ฒ์ฌ๊ฐ ์ผ์ ์ค์ง๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ ์์ ์ธ ์ข ๋ฃ/์ค๋ฅ ์ ์ค์ง๋ฅผ ์ ๋ฌํฉ๋๋ค. ์์ ์ ์ทจ์๋ ํด๋ผ์ด์ธํธ์ ์ํด ์ถ๊ฐ๋ก ์ถ์ ๋ฉ๋๋ค. ๋์์ด ์ฌ๋ผ์ง๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ Follow ์ค์ง๋ ๊ฒฝ์ฐ ์ด ๋ฃจํ๋ ์๊ฐ ์ด๊ณผ ํ์ธ ์ด์ ์ ์์ฒด์ ์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค. ๋ฉ์๋๊ฐ ๋๋ ํ์ ์์ ํ๋ ค๋ฉด ์ด์ ์์ ์ ๊ฐ์ด ๋ค ๋ฒ์งธ ์ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var leader = UO.GetSerial("lasttarget");
var startedAt = Now();
if (Truth(leader == "0x00000000") || Truth(StopEscort(leader, startedAt)))
{
return null;
}
if (Truth(UO.Follow(leader, 2, true) == 0))
{
return null;
}
try
{
do
{
UO.Wait(250);
}
while (!StopEscort(leader, startedAt));
}
finally
{
UO.Follow(0);
}
return null;
}
dynamic StopEscort(dynamic leader, dynamic startedAt)
{
return (UO.GetDistance(leader) > 12) || (UO.GetHP("self") <= 30) || (Now() - startedAt >= 30000);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 5๊ฐ์ ์ธ์: X=1445, Y=1690, Z=0, ๊ณต์ฐจ X/Y=0, ์คํ. ๋ฐํ 1๋ ์ด๋ฏธ ๋์ฐฉ์ด ์๋ฃ๋ ๊ฒ์ด ์๋๋ผ ์๋ฝ์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ๋๋ฌํ๋ฉด ์์ ์ด ์์ ํ ๊บผ์ง๋๋ค. ์๋์ผ๋ก ์กฐ๊ธฐ ์ค์งํ๋ ค๋ฉด UO.Follow(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 accepted = UO.Follow(1445, 1690, 0, 0, true);
if (Truth(accepted == 0))
{
UO.Print("Coordinate task was not accepted");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- HP <=40%, ๋ง๋น ๋๋ 30์ด ํ์ ํด๋ผ์ด์ธํธ๋ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ค์งํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ ์ (1445,1690)์ ๋ X/Y ์ ๋ด์์ Z=0์์ ์ข ๋ฃ๋ฉ๋๋ค. ๊ธธ์ฐพ๊ธฐ ๋ฐ ์ด๋ ์ค์๋ ์ ๊ฒ์ด ๊ณ์๋ฉ๋๋ค. ์ด๋ ์์ ์ ์ผํ์ฑ ํ์ธ์ด ์๋๋๋ค. target.*์ ์ฌ๊ธฐ์ ์ ์ฉ๋์ง ์์ต๋๋ค.
var checks = new List<object?>();
checks.Add(StopWhen("self.hppercent", "<=", 40));
checks.Add(StopWhen("self.paralyzed", "=", true));
checks.Add(StopWhen("elapsed", ">=", 30000));
UO.Follow(1445, 1690, 0, 2, true, checks.ToArray());
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์์ distance=0๋ ์ ํํ ๋์ฐฉ์ ์ง์ ํ์ง๋ง, ์กฐ๊ฑด distance<=3๋ ๋ค์ ๊ฒ์ฌ์์ ๊ทธ๋ฌํ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ ๋ ์์ ์ ๋ ์ผ์ฐ ์ข ๋ฃํฉ๋๋ค. false๋ ๊ฑท๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค. Z>16 ๋๋ 20000 ms ์ฐจ์ด๋ ์์ ์ ์ค์งํฉ๋๋ค. ๋ฐฉํฅ์ ํตํ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์คํ์ ์ ๊ฒฝ๋ก ์ง์ ์ผ๋ก ๋ฐ๊พธ์ญ์์ค.
์ต์ ๊ฑธ์ ๊ฐ๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋ฉ - ๊ฑท๊ธฐ 200 ms, ๋ฌ๋ฆฌ๊ธฐ 100 ms.
์ด๋ ์ค๋์ ๋ํด ์๋์ผ๋ก ์ ์๋ ์ค์ ์ด ์๋ ํ์ค ํด๋ผ์ด์ธํธ ์ ํ์ ๋๋ค. ์๋ฒ ์๋์ ๋นํ ๋ชจ๋๋ ๋ณ๋๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ด๋จธ๋ ์ด๋ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ง๋ง ์ด๋ฌํ ์ ํ์ ์ค์ด์ง๋ ์์ต๋๋ค.
๋จ๊ณ, ๊ฒฝ๋ก, Follow, ๋ง์ฐ์ค/ํค ์ ์ด ๋ฐ ์ง๋๋ ์บ๋ฆญํฐ์ ๊ณต์ ๋๊ธฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๊ฑฐ๋ ์์น๋ฅผ ์กฐ์ ํด๋ ๊ฑธ์ ์์ฒญ ํ ๋จ์ ์ผ์์ ์ง๋ ์ทจ์๋์ง ์์ต๋๋ค. ์ง์ฐ ํ์๋ ์์ค๋ ํ๋ ์์ ๋ณด์ํ ๋น ๋ฅธ ๋ฒ์คํธ๊ฐ ์์ต๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฅ์ ๋ฌผ, ์์ฌ์ํต ๋ถ๋์ผ๋ก ์ธํด ์์ง์์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var checks = new List<object?>();
checks.Add(StopWhen("distance", "<=", 3));
checks.Add(StopWhen("height", ">", 16));
checks.Add(StopWhen("elapsed", ">=", 20000));
var x = UO.GetX("self") + 10;
var y = UO.GetY("self");
var z = UO.GetZ("self");
UO.Follow(x, y, z, 0, false, checks.ToArray());
return null;
}
dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
dynamic[] rule = new dynamic[checked((int)(2) + 1)];
rule[0] = field;
rule[1] = comparison;
rule[2] = threshold;
return rule;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(bridge is IApiFollowBridge follow
? follow.Follow(count == 0 ? 0 : GetObject(values[0]),
count < 2 ? 1 : NumberConversions.ToInt(values[1]),
count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)๋งค๊ฐ๋ณ์: target (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(bridge is IApiFollowBridge follow
? follow.Follow(count == 0 ? 0 : GetObject(values[0]),
count < 2 ? 1 : NumberConversions.ToInt(values[1]),
count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)๋งค๊ฐ๋ณ์: target (Any), distance (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(bridge is IApiFollowBridge follow
? follow.Follow(count == 0 ? 0 : GetObject(values[0]),
count < 2 ? 1 : NumberConversions.ToInt(values[1]),
count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)๋งค๊ฐ๋ณ์: target (Any), distance (Any), running (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(bridge is IApiFollowBridge follow
? follow.Follow(count == 0 ? 0 : GetObject(values[0]),
count < 2 ? 1 : NumberConversions.ToInt(values[1]),
count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)๋งค๊ฐ๋ณ์: target (Any), distance (Any), running (Any), stopConditions (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[3]). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[2]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
FollowStopCondition[] conditions = FollowStopCondition.Parse(values[3]);
return new InjectionValue(bridge is IApiConditionalFollowBridge follow
? follow.Follow(GetObject(values[0]), NumberConversions.ToInt(values[1]), ToBoolean(values[2]), conditions) : 0);
}๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), distance (Any), running (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[5], coordinateGoal: true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[4]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
FollowStopCondition[] conditions = count == 6
? FollowStopCondition.Parse(values[5], coordinateGoal: true) : Array.Empty<FollowStopCondition>();
return new InjectionValue(bridge is IApiCoordinateFollowBridge follow
? follow.FollowPoint(NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]),
NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), ToBoolean(values[4]), conditions) : 0);
}๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), distance (Any), running (Any), stopConditions (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[5], coordinateGoal: true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[4]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
FollowStopCondition[] conditions = count == 6
? FollowStopCondition.Parse(values[5], coordinateGoal: true) : Array.Empty<FollowStopCondition>();
return new InjectionValue(bridge is IApiCoordinateFollowBridge follow
? follow.FollowPoint(NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]),
NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), ToBoolean(values[4]), conditions) : 0);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetDir();
int UO.GetDir(object? id);ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ ๋ฐฉํฅ์ ์ฝ์ต๋๋ค.
-
idโ ์ง์ ๋ ๋จ์ผ ๋งค๊ฐ๋ณ์ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, "self", "lasttarget" ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ๋ ผ์์ด ์์ผ๋ฉด ์์ ์ ์ฑ๊ฒฉ์ด ์ฝํ์ง๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ UO.Exists๋ฅผ ํ์ธํ์ธ์. ์ ์ ์๋ ์ด๋ฆ์ ๋ฒ์๋ฅผ ์ด์ง ์์ต๋๋ค.
int โ ์คํ ๋นํธ๊ฐ ์๋ ๋ฐฉํฅ mobile: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ์ ์ ์๋ ๊ฒฝ์ฐ mobile๋ ๋ถ์ชฝ์ ์๋ฏธํ๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ๋ฌธ์์ ๋ฐฉํฅ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetDir();
if (Truth(value == 2))
{
UO.Print("Facing east");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จ์ผ ์ธ์๋ ๊ฐ์ฒด lasttarget๋ฅผ ์ ํํฉ๋๋ค. ํด๋น serial๋ ํด๋ผ์ด์ธํธ์ ์๋ ค์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ํฝ/type๋ ์ฌ๊ธฐ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- Exists๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์์ ์ ์์ต๋๋ค. ๊ฐ๋ฐฉ ์ ์์ดํ ์ ์ขํ๋ ์๋ ํฌ์ธํธ๊ฐ ์๋ ์ปจํ ์ด๋์ ์์น๋ฅผ โโ๊ตฌํฉ๋๋ค.
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.Exists("lasttarget")))
{
var targetValue = UO.GetDir("lasttarget");
UO.Print("Selected value: " + Convert.ToString(targetValue));
}
else
{
UO.Print("Target is not loaded");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
InjectionScript.Runtime.InjectionApiUO.GetDir:GetDir("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDir() => GetDir("self");๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDir(int id) => bridge.GetDir(id);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
InjectionScript.Runtime.InjectionApiUO.GetDir:GetDir(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDir(string id) => GetDir(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetDirection();
dynamic UO.GetDirection(object? objID);ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ ๋ฐฉํฅ์ ์ฝ์ต๋๋ค.
-
objIDโ ์ง์ ๋ ๋จ์ผ ๋งค๊ฐ๋ณ์ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, "self", "lasttarget" ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ๋ ผ์์ด ์์ผ๋ฉด ์์ ์ ์ฑ๊ฒฉ์ด ์ฝํ์ง๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ UO.Exists๋ฅผ ํ์ธํ์ธ์. ์ ์ ์๋ ์ด๋ฆ์ ๋ฒ์๋ฅผ ์ด์ง ์์ต๋๋ค.
int โ ์คํ ๋นํธ๊ฐ ์๋ ๋ฐฉํฅ mobile: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ์ ์ ์๋ ๊ฒฝ์ฐ mobile๋ ๋ถ์ชฝ์ ์๋ฏธํ๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ๋ฌธ์์ ๋ฐฉํฅ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetDirection();
if (Truth(value == 2))
{
UO.Print("Facing east");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จ์ผ ์ธ์๋ ๊ฐ์ฒด lasttarget๋ฅผ ์ ํํฉ๋๋ค. ํด๋น serial๋ ํด๋ผ์ด์ธํธ์ ์๋ ค์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ํฝ/type๋ ์ฌ๊ธฐ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- Exists๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์์ ์ ์์ต๋๋ค. ๊ฐ๋ฐฉ ์ ์์ดํ ์ ์ขํ๋ ์๋ ํฌ์ธํธ๊ฐ ์๋ ์ปจํ ์ด๋์ ์์น๋ฅผ โโ๊ตฌํฉ๋๋ค.
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.Exists("lasttarget")))
{
var targetValue = UO.GetDirection("lasttarget");
UO.Print("Selected value: " + Convert.ToString(targetValue));
}
else
{
UO.Print("Target is not loaded");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetDirection]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetDir(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getdirection": return new InjectionValue(bridge.GetDir(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetPathArray(object? xdst, object? ydst, object? optimized, object? accuracy);์ด๋์ ์ํํ์ง ์๊ณ ์บ๋ฆญํฐ์ ํ์ฌ ์์น์์ X/Y๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๋ฐํํฉ๋๋ค.
-
xdstโ ๋ชฉ์ ์ง์ ์ธ๊ณ ์ขํ X, 0..65535. ์ด๊ฒ์ serial๋ ์๋๊ณ ๊ฒํ ๋ด๋ถ์ ์์น๋ ์๋๋๋ค. -
ydstโ ๋ชฉ์ ์ง์ ์ธ๊ณ Y ์ขํ, 0..65535. -
optimized- true๋ ๋๊ฐ์ ์ ํ์ ํ์ฉํฉ๋๋ค. false ์ด ํธํ ๊ฐ๋ฅํ ํํ์์๋ 4๊ฐ์ ์ง์ ๋ฐฉํฅ์ด ๋จ์ต๋๋ค. ์ด๋ MoveXY์ Optimized ์๋ฏธ์ ๋ค๋ฆ ๋๋ค. -
accuracyโ ์ ์ X ๋ฐ Y์ ๋ํ ๊ณต์ฐจ: ๋ ํธ์ฐจ๊ฐ ๋ชจ๋ ๊ทธ ์์ ๋ง์์ผ ํฉ๋๋ค. ๊ฐ์ 0..20 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ X/Y๊ฐ ํ์ํฉ๋๋ค.
๋ ์ฝ๋ ๋ฐฐ์ด [x,y,z], ๊ฐ ํ๋๋ int์
๋๋ค. ์ธ๋ถ ๋ฐฐ์ด์ [0]์ด ์์์ ์
๋๋ค. ๋ง์ง๋ง ํญ๋ชฉ์ ์ง์ ๋ ๋ชฉํ ํ์ฉ์ค์ฐจ ๋ด์ ์์ต๋๋ค. ๋จ๊ณ ์๋ ๋น์ด ์์ง ์์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ง ArrayLength(๊ฒฝ๋ก)-1์
๋๋ค. ๋น ๋ฐฐ์ด []๋ ์ ํจํ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ป์ง ๋ชปํ์์ ์๋ฏธํฉ๋๋ค(๋๋ฌํ ์ ์๋ ๋์/์ง๋, ์ ํ ์ฌํญ ๋๋ ๊ฒ์ ์ ํ). ์์์ ์ด ์ด๋ฏธ ์ ํฉํ ๊ฒฝ์ฐ ํ๋์ ๋ ์ฝ๋๊ฐ ๋ฐํ๋๊ณ ๋จ๊ณ ์๋ 0์
๋๋ค. ๋ถ๋ถ ๊ฒฝ๋ก๋ ๋ฐํ๋์ง ์์ต๋๋ค.
- ํ์ ๊ฒฝ๋ก๋ง ๊ณ์ฐํฉ๋๋ค. ์์ง์ด๊ฑฐ๋ ๋ฌธ์ ์ด์ง ์์ต๋๋ค. ์คํํ๋ ค๋ฉด NewMoveXY/MoveXYZ๋ฅผ ์ฌ์ฉํ๊ณ ์์ฒด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์.
- ๊ฒ์์ ์ธ์ ํ ์ด๋์ ๋์ผํ ๋น์ฉ์ผ๋ก ๊ณ ๋ คํ์ฌ ์ฅ์ ๋ฌผ์ ํผํฉ๋๋ค. ์์ ๋งต์์๋ ๋จ๊ณ ์๊ฐ ๊ฐ์ฅ ์ ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค. ๊ณ ๊ฐ์ ๋๊ฐ์ ๋์ด์ ํ๊ณ๋ฅผ ํฌํจํ์ฌ ๊ฐ ๊ฐ๋น๋ผ์ ์ค์ ๊ฐ๋ฐฉ์ฑ์ ํ์ธํฉ๋๋ค.
- UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ๊ณ์ฐ์ ๋ ธ๋ ๊ฐ ์ฝ 1 ms์ ์์ฐ ํ์ธ์ ํตํด ์ต๋ 32 ๋ ธ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค. ์ทจ์๋ ์๋น ์ฌ์ด์ ํ์ธ๋ฉ๋๋ค. ์นด๋ ์ฝ๊ธฐ๋ ๊ฒ์ ์ค๋ ๋์ ๋จ์ ์์ต๋๋ค. ๊ณ ์ ๋ ๊ฐ๋ณ ๋์คํฌ ์ฝ๊ธฐ ์๊ฐ์ ์ฝ์ํ๋ ๊ฒ์ ์๋๋๋ค.
- ํ์ธ ํ ์ง๋๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด๊ณ , ๋ฌธ์ด ๋ซํ๊ณ , ์๋ฒ๊ฐ ์ํฉ์ ์์ ํฉ๋๋ค. ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์๋ฒ ํ์ธ์ด ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ปฌ ๋ฐ์ดํฐ์ ๋ํ ๊ณํ์ ๋๋ค.
- SetBadLocation๋ ์ ์ ์ ์ธํ๊ณ , SetBadObject๋ ๋ก๋๋ ์ ํฉํ ์๋ ๊ฐ์ฒด ์ฃผ๋ณ ์์ญ์ ์ ์ธํฉ๋๋ค. ์์ฒญ ์ ๋ฐํ์ ๋ชฉ๋ก์ ์ค๋ ์ท์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ค๋ฅธ ์ถ์์ ๊ธ์ง ์ฌํญ์ ์์๋์ง ์์ต๋๋ค. ์์ ์ ์ ๋๊ธฐ ์ํ์ธ์ง ํ์ธ๋์ง ์์ต๋๋ค. ํธ์ถ ์ฝ๋์ ์ํด ์ง์ ๋ฉ๋๋ค. ๋ฒฝ ๋ด๋ถ์ ์์์ Z๋ฅผ ์ ํจํ ์์ ์์น๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ์ฌ ์ง๋์ ์์ X/Y/Z๋ ์บ๋ฆญํฐ์์ ๊ฐ์ ธ์ค๋ฉฐ Z ํ์ฉ๊ฐ์ 255์ ๋๋ค. moveThroughNPC๋ ์ฒด๋ ฅ ๊ธฐ์ค์, moveOpenDoor๋ ๋ฌธ์ ํต๊ณผํ๋ ๊ฒฝ๋ก ๊ณํ์ ์ง์ ํฉ๋๋ค. GetPathArray๋ ๋ฌธ์ ์ด๊ฑฐ๋ ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), true, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Xdst - ๋์ชฝ์ผ๋ก 5๊ฐ ์ ; Ydst ์ด์ ; ์ต์ ํ=true; ์ ํ๋=0.
- ๊ฐ์์๋ ์์์ ์ด ํฌํจ๋ฉ๋๋ค. ๋นผ๊ธฐ 1๋ ๋น์ด ์์ง ์์ ๋ฐฐ์ด์ ํ์ธํ ํ์๋ง ์ํ๋ฉ๋๋ค.
var path = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), true, 0);
var count = ArrayLength(path);
if (Truth(count > 0))
{
UO.Print("Steps: " + Convert.ToString(count - 1));
}
else
{
UO.Print("Complete path is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๊ฒ 1445/1690; ์ต์ ํ=false๋ ๋๊ฐ์ ์ ์ ์ธํฉ๋๋ค. Accuracy=1๋ ๊ณต์ฐจ ์ฌ๊ฐํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ํ์ธํฉ๋๋ค.
- ํฌ์ธํธ[0]/[1]/[2] - X/Y/Z. graphic, serial ๋๋ ํ๋ฉดํ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var path = UO.GetPathArray(1445, 1690, false, 1);
var i = 0;
while (Truth(i < ArrayLength(path)))
{
var point = path[i];
UO.Print(Convert.ToString(point[0]) + "," + Convert.ToString(point[1]) + "," + Convert.ToString(point[2]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ํ์ ๊ฒฝ๋ก๋ง ๊ณ์ฐํฉ๋๋ค. ๋ ๋ฒ์งธ๋ ์์ง์์ ๋ค์ ํ์ธ/์คํํฉ๋๋ค. callback=0, timeout=5000.
- ๊ทธ๋ฅ ๊ฐ์ผ ํ๋ค๋ฉด ์๋น GetPathArray๋ ์ ํ์ฌํญ์ด๋ฉฐ ์์ ์ ์ถ๊ฐํฉ๋๋ค.
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 x = UO.GetX() + 3;
var y = UO.GetY();
var path = UO.GetPathArray(x, y, true, 0);
if (Truth(ArrayLength(path) > 0))
{
var ok = UO.NewMoveXY(x, y, true, 0, false, 0, 5000);
UO.Print("Movement result: " + Convert.ToString(ok));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: xdst (Any), ydst (Any), optimized (Any), accuracy (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. - ํ์ฌ ์ง๋์ ์์ X/Y/Z๋ ์บ๋ฆญํฐ์์ ๊ฐ์ ธ์ค๋ฉฐ Z ํ์ฉ๊ฐ์ 255์ ๋๋ค. moveThroughNPC๋ ์ฒด๋ ฅ ๊ธฐ์ค์, moveOpenDoor๋ ๋ฌธ์ ํต๊ณผํ๋ ๊ฒฝ๋ก ๊ณํ์ ์ง์ ํฉ๋๋ค. GetPathArray๋ ๋ฌธ์ ์ด๊ฑฐ๋ ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ์ง ์์ต๋๋ค.
-
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getpatharray":
return BuildPortablePath(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self),
Arg(0), Arg(1), bridge.GetZ(bridge.Self), bridge.WorldNumber, Arg(3), 255, Arg(2) != 0, false);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors, object? allowDiagonal);๋์ด ์ ์ด ๋ฐ ์ถ๊ฐ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๊ณ์ ๋ ์ง์ ์ฌ์ด์ ์ ์ฒด ๊ฒฝ๋ก ๋ฐฐ์ด์ ๊ณ์ฐํฉ๋๋ค.
-
startXโ ์ด๊ธฐ ์ธ๊ณ X, 0..65535. -
startYโ ์ด๊ธฐ ์ธ๊ณ Y, 0..65535. -
startZโ ์ด๊ธฐ ๋์ด -128..127. -
finishXโ ๋์ ์ธ๊ณ X, 0..65535. -
finishYโ ๋์ ์ธ๊ณ Y, 0..65535. -
finishZโ ํ๊ฒ ๋์ด -128..127. -
mapโ ํ์ฌ ๋ก๋๋ ์นด๋์ ๋ฒํธ(์: UO.WorldNum()). ๋ค๋ฅธ ๋งต์ ์ผ์นํ๋ X/Y/Z๋ฅผ ํฌํจํ๋ ๋น ๋ฐฐ์ด์ ์ ๊ณตํฉ๋๋ค. -
accuracyXYโ ์ ์ X ๋ฐ Y์ ๋ํ ๊ณต์ฐจ: ๋ ํธ์ฐจ๊ฐ ๋ชจ๋ ๊ทธ ์์ ๋ง์์ผ ํฉ๋๋ค. ๊ฐ์ 0..20 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ X/Y๊ฐ ํ์ํฉ๋๋ค. -
accuracyZโ ๋์ด ๊ณต์ฐจ: ์ ๋(์ค์ Z - ํ์ Z), 0..255๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ ๊ณ ๋๊ฐ ํ์ํฉ๋๋ค. 255๋ ์ฌ์ค์ Z ์ ํ์ ๋นํ์ฑํํฉ๋๋ค. -
run- ํธํ ๊ฐ๋ฅํ ์คํ ํ๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์์ฒญ์ ์๋ฌด๊ฒ๋ ์ด๋ํ์ง ์์ต๋๋ค. ์ด ํ์์์๋ ์ต์ ํ๊ฐ ํญ์ true์ด๋ฏ๋ก ์คํํด๋ ์ ์์๋ ๋จ๊ณ ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. - UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.
-
maxStepsโ ์์์ ์ ์ ์ธํ ๊ฒฝ๋ก ๊ฐ์ ์์ ์ ํ์ ์ํ์ ๋๋ค. maxSteps > 0์ ์ํ์ ์ค์ ํ๋ฉฐ 0, ์์ ๋๋ ์๋ต์ ๊ฑธ์ ์๋ฅผ ์ ํํ์ง ์์ต๋๋ค. UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ณ๋๋ก ๊ฒ์ฌํฉ๋๋ค. -
maxDistanceโ ๋์๊น์ง์ ์ด๊ธฐ ๊ฑฐ๋ฆฌ max(abs(dx),abs(dy))์ ๋ํ ์ ํ์ ์ ํ์ ๋๋ค. 0/absence๋ ์ด๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ์ด๋ ํ์ ์ค์ ํ์ฉ๋๋ ํธ์ฐจ๊ฐ ์๋๋ฉฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ๋ก์ ๊ธธ์ด๋ ์๋๋๋ค. -
avoidMobiles- true๋ ํธ์ถ ์์ ์ ์ค๋ ์ท์ ํตํด self๋ฅผ ์ ์ธํ X/Y ๋ก๋๋ ๋ฌธ์๋ฅผ ์ ์ธํฉ๋๋ค. ์ด ํํฐ์ ๋์ด๋ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ false์ ๋๋ค. ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํต๊ด ํ์ธ์ ๊ณ์ ์ ์ฉ๋ฉ๋๋ค. -
avoidStatics- true๋ ์ด๋ ๊ฐ๋ฅํ๊ฑฐ๋ ๋ค๋ฅธ ๋์ด์ ์๋ ์ ์ ํญ๋ชฉ์ด ์๋ ์ ์ ์ ์ธํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ false์ ๋๋ค. ์ด๊ฒ์ ํต๊ณผํ ์ ์๋ ๋ฒฝ์ ๊ธ์งํ๋ ๊ฒ์ด ์๋๋ผ ์๊ฒฉํ ํํฐ์ ๋๋ค. -
allowDoors- true๋ ๋ซํ ๋ฌธ์ด ์ ์์ ์ธ ๊ฒ์ฌ์ ์คํจํ๋๋ผ๋ ๋ฐ๊ฒฌ๋ ๋ฌธ ํ์ผ์ ํตํ ์์ ๊ฒฝ๋ก๋ฅผ ํ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ false์ ๋๋ค. ๋ฌธ์ด ์ด๋ฆฌ์ง ์์ต๋๋ค. ์คํ ์ค์ ์ ๊ทผ, Z, ํฌ์์จ์ ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค. -
allowDiagonal- true/absent๋ ๊ฐ๋ ํ์ธ์ ํตํด 8๊ฐ ๋ฐฉํฅ์ ํ์ฉํฉ๋๋ค. false - ์์ผ๋ก 4๋ฐฉํฅ๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋ ์ฝ๋ ๋ฐฐ์ด [x,y,z], ๊ฐ ํ๋๋ int์
๋๋ค. ์ธ๋ถ ๋ฐฐ์ด์ [0]์ด ์์์ ์
๋๋ค. ๋ง์ง๋ง ํญ๋ชฉ์ ์ง์ ๋ ๋ชฉํ ํ์ฉ์ค์ฐจ ๋ด์ ์์ต๋๋ค. ๋จ๊ณ ์๋ ๋น์ด ์์ง ์์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ง ArrayLength(๊ฒฝ๋ก)-1์
๋๋ค. ๋น ๋ฐฐ์ด []๋ ์ ํจํ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ป์ง ๋ชปํ์์ ์๋ฏธํฉ๋๋ค(๋๋ฌํ ์ ์๋ ๋์/์ง๋, ์ ํ ์ฌํญ ๋๋ ๊ฒ์ ์ ํ). ์์์ ์ด ์ด๋ฏธ ์ ํฉํ ๊ฒฝ์ฐ ํ๋์ ๋ ์ฝ๋๊ฐ ๋ฐํ๋๊ณ ๋จ๊ณ ์๋ 0์
๋๋ค. ๋ถ๋ถ ๊ฒฝ๋ก๋ ๋ฐํ๋์ง ์์ต๋๋ค.
- ํ์ ๊ฒฝ๋ก๋ง ๊ณ์ฐํฉ๋๋ค. ์์ง์ด๊ฑฐ๋ ๋ฌธ์ ์ด์ง ์์ต๋๋ค. ์คํํ๋ ค๋ฉด NewMoveXY/MoveXYZ๋ฅผ ์ฌ์ฉํ๊ณ ์์ฒด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์.
- ๊ฒ์์ ์ธ์ ํ ์ด๋์ ๋์ผํ ๋น์ฉ์ผ๋ก ๊ณ ๋ คํ์ฌ ์ฅ์ ๋ฌผ์ ํผํฉ๋๋ค. ์์ ๋งต์์๋ ๋จ๊ณ ์๊ฐ ๊ฐ์ฅ ์ ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค. ๊ณ ๊ฐ์ ๋๊ฐ์ ๋์ด์ ํ๊ณ๋ฅผ ํฌํจํ์ฌ ๊ฐ ๊ฐ๋น๋ผ์ ์ค์ ๊ฐ๋ฐฉ์ฑ์ ํ์ธํฉ๋๋ค.
- UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ๊ณ์ฐ์ ๋ ธ๋ ๊ฐ ์ฝ 1 ms์ ์์ฐ ํ์ธ์ ํตํด ์ต๋ 32 ๋ ธ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค. ์ทจ์๋ ์๋น ์ฌ์ด์ ํ์ธ๋ฉ๋๋ค. ์นด๋ ์ฝ๊ธฐ๋ ๊ฒ์ ์ค๋ ๋์ ๋จ์ ์์ต๋๋ค. ๊ณ ์ ๋ ๊ฐ๋ณ ๋์คํฌ ์ฝ๊ธฐ ์๊ฐ์ ์ฝ์ํ๋ ๊ฒ์ ์๋๋๋ค.
- ํ์ธ ํ ์ง๋๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด๊ณ , ๋ฌธ์ด ๋ซํ๊ณ , ์๋ฒ๊ฐ ์ํฉ์ ์์ ํฉ๋๋ค. ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์๋ฒ ํ์ธ์ด ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ปฌ ๋ฐ์ดํฐ์ ๋ํ ๊ณํ์ ๋๋ค.
- SetBadLocation๋ ์ ์ ์ ์ธํ๊ณ , SetBadObject๋ ๋ก๋๋ ์ ํฉํ ์๋ ๊ฐ์ฒด ์ฃผ๋ณ ์์ญ์ ์ ์ธํฉ๋๋ค. ์์ฒญ ์ ๋ฐํ์ ๋ชฉ๋ก์ ์ค๋ ์ท์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ค๋ฅธ ์ถ์์ ๊ธ์ง ์ฌํญ์ ์์๋์ง ์์ต๋๋ค. ์์ ์ ์ ๋๊ธฐ ์ํ์ธ์ง ํ์ธ๋์ง ์์ต๋๋ค. ํธ์ถ ์ฝ๋์ ์ํด ์ง์ ๋ฉ๋๋ค. ๋ฒฝ ๋ด๋ถ์ ์์์ Z๋ฅผ ์ ํจํ ์์ ์์น๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), UO.GetX() + 4, UO.GetY(), UO.GetZ(), UO.WorldNum(), 0, 0, false);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์ ์ธ ๊ฐ์ ์๋ณธ X/Y/Z์ ๋๋ค. ๋ค์ ์ธ ๊ฐ์ง๊ฐ ๋ชฉ์ ์ ๋๋ค.
- map=WorldNum(), accuracyXY=0, accuracyZ=0์๋ ์ ํํ ์์น๊ฐ ํ์ํฉ๋๋ค. run=false๋ ๊ฑท๊ธฐ๋ฅผ ์คํํ์ง ์์ต๋๋ค.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, false);
if (Truth(ArrayLength(path) > 0))
{
UO.Print("Steps: " + Convert.ToString(ArrayLength(path) - 1));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๊ฒ 1445/1690/20; accuracyXY=1, accuracyZ=2; run=true๋ ํธํ์ฑ ํ๋๊ทธ๋ก ์ ์ง๋ฉ๋๋ค.
- maxSteps=80, maxDistance=30; avoidMobiles=true, avoidStatics=false, allowDoors=true, allowDiagonal=false. ๋ฐฐ์ด์ด ๋น์ด ์์ ์ ์์ต๋๋ค.
- ๋ฌธ ์ ๋ฆฌ๋ ๊ณํ์์ ๊ฐ์ ์ ๋๋ค. ๊ฐ๋ฐฉ ๋ฐ ํต๊ณผ์ ๋ํ ๋ณด์ฅ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var path = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 20, UO.WorldNum(), 1, 2, true, 80, 30, true, false, true, false);
UO.Print("Points: " + Convert.ToString(ArrayLength(path)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- accuracyXY=2/accuracyZ=5 ๊ฐ์ฅ ๊ฐ๊น์ด ์ ํฉํ ์ง์ ์ ๊ฒฐ์ ํฉ๋๋ค. maxSteps=100.
- last๋ ์บ๋ฆญํฐ์ ํ์ฌ ์์น๊ฐ ์๋๋ผ ๊ณํ์ ๋ง์ง๋ง ํญ๋ชฉ์ ๋๋ค. ํ์ ๊ทธ๋ฅผ ์์ง์ด์ง ์๋๋ค.
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 = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 0, UO.WorldNum(), 2, 5, false, 100);
var count = ArrayLength(path);
if (Truth(count > 0))
{
var last = path[count - 1];
UO.Print("X=" + Convert.ToString(last[0]) + " Y=" + Convert.ToString(last[1]) + " Z=" + Convert.ToString(last[2]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics, allowDoors) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any), allowDoors (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics, allowDoors, allowDiagonal) โ UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any), allowDoors (Any), allowDiagonal (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetPathArray3D(values)ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetRun();
int UO.GetRun(object? id);๋ง์ง๋ง์ผ๋ก ์๋ ค์ง ๋ฐฉํฅ mobile์์ ์คํ ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
idโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. GetRun์๋ self์ ๋ํ GetRun() ํ์๋ ์์ต๋๋ค.
int 1 - ๋ก๋๋จ mobile์๋ Direction.Running ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetRun("self");
UO.Print("GetRun: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
var state = UO.GetRun("self");
var moving = UO.Moving();
UO.Print("Running flag: " + Convert.ToString(state));
UO.Print("Self movement active: " + Convert.ToString(moving));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ Direction.Running ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.GetRun(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
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(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.GetRun(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.GetRun(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetRun() => bridge.GetRun(bridge.Self);๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetRun(InjectionValue id) => bridge.GetRun(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetRunMountTimer();ํ ๋ง์ ๋ฌ๋ฆฌ๊ธฐ ๋จ๊ณ์ ๋ํด ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ํ์ํฉ๋๋ค. ์ผ์์ ์ผ๋ก ์๋๋ฅผ ๋ฆ์ถ๊ธฐ ์ ์ ๋ชจ๋ ํ์ธ, ํ์ด๋ฐ ์์ธก, ์ค์ ์ ์ฅ์ ์ ์ฉํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 100๋ถํฐ 2000๊น์ง - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 100์ ๋๋ค. ์ด๋ true/false๋ ์๋๊ณ ID๋ ์๋ ํ์์ด๋ฉฐ, ํต๊ณผํ ์ ์ ๊ฐ์๋ ์๋๋๋ค.
- ์ค์ ์ ๋ผ์ด๋ฉ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 100 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetRunMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.GetRunMountTimer()๋ ์ธ์ ์์ด ํธ์ถ๋ฉ๋๋ค. delayMs โ ๋ง์ ํ๊ณ ๋ฌ๋ฆฌ๋ ๊ฐ๊ฒฉ; ๋ค๋ฅธ ๋ชจ๋๋ ์ฌ๊ธฐ์ ์ธก์ ๋์ง ์์ต๋๋ค.
var delayMs = UO.GetRunMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- steps=5๋ ๋ช ๋ น ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ ํ๊ฐํ ๋จ๊ณ ์์ ๋๋ค. ๊ณฑ์ ์ โโ๊ตฌ์ฑ๋ ์ง์ฐ์ ๊ธฐ์ฌ๋ง ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋์ฐฉ ์๊ฐ์ด๋ ๊ฒฝ๋ก ์๊ฐ ์ด๊ณผ์ ๋ํ ์ฝ์์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var steps = 5;
var delayMs = UO.GetRunMountTimer();
var estimateMs = steps * delayMs;
UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ 100 ms์ ๋น๊ต๋ฉ๋๋ค. ํ์ค ๊ฐ๊ฒฉ์ด ์ค์ ๋๊ณ ๋๋จธ์ง ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์บ๋ฆญํฐ๋ ๋์ ์์ฒด์์ ์๋ฌด๋ฐ๋ ์์ง์ด์ง ์์ต๋๋ค.
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.GetRunMountTimer();
if (Truth(previous > 100))
{
UO.SetRunMountTimer(100);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getrunmounttimer": return new InjectionValue(state.RunMountTimer);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetRunUnMountTimer();๊ตฌ์ฑ๋ ํ ๊ฑธ์์ ๊ฐ๊ฒฉ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ํ์ํฉ๋๋ค. ์ผ์์ ์ผ๋ก ์๋๋ฅผ ๋ฆ์ถ๊ธฐ ์ ์ ๋ชจ๋ ํ์ธ, ํ์ด๋ฐ ์์ธก, ์ค์ ์ ์ฅ์ ์ ์ฉํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 200๋ถํฐ 2000๊น์ง - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 200์ ๋๋ค. ์ด๋ true/false๋ ์๋๊ณ ID๋ ์๋ ํ์์ด๋ฉฐ, ํต๊ณผํ ์ ์ ๊ฐ์๋ ์๋๋๋ค.
- ์ค์ ์ ๊ฑท๊ธฐ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 200 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetRunUnMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.GetRunUnmountTimer()๋ ์ธ์ ์์ด ํธ์ถ๋ฉ๋๋ค. delayMs - ๋๋ณด๋ก ๋ฌ๋ฆฌ๋ ๊ฐ๊ฒฉ; ๋ค๋ฅธ ๋ชจ๋๋ ์ฌ๊ธฐ์ ์ธก์ ๋์ง ์์ต๋๋ค.
var delayMs = UO.GetRunUnMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- steps=5๋ ๋ช ๋ น ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ ํ๊ฐํ ๋จ๊ณ ์์ ๋๋ค. ๊ณฑ์ ์ โโ๊ตฌ์ฑ๋ ์ง์ฐ์ ๊ธฐ์ฌ๋ง ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋์ฐฉ ์๊ฐ์ด๋ ๊ฒฝ๋ก ์๊ฐ ์ด๊ณผ์ ๋ํ ์ฝ์์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var steps = 5;
var delayMs = UO.GetRunUnMountTimer();
var estimateMs = steps * delayMs;
UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ 200 ms์ ๋น๊ต๋ฉ๋๋ค. ํ์ค ๊ฐ๊ฒฉ์ด ์ค์ ๋๊ณ ๋๋จธ์ง ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์บ๋ฆญํฐ๋ ๋์ ์์ฒด์์ ์๋ฌด๋ฐ๋ ์์ง์ด์ง ์์ต๋๋ค.
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.GetRunUnMountTimer();
if (Truth(previous > 200))
{
UO.SetRunUnmountTimer(200);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getrununmounttimer": return new InjectionValue(state.RunUnmountTimer);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetWalkMountTimer();๋ง์ ํ๊ณ ๊ฑท๋ ํ ๊ฑธ์์ ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ํ์ํฉ๋๋ค. ์ผ์์ ์ผ๋ก ์๋๋ฅผ ๋ฆ์ถ๊ธฐ ์ ์ ๋ชจ๋ ํ์ธ, ํ์ด๋ฐ ์์ธก, ์ค์ ์ ์ฅ์ ์ ์ฉํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 200๋ถํฐ 2000๊น์ง - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 200์ ๋๋ค. ์ด๋ true/false๋ ์๋๊ณ ID๋ ์๋ ํ์์ด๋ฉฐ, ํต๊ณผํ ์ ์ ๊ฐ์๋ ์๋๋๋ค.
- ์ค์ ์ ๋ผ์ด๋ฉ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 200 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetWalkMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.GetWalkMountTimer()๋ ์ธ์ ์์ด ํธ์ถ๋ฉ๋๋ค. delayMs โ ๋ง์ ํ๊ณ ๊ฑท๋ ๊ฐ๊ฒฉ; ๋ค๋ฅธ ๋ชจ๋๋ ์ฌ๊ธฐ์ ์ธก์ ๋์ง ์์ต๋๋ค.
var delayMs = UO.GetWalkMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- steps=5๋ ๋ช ๋ น ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ ํ๊ฐํ ๋จ๊ณ ์์ ๋๋ค. ๊ณฑ์ ์ โโ๊ตฌ์ฑ๋ ์ง์ฐ์ ๊ธฐ์ฌ๋ง ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋์ฐฉ ์๊ฐ์ด๋ ๊ฒฝ๋ก ์๊ฐ ์ด๊ณผ์ ๋ํ ์ฝ์์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var steps = 5;
var delayMs = UO.GetWalkMountTimer();
var estimateMs = steps * delayMs;
UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ 200 ms์ ๋น๊ต๋ฉ๋๋ค. ํ์ค ๊ฐ๊ฒฉ์ด ์ค์ ๋๊ณ ๋๋จธ์ง ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์บ๋ฆญํฐ๋ ๋์ ์์ฒด์์ ์๋ฌด๋ฐ๋ ์์ง์ด์ง ์์ต๋๋ค.
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.GetWalkMountTimer();
if (Truth(previous > 200))
{
UO.SetWalkMountTimer(200);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getwalkmounttimer": return new InjectionValue(state.WalkMountTimer);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetWalkUnmountTimer();๊ตฌ์ฑ๋ ํ ๊ฑธ์์ ๊ฐ๊ฒฉ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ํ์ํฉ๋๋ค. ์ผ์์ ์ผ๋ก ์๋๋ฅผ ๋ฆ์ถ๊ธฐ ์ ์ ๋ชจ๋ ํ์ธ, ํ์ด๋ฐ ์์ธก, ์ค์ ์ ์ฅ์ ์ ์ฉํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 400๋ถํฐ 2000๊น์ง - ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 400์ ๋๋ค. ์ด๋ true/false๋ ์๋๊ณ ID๋ ์๋ ํ์์ด๋ฉฐ, ํต๊ณผํ ์ ์ ๊ฐ์๋ ์๋๋๋ค.
- ์ค์ ์ ๊ฑท๊ธฐ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 400 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetWalkUnmountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.GetWalkUnmountTimer()๋ ์ธ์ ์์ด ํธ์ถ๋ฉ๋๋ค. delayMs โ ๊ฑท๊ธฐ ๊ฐ๊ฒฉ; ๋ค๋ฅธ ๋ชจ๋๋ ์ฌ๊ธฐ์ ์ธก์ ๋์ง ์์ต๋๋ค.
var delayMs = UO.GetWalkUnmountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- steps=5๋ ๋ช ๋ น ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ ํ๊ฐํ ๋จ๊ณ ์์ ๋๋ค. ๊ณฑ์ ์ โโ๊ตฌ์ฑ๋ ์ง์ฐ์ ๊ธฐ์ฌ๋ง ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋์ฐฉ ์๊ฐ์ด๋ ๊ฒฝ๋ก ์๊ฐ ์ด๊ณผ์ ๋ํ ์ฝ์์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var steps = 5;
var delayMs = UO.GetWalkUnmountTimer();
var estimateMs = steps * delayMs;
UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ 400 ms์ ๋น๊ต๋ฉ๋๋ค. ํ์ค ๊ฐ๊ฒฉ์ด ์ค์ ๋๊ณ ๋๋จธ์ง ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์บ๋ฆญํฐ๋ ๋์ ์์ฒด์์ ์๋ฌด๋ฐ๋ ์์ง์ด์ง ์์ต๋๋ค.
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.GetWalkUnmountTimer();
if (Truth(previous > 400))
{
UO.SetWalkUnmountTimer(400);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getwalkunmounttimer": return new InjectionValue(state.WalkUnmountTimer);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsMoving();์บ๋ฆญํฐ์ ์์ง์์ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int bool (1/0): 1 - ์๋ ํจ์คํ์ธ๋๊ฐ ํ์ฑํ๋์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ ๋๊ธฐ์ด์ ์์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค. 0 - ๋ ๋ค ์๊ฑฐ๋ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์ต๋๋ค. ์ด๋ ๋ชฉํ ๋ฌ์ฑ์ด๋ ๋จ๊ณ ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsMoving();
UO.Print("IsMoving: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. ํ์ฑ โ ์ซ์ 1 ๋๋ 0; ๋ฉ์์ง ํ ์คํธ๋ ๋ถ๊ธฐ ์ฒ๋ฆฌ์ ์์ ๋๋ค.
- 1 - ์๋ ํจ์คํ์ธ๋๊ฐ ํ์ฑํ๋์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ ๋๊ธฐ์ด์ ์์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค. 0 - ๋ ๋ค ์๊ฑฐ๋ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์์ต๋๋ค. ์ด๋ ๋ชฉํ ๋ฌ์ฑ์ด๋ ๋จ๊ณ ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
var active = UO.IsMoving();
if (Truth(active))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ช ๋ น์๋ ๊ฐ์ฒด ์ธ์๊ฐ ์์ต๋๋ค. Exists(self) ์ดํ์๋ ์์ฒด ์ํ๋ง ์ฝ์ต๋๋ค.
- Exists(self)๋ ์์ฒญ๋ ํ๋๊ทธ์ ๋ณ๋๋ก ํ๋ ์ด์ด์ ๋ก๋๋ฅผ ํ์ธํฉ๋๋ค. ์ธ์์ ์ํ ์ฌ์ด์ ๋ฐ๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("self")))
{
var state = UO.IsMoving();
UO.Print("State 1/0: " + Convert.ToString(state));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ์ self; UO.Wait(500) - 0.5์ด ๋์ ๋ฉ์ถฅ๋๋ค.
- ๋ ๊ฐ์ ํ๋๊ทธ ์ค๋ ์ท์ด ๋น๊ต๋ฉ๋๋ค. ์ท ๊ฐ์ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋ชจ๋ ์๋ฒ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ ๊ฒ์ ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.IsMoving();
await Delay(500);
var after = UO.IsMoving();
if (Truth(before != after))
{
UO.Print("State changed from " + Convert.ToString(before) + " to " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsMoving. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMoving:bridge.IsMoving().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsMoving() => bridge.IsMoving();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsRunning(object? objID);๋ง์ง๋ง์ผ๋ก ์๋ ค์ง ๋ฐฉํฅ mobile์์ ์คํ ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋จ mobile์๋ Direction.Running ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsRunning("self");
UO.Print("IsRunning: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ๋ง์ง๋ง ์คํ ํ๋๊ทธ๋ ์ค์ง ํ์๋ ์ ์ง๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก์ ํ๋์ด ์๋๋ฉฐ ์๋๋ ๋จ์ ๊ฑธ์ ์๊ฐ ์๋๋๋ค. self๋ฅผ ์ด๋ํ๋ ค๋ฉด Moving()๋ ์ฌ์ฉํ์ธ์.
var state = UO.IsRunning("self");
var moving = UO.Moving();
UO.Print("Running flag: " + Convert.ToString(state));
UO.Print("Self movement active: " + Convert.ToString(moving));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ Direction.Running ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsRunning(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
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(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsRunning(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsRunning(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isrunning": return new InjectionValue(bridge.GetRun(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LastStepQUsedDoor();
dynamic UO.LastStepQUsedDoor(object? value);๋ง์ง๋ง StepQ ๋ช ๋ น์ ๋์ด ์ด๊ธฐ ์๋ ํ๋๊ทธ๋ฅผ ์ฝ๊ฑฐ๋ ์๋์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
-
valueโ ์ ํ์ ์ ์. ์ ํํ ์ด ์ซ์๋ ์ธ์์ ํจ๊ป ์ ์ฅ๋ฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค.
int โ ์ ์ฅ๋ ํ์. ์ผ๋ฐ์ ์ธ StepQ๋ ์ด๋ฅผ 0๋ก ์ฌ์ค์ ํ๊ณ moveOpenDoor๊ฐ ํ์ฑํ๋๋ฉด TryOpenDoorForStep์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์๋๊ฐ ๊ฐ์ง๋๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋๋ค. ์๋ ์์์์๋ ๋ค๋ฅธ ๋ฒํธ๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๊ฒ์ serial ๋ฌธ์ด๋ ์ด๋ฆผ ํ์ธ์ด ์๋๋๋ค.
- ๊ฒ์ฌ๋ ์๋ฒ์์ ๋์ด ์ํ๋ฅผ ์ฝ์ง ์์ต๋๋ค. ๋์ฒด ํธ์ถ OpenDoor์ 0 ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- ์ ์/๋ด๊ตฌ๋ ฅ์ผ๋ก ์ธํด StepQ๊ฐ ์กฐ๊ธฐ์ ์คํจํ ๊ฒฝ์ฐ ์์ง ์ฌ์ค์ ์ด ์ด๋ฃจ์ด์ง์ง ์์ ์ด์ ๊ฐ์ด ๊ทธ๋๋ก ์ ์ง๋ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LastStepQUsedDoor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉด ์ ์ฅ๋ ์ซ์๋ฅผ ์ฝ์ต๋๋ค.
- UseObject์ ID์ฒ๋ผ ์ฌ์ฉํ์ง ๋ง์ธ์.
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value=0 ์ด์ ํ์๋ฅผ ์ง์๋๋ค. ๋ฐฉํฅ=2 โ E; ์คํ=false.
- StepQ ๊ฒฐ๊ณผ์ ๋์ด๋งํฌ๋ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.LastStepQUsedDoor(0);
var status = UO.StepQ(2, false);
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
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.LastStepQUsedDoor();
UO.LastStepQUsedDoor(0);
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
UO.LastStepQUsedDoor(previous);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "laststepquseddoor":
if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);
return new InjectionValue(state.LastStepUsedDoor);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "laststepquseddoor":
if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);
return new InjectionValue(state.LastStepUsedDoor);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Move();์์ง ์๋ฃ๋์ง ์์ ์๋ ๋ฃจํธ๋ ์บ๋ฆญํฐ ๋จ๊ณ๊ฐ ์๋์ง ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 โ ํจ์คํ์ธ๋๊ฐ ํ์ฑํ๋์ด ์๊ฑฐ๋ ๋จ๊ณ๊ฐ ์บ๋ฆญํฐ ์ ๋๋ฉ์ด์ ๋๊ธฐ์ด์ ๋จ์ ์์ต๋๋ค. 0 - ๋ ๋ค ์๊ฑฐ๋ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์์ต๋๋ค. ์ด๊ฒ์ ๊ฑธ์ ์๋ ์ด์ ๋ชฉํ ๋ฌ์ฑ์ ๊ฒฐ๊ณผ, ๋ง์ฐ์ค๋ฅผ ์ฅ๊ณ ์๋ค๋ ํ์๊ฐ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ง ์ฝ์ต๋๋ค. ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ฉด ํธํ ํ์ด๋จธ TicksAnim๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ง์ฐ์ค/ํค๋ก ์์ฒญํ ๋จ๊ณ๋ ๋๊ธฐ์ด์ ๋จ์ ์๋ ๋์ ๊ณ์ฐ๋ฉ๋๋ค.
- ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์งํ๋ ค๋ฉด MoverStop๋ฅผ ์ฌ์ฉํ์ธ์. MoveOff ๊ธฐํ ํค๋ณด๋ ๋จ๊ณ๋ฅผ ์ ์ดํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Move();
UO.Print("Move: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- 0๋ ๋ชฉํ ๋ฌ์ฑ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ๊ฒฝ๋ก๊ฐ ์ทจ์๋์์ ์ ์์ต๋๋ค.
UO.Print("Movement active or queued: " + Convert.ToString(UO.Move()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 100๋ 50ms ์ด์ ๋๊ธฐํ๋ฉฐ ๋๋ต์ ์ธ ํ๊ณ๋ 5์ด๋ก ์ค์ ๋ฉ๋๋ค.
- ์ด ํ์ธ์ ์ํํ๋ค๊ณ ํด์ ์์ฒด์ ์ผ๋ก ์์ง์์ด ์์๋๊ฑฐ๋ ์ค์ง๋๋ ๊ฒ์ ์๋๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var attempts = 0;
while (Truth(UO.Move()) && Truth(attempts < 100))
{
await Delay(50);
attempts = attempts + 1;
}
UO.Print("Still moving: " + Convert.ToString(UO.Move()));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Move()๋ ํ๋์ ํ์ธํ๊ณ , MoverStop()๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ์ด๋ฏธ ์ ์ก๋ ํจํท์ ์๋ฒ์์ ๊ณ์ ํ์ธํ ์ ์์ต๋๋ค.
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.Move()))
{
UO.MoverStop();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Move. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Move:bridge.Move(). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Move()
{
int result = bridge.Move();
if (result != 0)
ticksAnim = Timer();
return result;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.MoveOff();ํธํ๋๋ PMove ํค ๋จ๊ณ๋ฅผ ๋นํ์ฑํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false ๋๋ ๊ฑธ์ ์๊ฐ ์๋๋๋ค.
- ๋ฐํ์ ์ํ์์ MoveEnabled ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์ด๊ฒ์ ๋ฒ์ฉ ๋ฌธ์ ์ ๊ธ์ด ์๋๋๋ค: NewMoveXY, MoveXYZ, Step ๋ฐ ๋ง์ฐ์ค๋ ์ด ํ๋๊ทธ๋ก ์ ์ด๋์ง ์์ต๋๋ค.
- MoveOff๋ ์ด๋ฏธ ์คํ ์ค์ธ Pathfinder๋ฅผ ์ค์งํ์ง ์์ต๋๋ค. MoverStop์ด ํ์ํฉ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.MoveOff");
UO.MoveOff();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- PMove ํ๋๊ทธ๋ ๋ฐํ ๊ฐ ์์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
UO.MoveOff();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MoveOn๋ PMove ์ด์ ์ ์ฃผ์ ๋จ๊ณ๋ฅผ ํ์ฑํํฉ๋๋ค. MoveOff ์ ์ ์๋ฃ ํ ๊บผ์ง๋๋ค.
- ์ด๋ ์์ฐจ์ ๋ช ๋ น์ ๋๋ค. ๋นํ์ฑํ๋ ํ๋๊ทธ๋ ๋ชจ๋ ์ ์ฐจ์ ๋ํ ๋น์ ์ค์ง๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.MoveOn();
UO.PMove(UO.GetX() + 1, UO.GetY());
UO.MoveOff();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ํ์ ์๋ก ๋ค๋ฅธ ์ด๋ ๋ฉ์ปค๋์ฆ์ ์ ์ดํฉ๋๋ค.
- Move()๋ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฝ์ต๋๋ค. MoveEnabled ํ ์คํธ๋ผ๊ณ ์๊ฐํ์ง ๋ง์ธ์.
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.MoveOff();
UO.MoverStop();
UO.Print(Convert.ToString(UO.Move()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveOff. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnableMove:bridge.EnableMove(false).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void MoveOff() => bridge.EnableMove(false);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.MoveOn();ํธํ ๊ฐ๋ฅํ PMove ์ฃผ์ ๋จ๊ณ๋ฅผ ํ์ฑํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false ๋๋ ๊ฑธ์ ์๊ฐ ์๋๋๋ค.
- ๋ฐํ์ ์ํ์์ MoveEnabled ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์ด๊ฒ์ ๋ฒ์ฉ ๋ฌธ์ ์ ๊ธ์ด ์๋๋๋ค: NewMoveXY, MoveXYZ, Step ๋ฐ ๋ง์ฐ์ค๋ ์ด ํ๋๊ทธ๋ก ์ ์ด๋์ง ์์ต๋๋ค.
- MoveOff๋ ์ด๋ฏธ ์คํ ์ค์ธ Pathfinder๋ฅผ ์ค์งํ์ง ์์ต๋๋ค. MoverStop์ด ํ์ํฉ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.MoveOn");
UO.MoveOn();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- PMove ํ๋๊ทธ๋ ๋ฐํ ๊ฐ ์์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
UO.MoveOn();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MoveOn๋ PMove ์ด์ ์ ์ฃผ์ ๋จ๊ณ๋ฅผ ํ์ฑํํฉ๋๋ค. MoveOff ์ ์ ์๋ฃ ํ ๊บผ์ง๋๋ค.
- ์ด๋ ์์ฐจ์ ๋ช ๋ น์ ๋๋ค. ๋นํ์ฑํ๋ ํ๋๊ทธ๋ ๋ชจ๋ ์ ์ฐจ์ ๋ํ ๋น์ ์ค์ง๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.MoveOn();
UO.PMove(UO.GetX() + 1, UO.GetY());
UO.MoveOff();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MoveOn๋ ํธํ ๊ฐ๋ฅํ PMove ํค ๋จ๊ณ๋ฅผ ํ์ฑํํ๊ณ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒฐ๊ณผ๋ ์ขํ๋ก ํ์ธ๋ฉ๋๋ค. MoveOn๋ ๋ชจ๋ ์ด๋ ๋ชจ๋๋ฅผ ์ ์ดํ์ง ์์ต๋๋ค.
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.MoveOn();
int destinationX = UO.GetX() + 1;
int destinationY = UO.GetY();
UO.PMove(destinationX, destinationY);
UO.Print($"Reached requested tile: {UO.GetX() == destinationX && UO.GetY() == destinationY}");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveOn. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnableMove:bridge.EnableMove(true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void MoveOn() => bridge.EnableMove(true);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running);5๊ฐ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์บ๋ฆญํฐ๋ฅผ X/Y๋ก ์ด๋ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
-
xdstโ ๋ชฉ์ ์ง์ ์ธ๊ณ ์ขํ X, 0..65535. ์ด๊ฒ์ serial๋ ์๋๊ณ ๊ฒํ ๋ด๋ถ์ ์์น๋ ์๋๋๋ค. -
ydstโ ๋ชฉ์ ์ง์ ์ธ๊ณ Y ์ขํ, 0..65535. -
optimized- true - ์์ผ๋ก์ ๊ฒฝ๋ก๋ฅผ ๊ฒ์ํ๊ณ ํ์ธํ๋ ์ผ๋ฐ ๋ชจ๋์ ๋๋ค. false - ๊ฐ์๋ ๊ฒฝํ์ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๋จ๊ณ ํ์ธ. false๋ ์ฅ์ ๋ฌผ ํํผ๋ฅผ ๋นํ์ฑํํ์ง ์์ต๋๋ค. -
accuracyโ ์ ์ X ๋ฐ Y์ ๋ํ ๊ณต์ฐจ: ๋ ํธ์ฐจ๊ฐ ๋ชจ๋ ๊ทธ ์์ ๋ง์์ผ ํฉ๋๋ค. ๊ฐ์ 0..20 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ X/Y๊ฐ ํ์ํฉ๋๋ค. -
running- true/1 - ์คํ ์์ฒญ, false/0 - ๋จ๊ณ. ์๋ฒ ๋์ ์ง์ฐ์ด ์ง์๋ฉ๋๋ค. ์๋ ์น์๊ฐ ์๋๋๋ค.
int 1 - ํ์ธ์ด ๋๋๋ฉด ์บ๋ฆญํฐ๋ ์ฃผ์ด์ง ํ์ฉ ์ค์ฐจ X/Y/Z(์ฑ๋ฆฐ์ง ์ ์ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ ์์์ ๋ ํฌํจ) ๋ด์ ์์ต๋๋ค. int 0 - ์๋ชป๋ ์ขํ, ๋ฐ์ฌ ์คํจ, ๋๋ฌํ์ง ๋ชปํ ์ง์ ๋๋ ํธ๋ฆฌ๊ฑฐ๋ ์ ์ง ์กฐ๊ฑด. ๊ฑธ์ ์๋ serial๊ฐ ์๋๋๋ค. ๊ธด๊ธ์ทจ์์ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ๋ณต๊ทํ์ง ์๊ณ ์ ์ฐจ๋ฅผ ์ค๋จํฉ๋๋ค 0.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์์ ํ A* ๊ฒฝ๋ก๋ ํด๋ผ์ด์ธํธ ์ ๋ฐ์ดํธ ์ฌ์ด์ ์งง์ ๋ถ๋ถ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์ ์ ๊ตฌ์ถ๋ฉ๋๋ค. Optimized=true์ด๋ฉด ๊ฒฝ๋ก์ ๋ค์ 4 ์ ์ด ํ์ธ๋ฉ๋๋ค. false์ด ๊ฐ์ฅ ๊ฐ๊น์ด ๋จ๊ณ์ผ ๋. ์ด๋ ์ ์ฒด ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ฉฐ ๋ง์ฐ์ค๋ฅผ ์์ง์ผ ๋ ์ฐํ ์ฌ๋ผ์ด๋๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์๋ฒ ์ฅ์ DenyWalk ๋๋ ์๋ก์ด ์ฅ์ ๋ฌผ๋ก ์ธํด ๋จ๊ณ ๋๊ธฐ์ด์ ์๋ฃํ ํ ํ์ฌ ์์น์์ ์ฌ๊ณ์ฐ์ ์์ฒญํฉ๋๋ค. ๋ฐ๋ณต ํ์์ ์ฌ๊ณ์ฐ ๋น๋๋ ์ ํ๋์ด ์์ต๋๋ค. ์ด๋ค ๊ฒฝ๋ก๋ 0๋ก ์ด๋์ ๋๋ผ ์ ์์ต๋๋ค.
- ๊ฒฝ๋ก๋ ๊ฒฝ๋ก๋ฅผ ์์ํ ์ ์ฐจ์ ์ํฉ๋๋ค. ๋น์ ์ ์ง๋ ๋๋จธ์ง ์๋ ๊ฒฝ๋ก๋ฅผ ์ทจ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ฌ๋ฆฌ๊ธฐ๋ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ๊ฒฝ๋ก๋ฅผ ๊ต์ฒดํ ๊ฒฝ์ฐ ์ด์ ์์ ์๋ฅผ ์ทจ์ํด๋ ์ ๊ฒฝ๋ก์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ด๋ฏธ ์ ์ก๋ ๋จ๊ณ๋ ํ์๋์ง ์์ต๋๋ค.
- SetBadLocation ๋ฐ SetBadObject๋ ๊ฒฝ๋ก๊ฐ ์์๋ ๋ ํ์ฌ ๋ฐํ์ ๊ธ์ง ์ฌํญ์ ์ค๋ ์ท์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ด๋ถ ์ฌ๊ณ์ฐ ์ค์ ์ ์ฅ๋ฉ๋๋ค. ๋ชฉ๋ก์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ง์ฐ๋ฉด ์ด๋ฏธ ์งํ ์ค์ธ ๊ฒฝ๋ก๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ๊ฒฝ๋ก์ ์ํฅ์ ์ค๋๋ค.
- UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ์๊ฐ ์ด๊ณผ๋ ์์ฒญ์ด ์๋ฝ๋ ํ์ ๊ณ์ฐ๋๋ฉฐ ๊ฒ์ ๋ฐ ์ฌ๊ณ์ฐ์ ํ์ ๋ถ๋ถ์ ํฌํจํฉ๋๋ค. stopOnStuck๋ ์คํ ์ค์ธ ๊ฒ์์ ๋ฌธ์๊ฐ ๋ฉ์ถ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์ง ์์ต๋๋ค. ๊ณํ์ด ์๋ฃ๋ ํ์๋ ์์น ๋ณ๊ฒฝ์ด ๋ค์ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. ๋ง์ง๋ง 1/0๋ ๊ฒฝ๋ก์ ์ค๋น ์ํ๋ฟ๋ง ์๋๋ผ ์ค์ ์ขํ๋ฅผ ํ์ธํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ ์์น๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ํ์ ์๋ฒ ์์ ์ ์ฌ์ ํ โโ๊ฐ๋ฅํฉ๋๋ค. ๋ค์ํ ๋ฃจํด์์ ๊ฒฝ์์ ์ธ ์ด๋ ๋ช ๋ น์ ์คํํ๋ฉด ์บ๋ฆญํฐ์ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
- moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost ๋ฐ moveBetweenTwoCorners ์ค์ ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ช ์์ avoidMobiles/openDoors๋ ์ด ํธ์ถ์ ํด๋นํ๋ ๊ฐ์ ์ฌ์ ์ํฉ๋๋ค.
- ๊ฒฐ๊ณผ 0๋ ์ ํํ ์์ธ์ ๋ํ๋ด์ง ์์ต๋๋ค. ์ขํ, ์ฐ๊ฒฐ, ์ฒด๋ ฅ, ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์. UO.Wait ๋ฐ ์๋ ํ์ ์ ํ ์์ด ๋์์ด ๋์์ ๋ฐ๋ณตํ์ง ๋ง์ธ์.
- ํธ์ถ ์ ๋์ Z์ ์ทจํ๊ณ ํ์ฉ ์ค์ฐจ๋ Z=255์ ๋๋ค. ์ถ๊ฐ ์ ํ์ฌํญ์ ๋ณด๋ ค๋ฉด NewMoveXY๋ฅผ ์ฌ์ฉํ์ธ์. ๋์ด๋ฅผ ์ ํํ๋ ค๋ฉด - MoveXYZ.
- ๋ฉ์ธ ๋ธ๋ฆฌ์ง๋ ์์ฒญ ๋ฒํธ, ํ๋ ์ด์ด/ํจ์คํ์ธ๋/๋งต ์ธ์คํด์ค ๋ฐ ์ง๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์๋ก์ด ์์ฒญ, ์ํฉ ๋ณ๊ฒฝ ๋๋ ์ต์ข ๊ฑฐ๋ถ๋ 0; ์ขํ์ ๋ง์ง๋ง ์ฝ๋ฐฑ์ ์ฝ์ ํ ํ์ธ์ด ๋ฐ๋ณต๋ฉ๋๋ค. Timeout, maxSteps ๋ฐ callback=0๋ ์ ์ฅ๋ ์์ฒญ๋ง ์ค์งํ๋ฉฐ ์๋ก์ด ์ธ๋ถ ๊ฒฝ๋ก๋ ์ค์งํ์ง ์์ต๋๋ค. ์์ ์ฐจ๋จ๋จ์ ๋ณต๊ตฌ๊ฐ ํ์ฑํ๋์ด ์๋ ๋์ ์์ ๊ถ์ ์์ง ์๊ณ ๋๊ธฐ๊ฐ ๊ณ์๋ฉ๋๋ค. IApiMovementOwnershipBridge๊ฐ ์๋ ์ธ๋ถ ๋ ๊ฑฐ์ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด์ ํธํ ๋ฉ์ปค๋์ฆ์ด ์ ์ง๋ฉ๋๋ค.
- ์ผ๋ฐ Pathfinder๋ ํด๋น ํ์ฑ ์์ฒญ์ ๊ฑฐ๋ถ๋ ์ด๋์๋ง 2000 ms ๋์ ๋ฐฉํฅ ์ ํ X/Y/Z์ ๋ํ ์ต๋ 8 ์์ ๊ธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ , ์ ์ ์๋ ์ํ์ค, ์ฌ๋๊ธฐํ ๋ฐ ์ด์ /์ธ๋ถ ์์ฒญ์ ์ด๋ฌํ ๊ธ์ง๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์๋ก์ด ์ธ๋ถ ์์ฒญ ๋ฐ ์ง๋/ํ๋ ์ด์ด ์ปจํ ์คํธ ์์ค๋ก ์ธํด ํด๋น ์ปจํ ์คํธ๊ฐ ์ง์์ง๋๋ค. ๋ก๋๋ ํ์ ๊ฒ์์ ์ ํ์ ์ฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ฒ์ ๋ชจ๋ ์ฅ์ ๋ฌผ์ ์๋ ๊ฒ์ ์๋๋๋ค. ํ๋ ์ด์ด์ X/Y/Z๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ต์ 40 ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 8 ๋ด๋ถ ์ฌ๊ณ์ฐ์ด ํ์ฉ๋ฉ๋๋ค. ์์ ํ ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋ ์ด ์์ฐ์ด ์์ง๋์์ต๋๋ค. ๊ฒฝ๋ก๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ถ๋ ๋จ๊ณ๋ฅผ ์ฒ๋ฆฌํ ํ ์กฐ์ ์์ ์ด ์๋ฃ๋ฉ๋๋ค. mobile~Follow๋ ์ง์ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Xdst - ๋์ชฝ์ ๋ ๊ฐ์ ์ ; Ydst๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์ต์ ํ=true, ์ ํ๋=0, ์คํ=false. ํธ์ถ์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
var ok = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(Convert.ToString(ok));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Xdst/Ydst๋ ์ ํํ ๊ฐ์ฒด์์ ์ฝํ์ง๋๋ค. ๊ทธ๊ฒ์ ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ธ์์ ๊ฐ์ฒด์ฌ์ผ ํฉ๋๋ค.
- ์ ํ๋=1๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๊น์ด ๋ค๊ฐ๊ฐ ์ ์์ต๋๋ค. ์คํ์ค=true. Heights๋ ์ด ๋์ ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var ok = UO.MoveXY(UO.GetX("lasttarget"), UO.GetY("lasttarget"), true, 1, true);
UO.Print("Approach result: " + Convert.ToString(ok));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ 1445/1690์ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ญ์์ค. ์ง๊ตฌ๋ ฅ ์๊ณ๊ฐ์ ์ฌ์ฏ ๋ฒ์งธ MoveXY ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ณ๋์ ์ค์ ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
- ์ ์์ ์ธ ๋ณต๊ท ํ์๋ ์๋ ๊ฐ์ด ๋ณต์๋ฉ๋๋ค. ์ค๋จ์ด ๋ฐ์ํ๋ฉด ๋ ์ด์ ํ์ด ์คํ๋์ง ์์ต๋๋ค.
์ต์ ๊ฑธ์ ๊ฐ๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋ฉ - ๊ฑท๊ธฐ 200 ms, ๋ฌ๋ฆฌ๊ธฐ 100 ms.
์ด๋ ์ค๋์ ๋ํด ์๋์ผ๋ก ์ ์๋ ์ค์ ์ด ์๋ ํ์ค ํด๋ผ์ด์ธํธ ์ ํ์ ๋๋ค. ์๋ฒ ์๋์ ๋นํ ๋ชจ๋๋ ๋ณ๋๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ด๋จธ๋ ์ด๋ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ง๋ง ์ด๋ฌํ ์ ํ์ ์ค์ด์ง๋ ์์ต๋๋ค.
๋จ๊ณ, ๊ฒฝ๋ก, Follow, ๋ง์ฐ์ค/ํค ์ ์ด ๋ฐ ์ง๋๋ ์บ๋ฆญํฐ์ ๊ณต์ ๋๊ธฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๊ฑฐ๋ ์์น๋ฅผ ์กฐ์ ํด๋ ๊ฑธ์ ์์ฒญ ํ ๋จ์ ์ผ์์ ์ง๋ ์ทจ์๋์ง ์์ต๋๋ค. ์ง์ฐ ํ์๋ ์์ค๋ ํ๋ ์์ ๋ณด์ํ ๋น ๋ฅธ ๋ฒ์คํธ๊ฐ ์์ต๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฅ์ ๋ฌผ, ์์ฌ์ํต ๋ถ๋์ผ๋ก ์ธํด ์์ง์์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
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.moveCheckStamina();
UO.moveCheckStamina(15);
var ok = UO.MoveXY(1445, 1690, true, 0, false);
UO.moveCheckStamina(previous);
UO.Print(Convert.ToString(ok));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::MoveTo:MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movexy":
return new InjectionValue(MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles, object? openDoors);๋ณ๋์ ์ํ ๋ฐ ์์ง ํ์ฉ ์ค์ฐจ๊ฐ ์๋ ์ธ๊ณ์ ํ ์ง์ ์ผ๋ก ์บ๋ฆญํฐ๋ฅผ ์ด๋ํฉ๋๋ค.
-
xโ ํ์ int: ํ์ฌ ์ง๋์์ ๋ชฉ์ ์ง์ ์ธ๊ณ X ์ขํ 0..65535. ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
y- ํ์ int: ํ์ฌ ์ง๋์์ Y ๋ชฉ์ ์ง 0..65535์ ์ธ๊ณ ์ขํ์ ๋๋ค. -
z- ํ์ int: ๋ชฉํ ์ธ๊ณ ๊ณ ๋ -128..127. ์ด๋ ์ธต์๊ฐ ์๋ ํ๋ฉด ๋์ด์ ๋๋ค. -
accuracyXY- ํ์ int. ์ ์ X ๋ฐ Y์ ๋ํ ํ์ฉ์ค์ฐจ: ๋ ํธ์ฐจ๊ฐ ๋ชจ๋ ๊ทธ ์์ ๋ง์์ผ ํฉ๋๋ค. ๊ฐ์ 0..20 ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ X/Y๊ฐ ํ์ํฉ๋๋ค. -
accuracyZ- ํ์ int. ๋์ด ํ์ฉ ์ค์ฐจ: ์ ๋(์ค์ Z - ํ์ Z), 0..255๋ก ์ ํ๋ฉ๋๋ค. 0์๋ ์ ํํ ๊ณ ๋๊ฐ ํ์ํฉ๋๋ค. 255์ Z์ ์ ํ์ ์ค์ง์ ์ผ๋ก ๋นํ์ฑํํฉ๋๋ค. -
runningโ ํ์ ๋ถ์ธ ํ๋๊ทธ์ ๋๋ค. true/1 โ ์คํ ์์ฒญ, false/0 โ ๋จ๊ณ. ์๋ฒ ๋์ ์ง์ฐ์ด ์ง์๋ฉ๋๋ค. ์๋ ์น์๊ฐ ์๋๋๋ค. -
timeoutโ ์ ํ์ ๋๊ธฐ ์ ํ(๋ฐ๋ฆฌ์ด). ๋๋ฝ๋ ์ธ์ 0 ๋ฐ ์์ ๊ฐ์ ์ด ์ถ๊ฐ ์ ํ์ด ์์์ ๋ํ๋ ๋๋ค. ์นด์ดํธ๋ค์ด์ ๊ฒฝ๋ก ์คํ์ด ์น์ธ๋ ํ ์์๋ฉ๋๋ค. ์ด๋ ๊ฒฝ๋ก ์ค๋น์ ํจ๊ป ์ ์ฒด ํตํ ์๊ฐ์ ๋ํ ์๊ฒฉํ ์ ํ์ด ์๋๋๋ค. -
maxStepsโ ๋คํธ์ํฌ ํจํท์ด ์๋ ๊ด์ฐฐ๋ ์์น ๋ณ๊ฒฝ์ ์ ํ์ ์ ํ์ ๋๋ค. 0/negative/absent - ์ด ์ ํ์ ์์ต๋๋ค. ํด๋ง ์ฌ์ด์๋ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ์ด๋ ์ ํํ ์ ์นด์ดํฐ๊ฐ ์๋๋๋ค. -
avoidMobilesโ ์ ํ์ ํ๋๊ทธ: true๋ ๊ณ ๋ ค๋๋ ๋ฌธ์ ํต๊ณผ๋ฅผ ๊ธ์งํฉ๋๋ค. false๋ ์๋๋ฅผ ํ์ฉํฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด moveThroughNPC๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฒ๊ฐ ์ฌ์ ํ ์ก์ธ์ค๋ฅผ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค. -
openDoorsโ ๋์ค์ ๋ฌธ์ ์ฌ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ํ์ ํ๋๊ทธ์ ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด moveOpenDoor๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. true์์๋ ์ ๊ธด ๋ฌธ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
int 1 - ํ์ธ์ด ๋๋๋ฉด ์บ๋ฆญํฐ๋ ์ฃผ์ด์ง ํ์ฉ ์ค์ฐจ X/Y/Z(์ฑ๋ฆฐ์ง ์ ์ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ ์์์ ๋ ํฌํจ) ๋ด์ ์์ต๋๋ค. int 0 - ์๋ชป๋ ์ขํ, ๋ฐ์ฌ ์คํจ, ๋๋ฌํ์ง ๋ชปํ ์ง์ ๋๋ ํธ๋ฆฌ๊ฑฐ๋ ์ ์ง ์กฐ๊ฑด. ๊ฑธ์ ์๋ serial๊ฐ ์๋๋๋ค. ๊ธด๊ธ์ทจ์์ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ๋ณต๊ทํ์ง ์๊ณ ์ ์ฐจ๋ฅผ ์ค๋จํฉ๋๋ค 0.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์๋ ๋ฐฉ์, 1 ๋จ๊ณ: ์ขํ, ๊ตฌ์ฑ๋ ์ฐ๊ฒฐ ๋ฐ ๋ด๊ตฌ์ฑ ์กฐ๊ฑด์ ํ์ธํฉ๋๋ค. ์บ๋ฆญํฐ๊ฐ ์ด๋ฏธ accuracyXY ๋ฐ accuracyZ ๋ด์ ์์ผ๋ฉด ์๋ก์ด ๊ฒฝ๋ก ์์ด ์ฆ์ 1๋ฅผ ๋ฐํํฉ๋๋ค.
- 2 ๋จ๊ณ: ํ๋ฉด ๋์ด, ์ฅ์ ๋ฌผ ๋ฐ ์ ํํ ํต๊ณผ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ฌ ํ์ฌ ์ง๋์ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ต์ ํ ๋ชจ๋๋ ์ฌ๊ธฐ ๋ช ๋ น ๋ด์์ ํ์ฑํ๋ฉ๋๋ค. ์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ MoveXYZ์ ์ ๋ฌํ ํ์๋ ์์ต๋๋ค.
- 3 ๋จ๊ณ: ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๊ฑท๊ธฐ ๋๋ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ์์ํ๊ณ ํ์ฌ ์ ์ฐจ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ํธ์ถ์ด ์๋ฃ๋ ํ ์คํ๋๋ ๋ค์ ์ค์ ๋๋ค. ํด๋ผ์ด์ธํธ ์ธํฐํ์ด์ค๋ ๊ณ์ ์๋ํฉ๋๋ค.
- 4๋จ๊ณ: ๋จ๊ณ๊ฐ ์คํจํ๊ฑฐ๋ ์๋ก์ด ์ฅ์ ๋ฌผ์ด ๋ฐ์ํ๋ฉด ํด๋ผ์ด์ธํธ๋ ํ์ฌ ์์น์์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ๊ณ์ฐํ ์ ์์ต๋๋ค. ์๋๋ ์ ํ๋์ด ์์ต๋๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ชฉํ๋ฅผ ๋์ด ๊ด์ฐฐ ๊ฐ๋ฅํ ์์ง์์ ํ๊ณ์ ๋๋ฌํ๋ฉด 0๋ก ์์ง์์ด ์ค์ง๋ฉ๋๋ค.
- 5 ๋จ๊ณ: ์ด๋ ์ข ๋ฃ ํ ํด๋ผ์ด์ธํธ์ ์ค์ X/Y/Z๋ฅผ ๋ชฉํ์ ๋น๊ตํฉ๋๋ค. abs(X-x)<=accuracyXY, abs(Y-y)<=accuracyXY ๋ฐ abs(Z-z)<=accuracyZ๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณต์ฐจ 1 ๋ฐ 2 X=1278..1280๊ฐ ์๋ 1279/540/20 ๋ชฉ์ ์ ์ ํฉํฉ๋๋ค. Y=539..541, Z=18..22.
- ์ต์ ํ์์๋ 6๊ฐ์ ์ธ์(UO.MoveXYZ(1279,540,20,1,2,true))๊ฐ ํฌํจ๋ฉ๋๋ค. ์ถ๊ฐ ์ธ์๋ ์์ ์๊ฐ ์ด๊ณผ maxSteps, avoidMobiles, openDoors ์ค๋ฅธ์ชฝ์ ์ถ๊ฐ๋ฉ๋๋ค. openDoors๋ฅผ ์ง์ ํ๋ ค๋ฉด ์ด์ ์์น๋ ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค. ์ผํ ์ฌ์ด์ ๊ณต๋ฐฑ์ ์ง์๋์ง ์์ต๋๋ค.
- NewMoveXY์์ ์ฐจ์ด์ : MoveXYZ๋ ํ๊ฒ ๋์ด๋ฅผ ์ธ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค. NewMoveXY์๋ ์ต์ ํ๋ผ๋ ์ธ ๋ฒ์งธ ์ธ์๊ฐ ์์ต๋๋ค. ๊ทธ๊ณณ์์๋ ๊ณ ๋๋ฅผ ์ ์กํ ์ ์์ต๋๋ค. ์ด ๋ฐํ์์๋ MoveXYZ์ ๋ํ ์ฝ๋ฐฑ์ด ์์ต๋๋ค.
- ๊ฒฝ๋ก๋ ๊ฒฝ๋ก๋ฅผ ์์ํ ์ ์ฐจ์ ์ํฉ๋๋ค. ๋น์ ์ ์ง๋ ๋๋จธ์ง ์๋ ๊ฒฝ๋ก๋ฅผ ์ทจ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ฌ๋ฆฌ๊ธฐ๋ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ๊ฒฝ๋ก๋ฅผ ๊ต์ฒดํ ๊ฒฝ์ฐ ์ด์ ์์ ์๋ฅผ ์ทจ์ํด๋ ์ ๊ฒฝ๋ก์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ด๋ฏธ ์ ์ก๋ ๋จ๊ณ๋ ํ์๋์ง ์์ต๋๋ค.
- SetBadLocation ๋ฐ SetBadObject๋ ๊ฒฝ๋ก๊ฐ ์์๋ ๋ ํ์ฌ ๋ฐํ์ ๊ธ์ง ์ฌํญ์ ์ค๋ ์ท์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ด๋ถ ์ฌ๊ณ์ฐ ์ค์ ์ ์ฅ๋ฉ๋๋ค. ๋ชฉ๋ก์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ง์ฐ๋ฉด ์ด๋ฏธ ์งํ ์ค์ธ ๊ฒฝ๋ก๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ๊ฒฝ๋ก์ ์ํฅ์ ์ค๋๋ค.
- UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ์๊ฐ ์ด๊ณผ๋ ์์ฒญ์ด ์๋ฝ๋ ํ์ ๊ณ์ฐ๋๋ฉฐ ๊ฒ์ ๋ฐ ์ฌ๊ณ์ฐ์ ํ์ ๋ถ๋ถ์ ํฌํจํฉ๋๋ค. stopOnStuck๋ ์คํ ์ค์ธ ๊ฒ์์ ๋ฌธ์๊ฐ ๋ฉ์ถ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์ง ์์ต๋๋ค. ๊ณํ์ด ์๋ฃ๋ ํ์๋ ์์น ๋ณ๊ฒฝ์ด ๋ค์ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. ๋ง์ง๋ง 1/0๋ ๊ฒฝ๋ก์ ์ค๋น ์ํ๋ฟ๋ง ์๋๋ผ ์ค์ ์ขํ๋ฅผ ํ์ธํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ ์์น๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ํ์ ์๋ฒ ์์ ์ ์ฌ์ ํ โโ๊ฐ๋ฅํฉ๋๋ค. ๋ค์ํ ๋ฃจํด์์ ๊ฒฝ์์ ์ธ ์ด๋ ๋ช ๋ น์ ์คํํ๋ฉด ์บ๋ฆญํฐ์ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
- moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost ๋ฐ moveBetweenTwoCorners ์ค์ ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ช ์์ avoidMobiles/openDoors๋ ์ด ํธ์ถ์ ํด๋นํ๋ ๊ฐ์ ์ฌ์ ์ํฉ๋๋ค.
- ๊ฒฐ๊ณผ 0๋ ์ ํํ ์์ธ์ ๋ํ๋ด์ง ์์ต๋๋ค. ์ขํ, ์ฐ๊ฒฐ, ์ฒด๋ ฅ, ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์. UO.Wait ๋ฐ ์๋ ํ์ ์ ํ ์์ด ๋์์ด ๋์์ ๋ฐ๋ณตํ์ง ๋ง์ธ์.
- ๋ฉ์ธ ๋ธ๋ฆฌ์ง๋ ์์ฒญ ๋ฒํธ, ํ๋ ์ด์ด/ํจ์คํ์ธ๋/๋งต ์ธ์คํด์ค ๋ฐ ์ง๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์๋ก์ด ์์ฒญ, ์ํฉ ๋ณ๊ฒฝ ๋๋ ์ต์ข ๊ฑฐ๋ถ๋ 0; ์ขํ์ ๋ง์ง๋ง ์ฝ๋ฐฑ์ ์ฝ์ ํ ํ์ธ์ด ๋ฐ๋ณต๋ฉ๋๋ค. Timeout, maxSteps ๋ฐ callback=0๋ ์ ์ฅ๋ ์์ฒญ๋ง ์ค์งํ๋ฉฐ ์๋ก์ด ์ธ๋ถ ๊ฒฝ๋ก๋ ์ค์งํ์ง ์์ต๋๋ค. ์์ ์ฐจ๋จ๋จ์ ๋ณต๊ตฌ๊ฐ ํ์ฑํ๋์ด ์๋ ๋์ ์์ ๊ถ์ ์์ง ์๊ณ ๋๊ธฐ๊ฐ ๊ณ์๋ฉ๋๋ค. IApiMovementOwnershipBridge๊ฐ ์๋ ์ธ๋ถ ๋ ๊ฑฐ์ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด์ ํธํ ๋ฉ์ปค๋์ฆ์ด ์ ์ง๋ฉ๋๋ค.
- ์ผ๋ฐ Pathfinder๋ ํด๋น ํ์ฑ ์์ฒญ์ ๊ฑฐ๋ถ๋ ์ด๋์๋ง 2000 ms ๋์ ๋ฐฉํฅ ์ ํ X/Y/Z์ ๋ํ ์ต๋ 8 ์์ ๊ธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ , ์ ์ ์๋ ์ํ์ค, ์ฌ๋๊ธฐํ ๋ฐ ์ด์ /์ธ๋ถ ์์ฒญ์ ์ด๋ฌํ ๊ธ์ง๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์๋ก์ด ์ธ๋ถ ์์ฒญ ๋ฐ ์ง๋/ํ๋ ์ด์ด ์ปจํ ์คํธ ์์ค๋ก ์ธํด ํด๋น ์ปจํ ์คํธ๊ฐ ์ง์์ง๋๋ค. ๋ก๋๋ ํ์ ๊ฒ์์ ์ ํ์ ์ฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ฒ์ ๋ชจ๋ ์ฅ์ ๋ฌผ์ ์๋ ๊ฒ์ ์๋๋๋ค. ํ๋ ์ด์ด์ X/Y/Z๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ต์ 40 ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 8 ๋ด๋ถ ์ฌ๊ณ์ฐ์ด ํ์ฉ๋ฉ๋๋ค. ์์ ํ ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋ ์ด ์์ฐ์ด ์์ง๋์์ต๋๋ค. ๊ฒฝ๋ก๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ถ๋ ๋จ๊ณ๋ฅผ ์ฒ๋ฆฌํ ํ ์กฐ์ ์์ ์ด ์๋ฃ๋ฉ๋๋ค. mobile~Follow๋ ์ง์ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print("MoveXYZ: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- x/y/z๋ ๋ชฉํ ์ง์ ์ ๋๋ค. accuracyXY=0 ๋ฐ accuracyZ=0์๋ ์ ํํ ์์น๊ฐ ํ์ํฉ๋๋ค.
- running=false - ๊ฑท๊ธฐ. ์ธ์ ํ ํ๋ฉด์ ๋์ด๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ 0๊ฐ ๋ ์ ์์ต๋๋ค.
var ok = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print(Convert.ToString(ok));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค๋น์ฌํญ: ์บ๋ฆญํฐ๊ฐ ๊ฒ์์ ์์ด์ผ ํ๋ฉฐ, ํ์ฌ ์ง๋์ ํด๋น ์ง์ ์ด ์กด์ฌํด์ผ ํฉ๋๋ค. 1279/540/20๋ ํ๋ จ ์ขํ์ ๋๋ค. ํ๋ฉด์ ์ค์ ๋์ด๋ฅผ ํฌํจํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ง์ ์ผ๋ก ๋์ฒดํฉ๋๋ค.
-
- destinationX=1279๋ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ๋์์ X ์ธ๊ณ ์ขํ์ ๋๋ค.
-
- destinationY=540๋ ๋ ๋ฒ์งธ ์ธ์์ธ ๋์์ Y ์ธ๊ณ ์ขํ์ ๋๋ค.
-
- destinationZ=20 โ ์ธ ๋ฒ์งธ ์ธ์, ๋์ด. ํ์ ํต๋ก๋ ๊ณ๋จ์ ์ฐพ์์ผ ํฉ๋๋ค. 20 ๊ฐ ์์ฒด๋ ๋ฐ๋ฅ์ผ๋ก ์ ๋ฌ๋์ง ์์ต๋๋ค.
-
- accuracyXY=1๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์ํ ์ขํ๋ฅผ ๋ฐ๋ผ ํ๋์ ์ ๋ด์์ ์๋ฃํ ์ ์์ต๋๋ค. ๋๊ฐ์ ์ผ๋ก ์ธ์ ํ ์ ๋ ์ ํฉํฉ๋๋ค.
-
- accuracyZ=2๋ 18์์ 22๊น์ง์ ๋์ด๋ฅผ ํ์ฉํฉ๋๋ค. ๋ค๋ฅธ ์ธต์ X/Y ๋งค์น๋ง์ผ๋ก๋ ์ฑ๊ณตํ ์ ์์ต๋๋ค.
-
- running=true ์์ฒญ์ด ์คํ ์ค์ ๋๋ค. ๊ฑท๊ธฐ์ ๊ฒฝ์ฐ true๋ฅผ false๋ก ๋ฐ๊ฟ๋๋ค.
-
- timeout=8000๋ ๊ฒฝ๋ก๊ฐ ์์๋ ํ ๋๊ธฐ ์๊ฐ์ 8์ด๋ก ์ ํํฉ๋๋ค. ์ด ์๊ฐ ์ดํ์๋ ์ด๋์ด ๊ณ์ ์งํ๋๋ ๋์ ๋ช ๋ น์ ์ด๋์ ์ค์งํ๊ณ 0๋ฅผ ๋ฐํํฉ๋๋ค.
-
- maxSteps=100๋ ๊ด์ฐฐ๋ ์์น ๋ณ๊ฒฝ ํ์๋ฅผ ์ ํํฉ๋๋ค. ์ด๊ฒ์ ํต๊ณผํ ์ ํํ ์ฌ๊ฐํ ์๋ ์๋๋๋ค. ์ค๋ฌธ ์กฐ์ฌ ์ฌ์ด์ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
-
- avoidMobiles=true ๊ฒฝ๋ก ๊ณ์ฐ ์ ๊ณ ๋ ค๋ ๋ฌธ์๋ฅผ ํต๊ณผํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค.
-
- openDoors=true ์ ์ฌ์ฉํ๋ฉด ๋์ค์ ๋ฌธ์ ์ด ์ ์์ต๋๋ค. ์ด ํ๋๊ทธ๋ ์ ๊ธด ๋ฌธ์ด๋ ์๋ฒ ์ ํ์ โโ์ฐํํ์ง ์์ต๋๋ค.
- ๋๋ฌํ๋ฉด ํตํ๊ฐ ๋๋ ํ int 1 ๋๋ 0๋ฅผ ์์ ํฉ๋๋ค. ๋๋ฌํ๋ฉด == 1 ์ฑ๊ณต ๋ถ๊ธฐ๋ฅผ ์คํํฉ๋๋ค. else๋ ๋ช ๋ น์ ๋์์ด ๋ฐ๋ณตํ์ง ์๊ณ ๋ชฉํ ๋ฌ์ฑ ์คํจ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ง์ง๋ง ์ค์ ํ์ธ์ ์ํด ํ์ฌ X/Y/Z๋ฅผ ์ธ์ํฉ๋๋ค. ํ๋ก์์ ๊ฐ ์ค๋จ๋๋ฉด ์ด ์ถ๋ ฅ์ ํฌํจํ์ฌ ๋ ์ด์ ํ์ด ์คํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var destinationX = 1279;
var destinationY = 540;
var destinationZ = 20;
var accuracyXY = 1;
var accuracyZ = 2;
dynamic running = true;
var timeout = 8000;
var maxSteps = 100;
dynamic avoidMobiles = true;
dynamic openDoors = true;
var reached = UO.MoveXYZ(destinationX, destinationY, destinationZ, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors);
if (Truth(reached == 1))
{
UO.Print("Destination reached");
}
else
{
UO.Print("Destination not reached; check the path and limits");
}
UO.Print("Position: " + Convert.ToString(UO.GetX()) + "," + Convert.ToString(UO.GetY()) + "," + Convert.ToString(UO.GetZ()));
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- x/y/z=1445/1690/0; accuracyXY=1, accuracyZ=3; running=true.
- ์๊ฐ ์ด๊ณผ=5000, ๊ด์ฐฐ๋ ์์ง์์ maxSteps=60, avoidMobiles=true ๋ฐ openDoors=false.
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 ok = UO.MoveXYZ(1445, 1690, 0, 1, 3, true, 5000, 60, true, false);
UO.Print("Result: " + Convert.ToString(ok));
return null;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- #์ด ์๋ ์ค์ C# ์ฃผ์์ผ๋ก, ๋ณต์ฌํ๋ ๋์ ์ ์ฅ๋๋ฉฐ ์คํ๋์ง ์์ต๋๋ค. ์ด ์์๋ GoToPoint ํจ์์ ์คํ ๊ฐ๋ฅํ ํ๋ก์์ Main์ด๋ผ๋ ๋ ๊ฐ์ง ํ์ ๋ถ๋ถ์ด ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
- 6๊ฐ์ ๋งค๊ฐ๋ณ์ GoToPoint๋ ๋ชจ๋ ์์ ์์ด MoveXYZ๋ก ์ ๋ฌ๋ฉ๋๋ค. ํจ์ ๋ด์ 4๊ฐ์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๊ฐ ์ง์ ๋ฉ๋๋ค: 8000 ms, 100 ๊ด์ฐฐ๋ ์์น ๋ณ๊ฒฝ, ๋ฌธ์ ์ํ ๋ฐ ๋ฌธ ์ด๋ฆผ.
- ๋ชฉ์ ์ ๋ฐ๋ผ ๊ณต์ฐจ๊ฐ ์๋ 1279/540/20 1/2 X=1278..1280, Y=539..541, Z=18..22์ด ์ ํฉํฉ๋๋ค. 18..22๋ฅผ ๋์ด์๋ ๋ค๋ฅธ ๊ณ ๋์ ์๋ ์ง์ ์ ๋๋ฌํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค.
- ์ด๋ ์ค์ ๋ช ๋ น์ ๋๋ฌ์ผ ๋ํผ์ด๋ฉฐ ์คํฌ๋ฆฝํธ์์ ๊ฒฝ๋ก ์ฐพ๊ธฐ์ ๋ ๋ฒ์งธ ๊ตฌํ์ด ์๋๋๋ค. ์ถ๊ฐ GetPathArray๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ ๋์๋ ์ฌ์๋๋ฅผ ์ ๋ฐํ์ง ์์ต๋๋ค. ๋ฌ์ฑ๋์ง ์์ ๊ฒฝ์ฐ ํธ์ถ ํ๋ก์์ ๋ 0์ ์์ ํ๊ณ ์ถ๊ฐ ์์ ์ ์ ํํฉ๋๋ค.
์ต์ ๊ฑธ์ ๊ฐ๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋ฉ - ๊ฑท๊ธฐ 200 ms, ๋ฌ๋ฆฌ๊ธฐ 100 ms.
์ด๋ ์ค๋์ ๋ํด ์๋์ผ๋ก ์ ์๋ ์ค์ ์ด ์๋ ํ์ค ํด๋ผ์ด์ธํธ ์ ํ์ ๋๋ค. ์๋ฒ ์๋์ ๋นํ ๋ชจ๋๋ ๋ณ๋๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ด๋จธ๋ ์ด๋ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ง๋ง ์ด๋ฌํ ์ ํ์ ์ค์ด์ง๋ ์์ต๋๋ค.
๋จ๊ณ, ๊ฒฝ๋ก, Follow, ๋ง์ฐ์ค/ํค ์ ์ด ๋ฐ ์ง๋๋ ์บ๋ฆญํฐ์ ๊ณต์ ๋๊ธฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๊ฑฐ๋ ์์น๋ฅผ ์กฐ์ ํด๋ ๊ฑธ์ ์์ฒญ ํ ๋จ์ ์ผ์์ ์ง๋ ์ทจ์๋์ง ์์ต๋๋ค. ์ง์ฐ ํ์๋ ์์ค๋ ํ๋ ์์ ๋ณด์ํ ๋น ๋ฅธ ๋ฒ์คํธ๊ฐ ์์ต๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฅ์ ๋ฌผ, ์์ฌ์ํต ๋ถ๋์ผ๋ก ์ธํด ์์ง์์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
var reached = GoToPoint(1279, 540, 20, 1, 2, true);
if (Truth(Truth(reached) == true))
{
UO.Print("Destination reached");
}
else
{
UO.Print("Destination not reached");
}
dynamic GoToPoint(dynamic x, dynamic y, dynamic z, dynamic accuracyXY, dynamic accuracyZ, dynamic running)
{
var timeout = 8000;
var maxSteps = 100;
dynamic avoidMobiles = true;
dynamic openDoors = true;
var reached = UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors);
return reached;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveXYZ(values))
UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout) โ UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveXYZ(values))
UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps) โ UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveXYZ(values))
UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles) โ UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveXYZ(values))
UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors) โ UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any), openDoors (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveXYZ(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.MoverStop();Pathfinder์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์งํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false ๋๋ ๊ฑธ์ ์๊ฐ ์๋๋๋ค.
- ๋ก์ปฌ ์๋ ์ด๋์ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ฏธ ์ ์ก๋ ๋จ๊ณ์ ์๋ฒ ํ์ธ์ ํ์๋์ง ์์ต๋๋ค.
- ์ด๋ TerminateAll์ด ์๋๋๋ค. ๋๋จธ์ง ์คํฌ๋ฆฝํธ ์ค๊ณผ ๊ธฐํ ์ ์ฐจ์ ์คํ์ด ๊ณ์๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.MoverStop");
UO.MoverStop();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ฑ๊ณต ์ฝ๋๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
UO.MoverStop();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Move()๋ ์๋ ์ด๋์ ์ฝ์ต๋๋ค.
- Print โ ๋ก์ปฌ ์คํฌ๋ฆฝํธ ๋ฉ์์ง; ์๋ฒ ํ์ธ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Move()))
{
UO.MoverStop();
UO.Print("Route stopped");
}
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=100 ms๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ ์ง ํ ์ขํ๋ ๋ณ๋๋ก ์ฝํ์ง๋๋ค. ์ง์ฐ์ด ์๋ค๊ณ ํด์ ๋ชจ๋ ๋คํธ์ํฌ ์น์ธ ์์ ์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
UO.MoverStop();
await Delay(100);
UO.Print(Convert.ToString(UO.GetX()) + "," + Convert.ToString(UO.GetY()));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.StopMoving:bridge.StopMoving().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moverstop": bridge.StopMoving(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Moving();์บ๋ฆญํฐ์ ์์ง์์ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int bool (1/0): 1 - ์๋ ํจ์คํ์ธ๋๊ฐ ํ์ฑํ๋์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ ๋๊ธฐ์ด์ ์์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค. 0 - ๋ ๋ค ์๊ฑฐ๋ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์ต๋๋ค. ์ด๋ ๋ชฉํ ๋ฌ์ฑ์ด๋ ๋จ๊ณ ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Moving();
UO.Print("Moving: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. ํ์ฑ โ ์ซ์ 1 ๋๋ 0; ๋ฉ์์ง ํ ์คํธ๋ ๋ถ๊ธฐ ์ฒ๋ฆฌ์ ์์ ๋๋ค.
- 1 - ์๋ ํจ์คํ์ธ๋๊ฐ ํ์ฑํ๋์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ ๋๊ธฐ์ด์ ์์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค. 0 - ๋ ๋ค ์๊ฑฐ๋ ์บ๋ฆญํฐ๊ฐ ๋ก๋๋์ง ์์์ต๋๋ค. ์ด๋ ๋ชฉํ ๋ฌ์ฑ์ด๋ ๋จ๊ณ ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
var active = UO.Moving();
if (Truth(active))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ช ๋ น์๋ ๊ฐ์ฒด ์ธ์๊ฐ ์์ต๋๋ค. Exists(self) ์ดํ์๋ ์์ฒด ์ํ๋ง ์ฝ์ต๋๋ค.
- Exists(self)๋ ์์ฒญ๋ ํ๋๊ทธ์ ๋ณ๋๋ก ํ๋ ์ด์ด์ ๋ก๋๋ฅผ ํ์ธํฉ๋๋ค. ์ธ์์ ์ํ ์ฌ์ด์ ๋ฐ๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("self")))
{
var state = UO.Moving();
UO.Print("State 1/0: " + Convert.ToString(state));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ์ self; UO.Wait(500) - 0.5์ด ๋์ ๋ฉ์ถฅ๋๋ค.
- ๋ ๊ฐ์ ํ๋๊ทธ ์ค๋ ์ท์ด ๋น๊ต๋ฉ๋๋ค. ์ท ๊ฐ์ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋ชจ๋ ์๋ฒ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ ๊ฒ์ ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Moving();
await Delay(500);
var after = UO.Moving();
if (Truth(before != after))
{
UO.Print("State changed from " + Convert.ToString(before) + " to " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Moving]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMoving:bridge.IsMoving().
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.IsMoving()API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
UO.LimitMove โ ์ด๋ ๊ฑฐ๋ฆฌ ์ ํ. UO.LimitMove๋ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 2000์ด๊ณ 0์ ๋ฌด์ ํ์ ๋๋ค. ์จ๊ฒจ์ง 4096๊ฑธ์/๋ ธ๋ ๋ฐ 10000๋ ธ๋ ์ ํ์ ์์ต๋๋ค. ์์ ์ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ฉ๋๋ค. GetPathArray๋ moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค๊ณผ moveOpenDoor๋ฅผ ๋ฐ๋ฆ ๋๋ค.