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 ์•„์ดํ…œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Follow UO.Follow - ๋ฐฐ๊ฒฝ ์ถ”์ , ๊ฑฐ๋ฆฌ ๋ฐ ์ •์ง€.
Move UO.Move
MoveXY UO.MoveXY
MoveXYZ UO.MoveXYZ
NewMoveXY UO.NewMoveXY
Step UO.Step
StepQ UO.StepQ
PMove UO.PMove
Direction UO.Direction
CalcDir UO.CalcDir
AlwaysRun UO.AlwaysRun
๊ธธ ์ฐพ๊ธฐ UO.GetPathArray ยท UO.GetPathArray3D ยท UO.NewMoveXY
GetPathArray UO.GetPathArray
GetPathArray3D UO.GetPathArray3D
ClientPath UO.ClientPath - ๊ฒŒ์ž„ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ํด๋” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ•„ ๋ฐ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
Doors UO.OpenDoor ยท UO.LastStepQUsedDoor ยท UO.moveOpenDoor
Obstacles UO.IsWorldCellPassable ยท UO.SetBadLocation ยท UO.moveThroughNPC ยท UO.moveThroughCorner
์ด๋™ ์„ค์ • UO.moveCheckStamina ยท UO.moveExitOnDisconnect ยท UO.moveHeuristicMult ยท UO.moveTurnCost ยท UO.moveBetweenTwoCorners
Predicted X / Y / Z UO.PredictedX ยท UO.PredictedY ยท UO.PredictedZ
์šด๋™ ํƒ€์ด๋จธ UO.GetRunMountTimer ยท UO.GetRunUnMountTimer ยท UO.GetWalkMountTimer ยท UO.GetWalkUnmountTimer ยท UO.SetRunMountTimer ยท UO.SetRunUnmountTimer ยท UO.SetWalkMountTimer ยท UO.SetWalkUnmountTimer

๋ชจ๋“  ํ…Œ๋งˆ ๋ช…๋ น

์›€์ง์ž„

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

Direction

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

์˜ˆ์ธก๋จ X / Y / Z

UO.PredictedX ยท UO.PredictedY ยท UO.PredictedZ

์ด๋™ ํƒ€์ด๋จธ

UO.GetRunMountTimer ยท UO.GetRunUnMountTimer ยท UO.GetWalkMountTimer ยท UO.GetWalkUnmountTimer ยท UO.SetRunMountTimer ยท UO.SetRunUnmountTimer ยท UO.SetWalkMountTimer ยท UO.SetWalkUnmountTimer

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.NewMoveXY

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

UO.GetPathArray3D

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

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

1 ยท 2

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


UO.AddDir

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

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

void UO.AddDir(object? directions);

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

  • directions๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ชฉ๋ก์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ’์˜ ์˜๋ฏธ์™€ ํ˜•์‹์€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ˜ธํ™˜ ์Šคํฌ๋ฆฝํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์€ ์›€์ง์ž„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ’์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์˜ ๋ชฉ๋ก AddDir์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ๋ชจ์…˜ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ๋ชฉ๋ก์„ ์ฝ๊ธฐ ์œ„ํ•œ ๋ฌธ์„œํ™”๋œ ๊ณต๊ฐœ getter๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AddDir");
UO.AddDir("E");

1. ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๋ฐฉํ–ฅ์„ ๋ ˆ๊ฑฐ์‹œ ํ˜ธํ™˜ ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๋ฐฉํ–ฅ์„ ๋ ˆ๊ฑฐ์‹œ ํ˜ธํ™˜ ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.AddDir("E");

2. ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ ˆ๊ฑฐ์‹œ ๋ชฉ๋ก AddDir๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ ˆ๊ฑฐ์‹œ ๋ชฉ๋ก 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddDir(directions) โ€” UO.AddDir(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddStep

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

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

void UO.AddStep(object? directions);

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

  • directions๋Š” ๋Ÿฐํƒ€์ž„์ด ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ˜ธํ™˜์„ฑ ๋ชฉ๋ก AddStep์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ ์ž์ฒด๋Š” ํ•ด์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ํ˜ธ์ถœ์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋™์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์˜ ๋ชฉ๋ก AddStep์— ์ธ์ˆ˜์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ ˆ๊ฑฐ์‹œ ํ•ญ๋ชฉ์€ ๋ชจ์…˜ ๋ช…๋ น์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ ๊ตฌํ˜„์—๋Š” ๊ณต๊ฐœ getter๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddStep(directions) โ€” UO.AddStep(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AlwaysRun

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

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

int UO.AlwaysRun();
void UO.AlwaysRun(object? enabled);

ํ˜„์žฌ ClassicUO ํ”„๋กœํ•„์˜ ์ง€์†์ ์ธ ์‹คํ–‰ ์„ค์ •์„ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • enabled - 0 ์ง€์†์ ์ธ ์‹คํ–‰์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฐ’์ด๋ฉด ์ผœ์ง‘๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์€ ์„ค์ •์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ 1๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜ ํ˜•์‹์€ null๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ˜„์žฌ ํ”„๋กœํ•„์—์„œ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ค์ •์ด AlwaysRun ๋ณ€๊ฒฝ๋˜๊ณ  ํ˜„์žฌ ํ”„๋กœํ•„์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด getter๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  setter๋Š” ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ์— ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AlwaysRun() โ€” UO.AlwaysRun()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int AlwaysRun() => bridge.AlwaysRun();

UO.AlwaysRun(enabled) โ€” UO.AlwaysRun(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void AlwaysRun(int enabled) => bridge.AlwaysRun(enabled);

UO.CalcDir

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

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

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.

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

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

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

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

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

var result = UO.CalcDir(100, 100, 101, 100);
UO.Print("CalcDir: " + Convert.ToString(result));

1. ์ง์ ‘ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ถœ๋ฐœ์ง€(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);

2. ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ๋‘ ์ ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค(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;

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

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

  • (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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CalcDir(xfrom, yfrom, xto, yto) โ€” UO.CalcDir(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "calcdir": return new InjectionValue(CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)));

UO.CancelMove

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

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

void UO.CancelMove();

MoveOff๋ฅผ ํ†ตํ•œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ถ”๊ฐ€ ์ด๋™ ํ—ˆ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋Ÿฐํƒ€์ž„/๊ด€๋ฆฌ์ž๋ฅผ MoveEnabled=false ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” MoveOff๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ด๋™์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด MoveOn๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ด๋ฏธ ์ „์†ก๋œ ๋‹จ๊ณ„๋ฅผ ๋กค๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ด๋™ ๊ฑฐ๋ถ€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋‹ค์Œ ๋™์ž‘ ๋ช…๋ น์€ ๊บผ์ง€๋Š” ํ•ด์ƒ๋„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
UO.CancelMove();

2. ๋‹ค์‹œ ์ด๋™ ํ—ˆ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • MoveOn๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ƒ๋„๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelMove();
    UO.MoveOn();
    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.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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CancelMove() โ€” UO.CancelMove()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "cancelmove": MoveOff(); break;

UO.Dir

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

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

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ๋ฐฉํ–ฅ์€ ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.Dir();
UO.Print("Dir: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์˜ ๋ฐฉํ–ฅ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
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;

3. 1์ดˆ๋งŒ์— ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ ํ˜„์žฌ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dir() โ€” UO.Dir()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetDir(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.Direction

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

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

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ๋ฐฉํ–ฅ์€ ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.Direction();
UO.Print("Direction: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์˜ ๋ฐฉํ–ฅ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
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;

3. 1์ดˆ๋งŒ์— ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ ํ˜„์žฌ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Direction() โ€” UO.Direction()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetDir(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.FixWalk

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

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

void UO.FixWalk();

๋ ˆ๊ฑฐ์‹œ ๋„ค์ดํ‹ฐ๋ธŒ ํด๋ผ์ด์–ธํŠธ ํŒจ์น˜ FixWalk๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ ClassicUO์„ ์•Œ๋ฆฌ๋Š” ์•Œ๋ฆผ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias ๋ถ„๊ธฐ๋Š” SystemMessage๋งŒ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘, ์Œ์„ฑ, ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์€ ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜ธํ™˜์„ฑ ๊ณต์ง€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฉ”์‹œ์ง€๋Š” ์ด์ „ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
UO.FixWalk();

2. ํ˜ธ์ถœ ์ ˆ์ฐจ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜ธํ™˜์„ฑ ์ ˆ์ฐจ๋Š” ๊ฒŒ์ž„ ์„ธ๊ณ„๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    CompatibilityNotice();
    return null;
}

void CompatibilityNotice()
{
    UO.FixWalk();
}

3. ์Šคํฌ๋ฆฝํŠธ ์—ฐ์† - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ง„๋‹จ ๋ฉ”์‹œ์ง€ ํ›„์— ์‹คํ–‰์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.FixWalk();
        UO.Print("continued");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.FixWalk() โ€” UO.FixWalk()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "boxhack":

                case "fixtalk":

                case "fixwalk":

                    SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");

                    break;

UO.Follow

Follow๋Š” UO.LimitMove, moveCheckStamina, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost, moveExitOnDisconnect, moveBetweenTwoCorners์™€ SetBadLocation/SetBadObject ์Šค๋ƒ…์ƒท์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ ์ ‘๊ทผ ๊ฑฐ๋ฆฌ์—๋„ 0์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ UO.LimitMove ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.

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

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

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๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ค‘์ง€ํ•ด๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ƒˆ ๊ฒฝ๋กœ๊ฐ€ ์ทจ์†Œ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ ์ดํ›„ ์‹คํ–‰ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฆฌ๋” โ€” ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ 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;

2. ์„ธ ์นธ๋งŒํผ ๊ฑธ์–ด๊ฐ„ ํ›„ ์ •์ง€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ์ด๋™ ์‹œ๊ฐ„์„ ์ œํ•œํ•˜๊ณ  ๋„๋„๋ก ๋ณด์žฅ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ๊ฑฐ๋ฆฌ=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;
}

4. ๊ฑฐ๋ฆฌ, HP ๋˜๋Š” ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ค‘์ง€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์–ด๋–ค ์กฐ๊ฑด์—์„œ๋“  ์ค‘์ง€: ๋Œ€์ƒ์ด 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. ๋ฏธ๋ฆฌ ์ •์˜๋œ ํฌ๊ธฐ ์—†์ด ๋ชฉ๋ก์„ ํ†ตํ•ด ์กฐ๊ฑด ์ถ”๊ฐ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋Œ€์ƒ์ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์‚ฌ๋งํ•˜๊ฑฐ๋‚˜ ๋” ์ด์ƒ ์•„๊ตฐ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, ์ง€๊ตฌ๋ ฅ์ด 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;
}

6. ์ ‘๊ทผํ•  ๋•Œ๊นŒ์ง€ ๋”ฐ๋ผ๊ฐ”๋‹ค๊ฐ€ ๋ชจ๋“œ๋ฅผ ์™„์ „ํžˆ ๋„์„ธ์š” - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ์œ ์ง€๊ฑฐ๋ฆฌ 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;
    }
}

7. DO์—์„œ ์กฐ๊ฑด ์ˆ˜์ง‘ ... ์ฃผ๊ธฐ ๋: ์ƒํƒœ 5 ๋˜๋Š” 6์—์„œ ์ค‘์ง€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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;

8. ๋ฃจํ”„ UNTIL ๋์—์„œ ์ž์ฒด ํ‘œํ˜„์‹ ๋ฐ finally์—์„œ ํ•„์ˆ˜ ์ค‘์ง€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

9. ์ •ํ™•ํ•œ X, Y, Z๊นŒ์ง€ ์‹คํ–‰ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • 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;
}

10. HP, ๋งˆ๋น„ ๋˜๋Š” ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ •์ง€๋˜๋Š” ์ง€์ ์œผ๋กœ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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;
}

11. ๋ณธ๋ก ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ํ˜ธ์œ„ 3์…€ ์ „์— ๋๋‚ด๋Š” ๊ฑด ๋Œ€๋ณธ์˜ ๊ธฐ๋Šฅ

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

  • ํ˜ธ์ถœ์—์„œ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Follow() โ€” UO.Follow()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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)

