Skip to content

KO UO Topic movement

Codex edited this page Oct 17, 2026 · 5 revisions

Українська · Русский · 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를 따릅니다.

Clone this wiki locally