UO.Follow(target) โ€” UO.Follow(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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)

UO.Follow(target, distance) โ€” UO.Follow(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: target (Any), distance (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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)

UO.Follow(target, distance, running) โ€” UO.Follow(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: target (Any), distance (Any), running (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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)

UO.Follow(target, distance, running, stopConditions) โ€” UO.Follow(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: target (Any), distance (Any), running (Any), stopConditions (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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);

                }

UO.Follow(x, y, z, distance, running) โ€” UO.Follow(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any), distance (Any), running (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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);

                    }

UO.Follow(x, y, z, distance, running, stopConditions) โ€” UO.Follow(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any), distance (Any), running (Any), stopConditions (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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);

                    }

UO.GetDir

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

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

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ๋ฐฉํ–ฅ์€ ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์˜ ๋ฐฉํ–ฅ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
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;

3. ์„ ํƒํ•œ ๊ฐ์ฒด์˜ ์†์„ฑ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‹จ์ผ ์ธ์ˆ˜๋Š” ๊ฐœ์ฒด 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetDir() โ€” UO.GetDir()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDir() => GetDir("self");

UO.GetDir(id) โ€” UO.GetDir(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDir(int id) => bridge.GetDir(id);

UO.GetDir(id) โ€” UO.GetDir(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDir(string id) => GetDir(GetObject(id));

UO.GetDirection

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

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

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ๋ฐฉํ–ฅ์€ ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์˜ ๋ฐฉํ–ฅ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
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;

3. ์„ ํƒํ•œ ๊ฐ์ฒด์˜ ์†์„ฑ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‹จ์ผ ์ธ์ˆ˜๋Š” ๊ฐœ์ฒด 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetDirection() โ€” UO.GetDirection()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetDir(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.GetDirection(objID) โ€” UO.GetDirection(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getdirection": return new InjectionValue(bridge.GetDir(Arg(0)));

UO.GetPathArray

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

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

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๋Š” ๋ฌธ์„ ์—ด๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ๋‹จ๊ณ„ ์ˆ˜ ์•Œ์•„๋ณด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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;

2. ๊ฒฝ๋กœ ์ขŒํ‘œ ์—ด๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํƒ€๊ฒŸ 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;

3. ๊ฐœ๋ณ„ ์ด๋™ ๋ช…๋ น ์ „ ๊ฒฝ๋กœ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ฒซ ๋ฒˆ์งธ ํŒ€์€ ๊ฒฝ๋กœ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์›€์ง์ž„์„ ๋‹ค์‹œ ํ™•์ธ/์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetPathArray(xdst, ydst, optimized, accuracy) โ€” UO.GetPathArray(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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);

UO.GetPathArray3D

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

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

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๋ฅผ ์œ ํšจํ•œ ์‹œ์ž‘ ์œ„์น˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ์ •ํ™•ํ•œ ๊ณต์ฐจ๋ฅผ ๊ฐ–๋Š” ๋™์ผํ•œ ๋†’์ด์˜ ๊ฒฝ๋กœ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜์Œ ์„ธ ๊ฐ’์€ ์›๋ณธ 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;

2. ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ํƒ€๊ฒŸ 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;

3. ๋งˆ์ง€๋ง‰ ๋„๋‹ฌ ์ง€์  ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetPathArray3D(values)

UO.GetRun

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

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

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()๋„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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));

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetRun() โ€” UO.GetRun()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetRun() => bridge.GetRun(bridge.Self);

UO.GetRun(id) โ€” UO.GetRun(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetRun(InjectionValue id) => bridge.GetRun(GetObject(id));

UO.GetRunMountTimer

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

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

dynamic UO.GetRunMountTimer();

ํ•œ ๋ง์˜ ๋‹ฌ๋ฆฌ๊ธฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ ๊ฐ„๊ฒฉ์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ธฐ ์ „์— ๋ชจ๋“œ ํ™•์ธ, ํƒ€์ด๋ฐ ์˜ˆ์ธก, ์„ค์ • ์ €์žฅ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 100๋ถ€ํ„ฐ 2000๊นŒ์ง€ - ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 100์ž…๋‹ˆ๋‹ค. ์ด๋Š” true/false๋„ ์•„๋‹ˆ๊ณ  ID๋„ ์•„๋‹Œ ํšŸ์ˆ˜์ด๋ฉฐ, ํ†ต๊ณผํ•œ ์…€์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋ผ์ด๋”ฉ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 100 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜„์žฌ ๊ฐ„๊ฒฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • UO.GetRunMountTimer()๋Š” ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. delayMs โ€” ๋ง์„ ํƒ€๊ณ  ๋‹ฌ๋ฆฌ๋Š” ๊ฐ„๊ฒฉ; ๋‹ค๋ฅธ ๋ชจ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ์ธก์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var delayMs = UO.GetRunMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2. ๋‹จ๊ฑฐ๋ฆฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ง€์—ฐ ๊ธฐ์—ฌ๋„ ์ถ”์ • - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

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

  • 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;
}

3. ์ด์ „์— ์ถ”๊ฐ€๋œ ์†๋„ ์ €ํ•˜ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetRunMountTimer() โ€” UO.GetRunMountTimer()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getrunmounttimer": return new InjectionValue(state.RunMountTimer);

UO.GetRunUnMountTimer

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

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

dynamic UO.GetRunUnMountTimer();

๊ตฌ์„ฑ๋œ ํ•œ ๊ฑธ์Œ์˜ ๊ฐ„๊ฒฉ์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ธฐ ์ „์— ๋ชจ๋“œ ํ™•์ธ, ํƒ€์ด๋ฐ ์˜ˆ์ธก, ์„ค์ • ์ €์žฅ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 200๋ถ€ํ„ฐ 2000๊นŒ์ง€ - ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค. ์ด๋Š” true/false๋„ ์•„๋‹ˆ๊ณ  ID๋„ ์•„๋‹Œ ํšŸ์ˆ˜์ด๋ฉฐ, ํ†ต๊ณผํ•œ ์…€์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๊ฑท๊ธฐ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 200 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜„์žฌ ๊ฐ„๊ฒฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • UO.GetRunUnmountTimer()๋Š” ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. delayMs - ๋„๋ณด๋กœ ๋‹ฌ๋ฆฌ๋Š” ๊ฐ„๊ฒฉ; ๋‹ค๋ฅธ ๋ชจ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ์ธก์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var delayMs = UO.GetRunUnMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2. ๋‹จ๊ฑฐ๋ฆฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ง€์—ฐ ๊ธฐ์—ฌ๋„ ์ถ”์ • - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

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

  • 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;
}

3. ์ด์ „์— ์ถ”๊ฐ€๋œ ์†๋„ ์ €ํ•˜ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetRunUnMountTimer() โ€” UO.GetRunUnMountTimer()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getrununmounttimer": return new InjectionValue(state.RunUnmountTimer);

UO.GetWalkMountTimer

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

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

dynamic UO.GetWalkMountTimer();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int 200๋ถ€ํ„ฐ 2000๊นŒ์ง€ - ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค. ์ด๋Š” true/false๋„ ์•„๋‹ˆ๊ณ  ID๋„ ์•„๋‹Œ ํšŸ์ˆ˜์ด๋ฉฐ, ํ†ต๊ณผํ•œ ์…€์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋ผ์ด๋”ฉ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 200 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜„์žฌ ๊ฐ„๊ฒฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • UO.GetWalkMountTimer()๋Š” ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. delayMs โ€” ๋ง์„ ํƒ€๊ณ  ๊ฑท๋Š” ๊ฐ„๊ฒฉ; ๋‹ค๋ฅธ ๋ชจ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ์ธก์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var delayMs = UO.GetWalkMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2. ๋‹จ๊ฑฐ๋ฆฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ง€์—ฐ ๊ธฐ์—ฌ๋„ ์ถ”์ • - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

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

  • 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;
}

3. ์ด์ „์— ์ถ”๊ฐ€๋œ ์†๋„ ์ €ํ•˜ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetWalkMountTimer() โ€” UO.GetWalkMountTimer()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getwalkmounttimer": return new InjectionValue(state.WalkMountTimer);

UO.GetWalkUnmountTimer

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

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

dynamic UO.GetWalkUnmountTimer();

๊ตฌ์„ฑ๋œ ํ•œ ๊ฑธ์Œ์˜ ๊ฐ„๊ฒฉ์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ธฐ ์ „์— ๋ชจ๋“œ ํ™•์ธ, ํƒ€์ด๋ฐ ์˜ˆ์ธก, ์„ค์ • ์ €์žฅ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 400๋ถ€ํ„ฐ 2000๊นŒ์ง€ - ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 400์ž…๋‹ˆ๋‹ค. ์ด๋Š” true/false๋„ ์•„๋‹ˆ๊ณ  ID๋„ ์•„๋‹Œ ํšŸ์ˆ˜์ด๋ฉฐ, ํ†ต๊ณผํ•œ ์…€์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๊ฑท๊ธฐ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 400 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜„์žฌ ๊ฐ„๊ฒฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • UO.GetWalkUnmountTimer()๋Š” ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. delayMs โ€” ๊ฑท๊ธฐ ๊ฐ„๊ฒฉ; ๋‹ค๋ฅธ ๋ชจ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ์ธก์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var delayMs = UO.GetWalkUnmountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2. ๋‹จ๊ฑฐ๋ฆฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ง€์—ฐ ๊ธฐ์—ฌ๋„ ์ถ”์ • - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

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

  • 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;
}

3. ์ด์ „์— ์ถ”๊ฐ€๋œ ์†๋„ ์ €ํ•˜ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetWalkUnmountTimer() โ€” UO.GetWalkUnmountTimer()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getwalkunmounttimer": return new InjectionValue(state.WalkUnmountTimer);

UO.IsMoving

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

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

int UO.IsMoving();

์บ๋ฆญํ„ฐ์˜ ์›€์ง์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int bool (1/0): 1 - ์ž๋™ ํŒจ์ŠคํŒŒ์ธ๋”๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ ๋Œ€๊ธฐ์—ด์— ์•„์ง ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ๋‘˜ ๋‹ค ์—†๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์ด๋‚˜ ๋‹จ๊ณ„ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ๋ฌธ์ž์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ๋ช…๋ น์—๋Š” ๊ฐœ์ฒด ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 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;

3. ๋ฌด๊ธฐํ•œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.IsMoving() โ€” UO.IsMoving()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int IsMoving() => bridge.IsMoving();

UO.IsRunning

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

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

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()๋„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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));

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.IsRunning(objID) โ€” UO.IsRunning(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isrunning": return new InjectionValue(bridge.GetRun(Arg(0, bridge.Self)));

UO.LastStepQUsedDoor

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

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

dynamic UO.LastStepQUsedDoor();
dynamic UO.LastStepQUsedDoor(object? value);

๋งˆ์ง€๋ง‰ StepQ ๋ช…๋ น์˜ ๋„์–ด ์—ด๊ธฐ ์‹œ๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์  ์ •์ˆ˜. ์ •ํ™•ํžˆ ์ด ์ˆซ์ž๋Š” ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ฝ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ €์žฅ๋œ ํ‘œ์‹œ. ์ผ๋ฐ˜์ ์ธ StepQ๋Š” ์ด๋ฅผ 0๋กœ ์žฌ์„ค์ •ํ•˜๊ณ  moveOpenDoor๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด TryOpenDoorForStep์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„๊ฐ€ ๊ฐ์ง€๋˜๋ฉด 1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์–‘์‹์—์„œ๋Š” ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ serial ๋ฌธ์ด๋‚˜ ์—ด๋ฆผ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์‚ฌ๋Š” ์„œ๋ฒ„์—์„œ ๋„์–ด ์ƒํƒœ๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ํ˜ธ์ถœ OpenDoor์€ 0 ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ ‘์†/๋‚ด๊ตฌ๋ ฅ์œผ๋กœ ์ธํ•ด StepQ๊ฐ€ ์กฐ๊ธฐ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์•„์ง ์žฌ์„ค์ •์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ ์ด์ „ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฝ๊ธฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ €์žฅ๋œ ์ˆซ์ž๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • UseObject์— ID์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));

2. ๋‹จ๊ณ„๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์žฌ์„ค์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;
}

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()
    {
        var previous = UO.LastStepQUsedDoor();
        UO.LastStepQUsedDoor(0);
        UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
        UO.LastStepQUsedDoor(previous);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastStepQUsedDoor() โ€” UO.LastStepQUsedDoor()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "laststepquseddoor":

                    if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);

                    return new InjectionValue(state.LastStepUsedDoor);

UO.LastStepQUsedDoor(value) โ€” UO.LastStepQUsedDoor(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "laststepquseddoor":

                    if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);

                    return new InjectionValue(state.LastStepUsedDoor);

UO.Move

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

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

int UO.Move();

์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ž๋™ ๋ฃจํŠธ๋‚˜ ์บ๋ฆญํ„ฐ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํŒจ์ŠคํŒŒ์ธ๋”๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋‹จ๊ณ„๊ฐ€ ์บ๋ฆญํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋Œ€๊ธฐ์—ด์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ๋‘˜ ๋‹ค ์—†๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑธ์Œ ์ˆ˜๋‚˜ ์ด์ „ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์˜ ๊ฒฐ๊ณผ, ๋งˆ์šฐ์Šค๋ฅผ ์ฅ๊ณ  ์žˆ๋‹ค๋Š” ํ‘œ์‹œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ํ˜ธํ™˜ ํƒ€์ด๋จธ TicksAnim๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค/ํ‚ค๋กœ ์š”์ฒญํ•œ ๋‹จ๊ณ„๋„ ๋Œ€๊ธฐ์—ด์— ๋‚จ์•„ ์žˆ๋Š” ๋™์•ˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ๊ฒฝ๋กœ๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด MoverStop๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. MoveOff ๊ธฐํƒ€ ํ‚ค๋ณด๋“œ ๋‹จ๊ณ„๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • 0๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
UO.Print("Movement active or queued: " + Convert.ToString(UO.Move()));

2. ์ œํ•œ์ ์œผ๋กœ ์ •์ง€ ๋Œ€๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ํ™œ์„ฑ ๊ฒฝ๋กœ ์ค‘์ง€ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Move() โ€” UO.Move()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Move()

        {

            int result = bridge.Move();

            if (result != 0)

                ticksAnim = Timer();

            return result;

        }

UO.MoveOff

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

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

void UO.MoveOff();

ํ˜ธํ™˜๋˜๋Š” PMove ํ‚ค ๋‹จ๊ณ„๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false ๋˜๋Š” ๊ฑธ์Œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ MoveEnabled ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ”์šฉ ๋ฌธ์ž ์ž ๊ธˆ์ด ์•„๋‹™๋‹ˆ๋‹ค: NewMoveXY, MoveXYZ, Step ๋ฐ ๋งˆ์šฐ์Šค๋Š” ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์ œ์–ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • MoveOff๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ Pathfinder๋ฅผ ์ค‘์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MoverStop์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฃผ์š” ๋‹จ๊ณ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • PMove ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’ ์—†์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
UO.MoveOff();

2. ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค์Œ PMove ํ—ˆ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • MoveOn๋Š” PMove ์ด์ „์˜ ์ฃผ์š” ๋‹จ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. MoveOff ์ •์ƒ ์™„๋ฃŒ ํ›„ ๊บผ์ง‘๋‹ˆ๋‹ค.
  • ์ด๋Š” ์ˆœ์ฐจ์  ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”๋œ ํ”Œ๋ž˜๊ทธ๋Š” ๋ชจ๋“  ์ ˆ์ฐจ์— ๋Œ€ํ•œ ๋น„์ƒ ์ค‘์ง€๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3. ๋‹จ๊ณ„๋ฅผ ๋„๊ณ  ์ž๋™ ๊ฒฝ๋กœ๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‘ ํŒ€์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MoveOff() โ€” UO.MoveOff()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void MoveOff() => bridge.EnableMove(false);

UO.MoveOn

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

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

void UO.MoveOn();

ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ PMove ์ฃผ์š” ๋‹จ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false ๋˜๋Š” ๊ฑธ์Œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ MoveEnabled ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ”์šฉ ๋ฌธ์ž ์ž ๊ธˆ์ด ์•„๋‹™๋‹ˆ๋‹ค: NewMoveXY, MoveXYZ, Step ๋ฐ ๋งˆ์šฐ์Šค๋Š” ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์ œ์–ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • MoveOff๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ Pathfinder๋ฅผ ์ค‘์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MoverStop์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฃผ์š” ๋‹จ๊ณ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • PMove ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’ ์—†์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
UO.MoveOn();

2. ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค์Œ PMove ํ—ˆ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • MoveOn๋Š” PMove ์ด์ „์˜ ์ฃผ์š” ๋‹จ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. MoveOff ์ •์ƒ ์™„๋ฃŒ ํ›„ ๊บผ์ง‘๋‹ˆ๋‹ค.
  • ์ด๋Š” ์ˆœ์ฐจ์  ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”๋œ ํ”Œ๋ž˜๊ทธ๋Š” ๋ชจ๋“  ์ ˆ์ฐจ์— ๋Œ€ํ•œ ๋น„์ƒ ์ค‘์ง€๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3. PMove ์ด์ „์˜ ํ‚ค ์ด๋™ ๋ณต์› - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MoveOn() โ€” UO.MoveOn()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void MoveOn() => bridge.EnableMove(true);

UO.MoveXY

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

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

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๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ๋„๋ณด์˜ ์ •ํ™•ํ•œ ์ง€์  - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • Xdst - ๋™์ชฝ์— ๋‘ ๊ฐœ์˜ ์…€; Ydst๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ ํ™”=true, ์ •ํ™•๋„=0, ์‹คํ–‰=false. ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var ok = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(Convert.ToString(ok));

2. ์ ‘๊ทผ ๊ฐ์ฒด - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ์ž„์‹œ๋กœ ์ตœ์†Œ ์ง€๊ตฌ๋ ฅ ์„ค์ • - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • ๋Œ€์ƒ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MoveXY(xdst, ydst, optimized, accuracy, running) โ€” UO.MoveXY(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movexy":

                    return new InjectionValue(MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0));

UO.MoveXYZ

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

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

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๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ๊ฐ™์€ ๋†’์ด์˜ ์ด์›ƒ ์…€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 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));

2. ํ•„์š”ํ•œ ๋†’์ด์˜ ์ง€์ ์— ์ ‘๊ทผํ•˜๊ณ  ๊ฒฐ๊ณผ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ค€๋น„์‚ฌํ•ญ: ์บ๋ฆญํ„ฐ๊ฐ€ ๊ฒŒ์ž„์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํ˜„์žฌ ์ง€๋„์— ํ•ด๋‹น ์ง€์ ์ด ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1279/540/20๋Š” ํ›ˆ๋ จ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ํ‘œ๋ฉด์˜ ์‹ค์ œ ๋†’์ด๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์ ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
    1. destinationX=1279๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ๋Œ€์ƒ์˜ X ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
    1. destinationY=540๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ๋Œ€์ƒ์˜ Y ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
    1. destinationZ=20 โ€” ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜, ๋†’์ด. ํŒ€์€ ํ†ต๋กœ๋‚˜ ๊ณ„๋‹จ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. 20 ๊ฐ’ ์ž์ฒด๋Š” ๋ฐ”๋‹ฅ์œผ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    1. accuracyXY=1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์ˆ˜ํ‰ ์ขŒํ‘œ๋ฅผ ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ์…€ ๋‚ด์—์„œ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ฐ์„ ์œผ๋กœ ์ธ์ ‘ํ•œ ์…€๋„ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    1. accuracyZ=2๋Š” 18์—์„œ 22๊นŒ์ง€์˜ ๋†’์ด๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธต์˜ X/Y ๋งค์น˜๋งŒ์œผ๋กœ๋Š” ์„ฑ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    1. running=true ์š”์ฒญ์ด ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฑท๊ธฐ์˜ ๊ฒฝ์šฐ true๋ฅผ false๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    1. timeout=8000๋Š” ๊ฒฝ๋กœ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ 8์ดˆ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„ ์ดํ›„์—๋„ ์ด๋™์ด ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋ช…๋ น์€ ์ด๋™์„ ์ค‘์ง€ํ•˜๊ณ  0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    1. maxSteps=100๋Š” ๊ด€์ฐฐ๋œ ์œ„์น˜ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ†ต๊ณผํ•œ ์ •ํ™•ํ•œ ์‚ฌ๊ฐํ˜• ์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์„ค๋ฌธ ์กฐ์‚ฌ ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. avoidMobiles=true ๊ฒฝ๋กœ ๊ณ„์‚ฐ ์‹œ ๊ณ ๋ ค๋œ ๋ฌธ์ž๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    1. 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;

3. ์ œํ•œ๊ณผ ๋ฌธ ์—ด๋ฆผ ๊ธˆ์ง€ ์‹คํ–‰ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • 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;
    }
}

4. ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์— ์ฃผ์„์ด ํฌํ•จ๋œ ๊ธฐ์„ฑ ํ•จ์ˆ˜ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • #์ด ์žˆ๋Š” ์ค„์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running) โ€” UO.MoveXYZ(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ 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.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoverStop

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

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

void UO.MoverStop();

Pathfinder์˜ ์ž๋™ ๊ฒฝ๋กœ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false ๋˜๋Š” ๊ฑธ์Œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ์ž๋™ ์ด๋™์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์†ก๋œ ๋‹จ๊ณ„์™€ ์„œ๋ฒ„ ํ™•์ธ์€ ํšŒ์ˆ˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” TerminateAll์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์Šคํฌ๋ฆฝํŠธ ์ค„๊ณผ ๊ธฐํƒ€ ์ ˆ์ฐจ์˜ ์‹คํ–‰์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๊ฒฝ๋กœ ์ œ๊ฑฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์„ฑ๊ณต ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.MoverStop();

2. ๊ฒฝ๋กœ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ ์ค‘์ง€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 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;

3. ์›€์ง์ž„์„ ๋ฉˆ์ถ”๊ณ  ์œ„์น˜ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MoverStop() โ€” UO.MoverStop()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "moverstop": bridge.StopMoving(); return InjectionValue.Unit;

UO.Moving

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

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

int UO.Moving();

์บ๋ฆญํ„ฐ์˜ ์›€์ง์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int bool (1/0): 1 - ์ž๋™ ํŒจ์ŠคํŒŒ์ธ๋”๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ ๋Œ€๊ธฐ์—ด์— ์•„์ง ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ๋‘˜ ๋‹ค ์—†๊ฑฐ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์ด๋‚˜ ๋‹จ๊ณ„ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ๋ฌธ์ž์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ๋ช…๋ น์—๋Š” ๊ฐœ์ฒด ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 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;

3. ๋ฌด๊ธฐํ•œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Moving() โ€” UO.Moving()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.IsMoving()

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.LimitMove โ€” ์ด๋™ ๊ฑฐ๋ฆฌ ์ œํ•œ. UO.LimitMove๋Š” ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 2000์ด๊ณ  0์€ ๋ฌด์ œํ•œ์ž…๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ 4096๊ฑธ์Œ/๋…ธ๋“œ ๋ฐ 10000๋…ธ๋“œ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. GetPathArray๋Š” moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค€๊ณผ moveOpenDoor๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