DE UO Topic movement - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
UO.LimitMove — Reichweite der Bewegung.
Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen
Charakterbewegung, Wegaufbau, Türen, Hindernisse und Schrittverzögerungen. Befehle zum Bewegen von Gegenständen befinden sich unter Gegenstände → Moving Gegenstände.
UO.Move · UO.MoveXY · UO.MoveXYZ · UO.NewMoveXY · UO.Step · UO.StepQ · UO.PMove · UO.MoveOn · UO.MoveOff · UO.MoverStop · UO.CancelMove · UO.Moving · UO.IsMoving · UO.GetRun · UO.IsRunning · UO.AlwaysRun · UO.FixWalk
UO.Dir · UO.Direction · UO.GetDir · UO.GetDirection · UO.CalcDir · UO.PredictedDirection
UO.GetPathArray · UO.GetPathArray3D · UO.AddStep · UO.AddDir
UO.OpenDoor · UO.LastStepQUsedDoor
UO.moveBetweenTwoCorners · UO.moveCheckStamina · UO.moveExitOnDisconnect · UO.moveHeuristicMult · UO.moveOpenDoor · UO.moveThroughCorner · UO.moveThroughNPC · UO.moveTurnCost
UO.PredictedX · UO.PredictedY · UO.PredictedZ
UO.GetRunMountTimer · UO.GetRunUnMountTimer · UO.GetWalkMountTimer · UO.GetWalkUnmountTimer · UO.SetRunMountTimer · UO.SetRunUnmountTimer · UO.SetWalkMountTimer · UO.SetWalkUnmountTimer
Jede Befehlskarte verfügt über mehrere unabhängige Szenarien: Direktcode, Funktionen und Klassen. Nachfolgend finden Sie ausgewählte kurze Szenarien; Einschränkungen und eine vollständige Analyse sind geplant.
Parameter, Ergebnis und alle Szenarien
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;Parameter, Ergebnis und alle Szenarien
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, false);
if (Truth(ArrayLength(path) > 0))
{
UO.Print("Steps: " + Convert.ToString(ArrayLength(path) - 1));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.AddDir(object? directions);-
directionsist eine in der Legacy-Liste gespeicherte Zeichenfolge. Die Bedeutung und das Format des Werts hängen vom kompatiblen Skript ab, das ihn verwendet.
void. Der hinzugefügte Eintrag ist keine Bestätigung der Bewegung.
- Der Wert wird zur Liste
AddDirdes aktuellen Laufzeitstatus hinzugefügt. Der Aufruf selbst übergibt kein Bewegungspaket, bewegt das Zeichen nicht und verfügt nicht über einen dokumentierten öffentlichen Getter zum Lesen dieser Liste.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.AddDir");
UO.AddDir("E");1. Speichern Sie die Richtung als Legacy-kompatiblen Eintrag, ohne das Zeichen zu verschieben. - direktes Drehbuch
Parameter und Ablauf:
- Speichern Sie die Richtung als Legacy-kompatiblen Eintrag, ohne das Zeichen zu verschieben.
UO.AddDir("E");Parameter und Ablauf:
- Übergeben Sie den Wert von der Variablen an die Legacy-Liste AddDir.
return RunScenario();
object? RunScenario()
{
var directionEntry = "north-east";
UO.AddDir(directionEntry);
return null;
}Parameter und Ablauf:
- Jeder Aufruf fügt dem Laufzeitstatus einen weiteren String-Eintrag hinzu.
- Auch die Hilfsprozedur sendet keinen Bewegungsbefehl.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: directions (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Interner Implementierungscode; kein eigenständiges Skript.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.AddStep(object? directions);-
directionsist der Wert, den die Laufzeit in Text umwandelt und zur KompatibilitätslisteAddStephinzufügt. Die Richtung selbst ist nicht interpretierbar.
void. Der Aufruf gibt keinen Wert zurück und bestätigt den Umzug nicht.
- Jeder Aufruf fügt eine Zeichenfolgendarstellung des Arguments zur Liste
AddStepdes aktuellen Laufzeitstatus hinzu. Dieser Legacy-Eintrag sendet keinen Bewegungsbefehl und verfügt in der aktuellen Implementierung nicht über einen öffentlichen Getter.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.AddStep");
UO.AddStep(2);Parameter und Ablauf:
- Schreiben Sie den Wert in die Legacy-Liste. Der Charakter bewegt sich nicht.
UO.AddStep(2);2. Textwert übergeben: Er wird als Datensatz gespeichert und nicht als Richtung ausgeführt. - Skriptfunktion
Parameter und Ablauf:
- Textwert übergeben: Er wird als Datensatz gespeichert und nicht als Richtung ausgeführt.
return RunScenario();
object? RunScenario()
{
var legacyValue = "east";
UO.AddStep(legacyValue);
return null;
}3. Jeder Aufruf fügt einen separaten Eintrag zu AddStep der aktuellen Laufzeit hinzu. - Skriptklasse
Parameter und Ablauf:
- Jeder Aufruf fügt einen separaten Eintrag zu AddStep der aktuellen Laufzeit hinzu.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: directions (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Interner Implementierungscode; kein eigenständiges Skript.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.AlwaysRun();
void UO.AlwaysRun(object? enabled);Liest oder ändert die konstante Laufeinstellung des aktuellen ClassicUO-Profils.
-
enabled-0deaktiviert den Dauerbetrieb; Jeder Wert ungleich Null schaltet es ein.
Das Formular ohne Argumente gibt 1 zurück, wenn die Einstellung aktiviert ist, andernfalls 0. Die Argumentform gibt null zurück.
- Der Wert wird aus dem aktuellen Profil gelesen. Die Einstellung ändert sich
AlwaysRunund speichert das aktuelle Profil. Ohne aktives Profil gibt der Getter0zurück und der Setter meldet einen Fehler im Client-Protokoll und ändert die Einstellung nicht.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.AlwaysRun();
UO.Print("AlwaysRun: " + Convert.ToString(result));Parameter und Ablauf:
- Lesen Sie die Einstellung; 1 bedeutet, dass der Dauerlauf aktiviert ist.
var isAlwaysRunning = UO.AlwaysRun();
UO.Print(Convert.ToString(isAlwaysRunning));2. Aktivieren Sie den Dauerbetrieb und speichern Sie die aktuellen Profileinstellungen. - Skriptfunktion
Parameter und Ablauf:
- Aktivieren Sie den Dauerbetrieb und speichern Sie die aktuellen Profileinstellungen.
return RunScenario();
object? RunScenario()
{
UO.AlwaysRun(1);
return null;
}Parameter und Ablauf:
- Deaktivieren Sie die ständige Ausführung nur, wenn sie derzeit aktiviert ist.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.AlwaysRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AlwaysRun:bridge.AlwaysRun().
Interner Implementierungscode; kein eigenständiges Skript.
public int AlwaysRun() => bridge.AlwaysRun();Parameter: enabled (Integer)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.AlwaysRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AlwaysRun:bridge.AlwaysRun(enabled).
Interner Implementierungscode; kein eigenständiges Skript.
public void AlwaysRun(int enabled) => bridge.AlwaysRun(enabled);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.CalcDir(object? xfrom, object? yfrom, object? xto, object? yto);Berechnet die Richtung von einem Weltpunkt zum anderen. Der Charakter bewegt sich nicht.
-
xfrom— X-Koordinate des Startpunkts. -
yfrom— Y-Koordinate des Startpunkts. -
xto– X-Koordinate des Ziels. -
yto– Y-Koordinate des Ziels.
int – Richtungscode: 0=Norden, 1=Nordosten, 2=Osten, 3=Südosten, 4=Süden, 5=Südwesten, 6=Westen, 7=Nordwesten. Passende Punkte ergeben 100. Es ist nicht bool: 0 bedeutet Norden, nicht Scheitern; 1 bedeutet Nordosten, nicht Erfolg. Übergeben Sie 100 nicht als Richtung an den Schrittbefehl.
- Nur Koordinaten berechnen: keine Stapel, kein Warten, kein Laden der Karte, keine Hindernisprüfung, kein Z, keine Weltkarte. Das Team sucht nicht nach einer passierbaren Route und übernimmt keine Garantie für das Erreichen des Ziels. Die Punkte müssen zum selben Koordinatensystem gehören; Das Vermeiden von Hindernissen kann den Weg verlängern.
- Alle vier Parameter werden benötigt. Senden Sie Weltkoordinaten int im dokumentierten Bereich 0..65535. object? in der Signatur weist auf einen Universaladapter hin, nicht auf den ID des Artikels. Diese Befehle haben keine Standardwerte, keine Koordinaten innerhalb der Truhe, kein fünftes Z und keine Überladung mit einem Objekt.
- Die ursprünglichen Koordinaten werden von den Zielkoordinaten subtrahiert und anschließend werden die Vorzeichen der Differenzen überprüft. Abnehmendes Y bedeutet Norden, zunehmendes X bedeutet Osten. Ändern sich beide Koordinaten, wird unabhängig von der Größe der Unterschiede die Diagonale gewählt. Wenn beide Differenzen Null sind – 100.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.CalcDir(100, 100, 101, 100);
UO.Print("CalcDir: " + Convert.ToString(result));Parameter und Ablauf:
- Ursprung (100,100), Ziel (101,100): X erhöht sich, Y ändert sich nicht. Hauptrückführung int 2 – Osten. Der Bewegungsbefehl wird nicht aufgerufen.
- int – Richtungscode: 0=Norden, 1=Nordosten, 2=Osten, 3=Südosten, 4=Süden, 5=Südwesten, 6=Westen, 7=Nordwesten. Passende Punkte ergeben 100. Es ist nicht bool: 0 bedeutet Norden, nicht Scheitern; 1 bedeutet Nordosten, nicht Erfolg. Übergeben Sie 100 nicht als Richtung an den Schrittbefehl.
- Die ursprünglichen Koordinaten werden von den Zielkoordinaten subtrahiert und anschließend werden die Vorzeichen der Differenzen überprüft. Abnehmendes Y bedeutet Norden, zunehmendes X bedeutet Osten. Ändern sich beide Koordinaten, wird unabhängig von der Größe der Unterschiede die Diagonale gewählt. Wenn beide Differenzen Null sind – 100.
return UO.CalcDir(100,100,101,100);Parameter und Ablauf:
- Beide Punkte sind gleich (100,100). Direction=100 bedeutet eine Übereinstimmung, daher gibt Main string „already there“ zurück. An verschiedenen Stellen funktioniert eine andere Verzweigung. Es wird 100 überprüft, nicht true.
- int – Richtungscode: 0=Norden, 1=Nordosten, 2=Osten, 3=Südosten, 4=Süden, 5=Südwesten, 6=Westen, 7=Nordwesten. Passende Punkte ergeben 100. Es ist nicht bool: 0 bedeutet Norden, nicht Scheitern; 1 bedeutet Nordosten, nicht Erfolg. Übergeben Sie 100 nicht als Richtung an den Schrittbefehl.
- Die ursprünglichen Koordinaten werden von den Zielkoordinaten subtrahiert und anschließend werden die Vorzeichen der Differenzen überprüft. Abnehmendes Y bedeutet Norden, zunehmendes X bedeutet Osten. Ändern sich beide Koordinaten, wird unabhängig von der Größe der Unterschiede die Diagonale gewählt. Wenn beide Differenzen Null sind – 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;Parameter und Ablauf:
- Beim Übergang von (20,20) zu (19,21) nimmt X ab und Y zu: UO.CalcDir gibt 5 zurück. RebuildDirection zeigt alle Zweige dieses Algorithmus und gibt auch 5 aus. Main gibt „5:5“ zurück. Alle vier Assistentenparameter haben die gleiche Koordinatenbedeutung.
- int – Richtungscode: 0=Norden, 1=Nordosten, 2=Osten, 3=Südosten, 4=Süden, 5=Südwesten, 6=Westen, 7=Nordwesten. Passende Punkte ergeben 100. Es ist nicht bool: 0 bedeutet Norden, nicht Scheitern; 1 bedeutet Nordosten, nicht Erfolg. Übergeben Sie 100 nicht als Richtung an den Schrittbefehl.
- Die ursprünglichen Koordinaten werden von den Zielkoordinaten subtrahiert und anschließend werden die Vorzeichen der Differenzen überprüft. Abnehmendes Y bedeutet Norden, zunehmendes X bedeutet Osten. Ändern sich beide Koordinaten, wird unabhängig von der Größe der Unterschiede die Diagonale gewählt. Wenn beide Differenzen Null sind – 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CalculateDirection:CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "calcdir": return new InjectionValue(CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CancelMove();Deaktiviert die weitere Bewegung durch das Skript über MoveOff.
Es gibt keine Parameter.
void – kein Rückgabewert.
- Ruft MoveOff auf, wodurch die Laufzeit/der Manager in den Zustand MoveEnabled=false versetzt wird. Um die Bewegung wieder zu ermöglichen, ist MoveOn erforderlich. Der Befehl setzt bereits gesendete Schritte nicht zurück.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.CancelMove");
UO.CancelMove();Parameter und Ablauf:
- Die folgenden Bewegungsbefehle berücksichtigen die ausgeschaltete Auflösung.
UO.CancelMove();Parameter und Ablauf:
- MoveOn stellt die Auflösung explizit wieder her.
return RunScenario();
object? RunScenario()
{
UO.CancelMove();
UO.MoveOn();
return null;
}Parameter und Ablauf:
- Eine getrennte Verbindung wird als Bedingung verwendet, um weitere Schritte zu verhindern.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveOff:MoveOff().
Interner Implementierungscode; kein eigenständiges Skript.
case "cancelmove": MoveOff(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Dir();Liest die Zeichenrichtung aus dem Clientmodell.
Es gibt keine Parameter.
int — Richtung mobile ohne Laufbit: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Für unbekannt gibt mobile 0 zurück, was ebenfalls Norden bedeutet.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Dir();
UO.Print("Dir: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Die Richtung des Zeichens wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.Dir();
UO.Print("Dir: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die Richtung des Zeichens wird in der angezeigten Berechnung oder Bedingung verwendet.
- Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
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;Parameter und Ablauf:
- Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
- Änderung im Vergleich: Zeichenrichtung. Ein Beispiel ändert nichts auf der Welt und wartet nicht endlos. Ereignisse innerhalb dieser Sekunde können übersehen werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Dir]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.GetDir(bridge.Self)API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Direction();Liest die Zeichenrichtung aus dem Clientmodell.
Es gibt keine Parameter.
int — Richtung mobile ohne Laufbit: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Für unbekannt gibt mobile 0 zurück, was ebenfalls Norden bedeutet.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Direction();
UO.Print("Direction: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Die Richtung des Zeichens wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.Direction();
UO.Print("Direction: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die Richtung des Zeichens wird in der angezeigten Berechnung oder Bedingung verwendet.
- Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
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;Parameter und Ablauf:
- Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
- Änderung im Vergleich: Zeichenrichtung. Ein Beispiel ändert nichts auf der Welt und wartet nicht endlos. Ereignisse innerhalb dieser Sekunde können übersehen werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Direction]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.GetDir(bridge.Self)API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.FixWalk();Gibt einen Hinweis aus, dass der ältere native Client-Patch FixWalk von ClassicUO nicht benötigt wird.
Es gibt keine Parameter.
void – kein Rückgabewert.
- Der Zweig ExecuteLegacyManualAlias ruft nur SystemMessage auf. Bewegung, Sprache, Container oder Netzwerkprotokoll werden nicht korrigiert.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.FixWalk");
UO.FixWalk();Parameter und Ablauf:
- Die Meldung beschreibt, dass der alte Patch nicht benötigt wird.
UO.FixWalk();Parameter und Ablauf:
- Das Kompatibilitätsverfahren verändert die Spielwelt nicht.
return RunScenario();
object? RunScenario()
{
CompatibilityNotice();
return null;
}
void CompatibilityNotice()
{
UO.FixWalk();
}Parameter und Ablauf:
- Nach der Diagnosemeldung wird die Ausführung fortgesetzt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.").
Interner Implementierungscode; kein eigenständiges Skript.
case "boxhack":
case "fixtalk":
case "fixwalk":
SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");
break;Follow verwendet UO.LimitMove, moveCheckStamina, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost, moveExitOnDisconnect, moveBetweenTwoCorners sowie einen Schnappschuss von SetBadLocation/SetBadObject. Annäherungsabstand 0 gilt auch für Figuren; er ist unabhängig von UO.LimitMove.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Follow();
int UO.Follow(object? target);
int UO.Follow(object? target, object? distance);
int UO.Follow(object? target, object? distance, object? running);
int UO.Follow(object? target, object? distance, object? running, object? stopConditions);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running, object? stopConditions);Ermöglicht die Hintergrundverfolgung des geladenen Zeichens/NPC oder die Bewegung zu den Punkten X, Y, Z. Während der Bewegung prüft der Client die übermittelten Stoppbedingungen; Das Skript setzt die Ausführung unmittelbar nach dem Aufruf fort.
-
target– Zeichenserie/NPC: int, Hexadezimal-/Dezimalzeichenfolge, lasttarget oder Name, der zuvor über AddObject gespeichert wurde. Dabei handelt es sich nicht um graphic/type oder Koordinaten. Sie können weder sich selbst noch einem Objekt folgen. 0 folgt nicht mehr. Ohne Argumente stoppt Follow() es auch; der Anblick erscheint nicht. -
distance– X/Y-Toleranz in Zellen: maximal |dx| und |dy|. Für Zeichen int 0..18, Standard 1; Z-Unterschiede bis zu 16 sind akzeptabel. Für den Punkt int 0..18 ist das Argument erforderlich: 0 erfordert exaktes X/Y, 2 ermöglicht das Anhalten innerhalb von zwei Zellen; Z muss genau übereinstimmen. Ein ungültiger Wert ersetzt nicht das bisherige Verhalten. -
running– bool-kompatibler Wert: true/1 – Laufen, false/0 – Gehen; Der Standardwert ist true. Geschwindigkeitsbegrenzungen, Ausdauer, Lähmungen und Hindernisse des Servers bleiben bestehen. Das Flag beschleunigt die Serverschritte nicht. -
stopConditions– Optionales Array von Stoppbedingungen: viertes Argument für Zeichen, sechstes für Koordinaten. Jedes Element ist ein Array aus genau drei Werten [Feld, Vergleich, Schwellenwert]. Feld und Vergleich sind Zeichenfolgen, Schwellenwert ist int/double; für Fahnen sind true/false (1/0) geeignet. Das Auslösen JEDER Bedingung beendet Follow (OR). Ein leeres Array fügt keine Bedingungen hinzu. Die Anzahl der Elemente ist nicht auf feste 3/5/10-Elemente beschränkt, sondern wird durch den Speicher begrenzt; Große Listen werden in Blöcken überprüft. Zulässige Felder und Einheiten sind unten aufgeführt; Ein unbekanntes Feld, ein unbekannter Operator oder eine ungültige Array-Form verursacht einen Fehler, bevor das frühere Follow ersetzt wird. -
x– Nur Formulare mit 5/6-Argumenten: ganzzahlige Weltkoordinaten auf der aktuellen Karte, 0..65535 und innerhalb geladener Kartengrenzen. Dies sind keine Fenster-/Gump-Koordinaten oder serial. Eine Übertragung auf eine andere Karte erfolgt nicht. -
y– Nur Formulare mit 5/6-Argumenten: ganzzahlige Weltkoordinaten auf der aktuellen Karte, 0..65535 und innerhalb geladener Kartengrenzen. Dies sind keine Fenster-/Gump-Koordinaten oder serial. Eine Übertragung auf eine andere Karte erfolgt nicht. -
z– Nur Formulare mit 5/6-Argumenten: ganzzahlige Welthöhe -128..127. Diese Höhe ist für die Fertigstellung erforderlich. Geben Sie daher den Z-Wert der verfügbaren Oberfläche des gewünschten Bodens an. Es gibt keine separaten „beliebigen Z“-Werte oder eine automatische Höhenauswahl.
int 1 (true) – der folgende Modus wurde vom Client akzeptiert oder eine Stoppanforderung wurde abgeschlossen; int 0 (false) – Es ist kein passender Charakter geladen, der Spieler ist nicht verfügbar/tot, das Ziel ist außer Sichtweite, die Entfernung ist falsch oder der Client unterstützt das Team nicht. Dies ist nicht das Ergebnis der Ankunft, nicht serial und nicht der Anzahl der Schritte. Verwenden Sie in C# if (result != 0) oder if (result == 1); Das Ergebnis ist vom Typ int, nicht bool. Typfehler/unbekannter Objektname können einen Skriptfehler verursachen. Bei Koordinaten bedeutet 0 auch ungültige X/Y/Z oder Toleranz. 1 bedeutet, nur die Hintergrundaufgabe zu akzeptieren; Ankunft und zukünftige Belegung müssen noch bestätigt werden.
- Genau ein Follow-Modus pro Client: Zeichen oder Koordinaten. Ein erfolgreicher Aufruf ersetzt erneut das Ziel und die Parameter. Eine erfolglose Herausforderung hebt das vorherige Ziel nicht auf. Um einem Charakter zu folgen, muss er sich bereits in der geladenen Mobiles-Liste innerhalb von ClientViewRange befinden; Der Koordinatenpunkt liegt möglicherweise weiter als die Ansicht.
- Wenn die Figur in die Nähe des Ziels gelangt, stoppt das Gehen, der Modus bleibt jedoch aktiviert und setzt die Bewegung fort, wenn sich das Ziel entfernt. In der Nähe des Bezugspunkts wird die Aufgabe abgeschlossen, wenn die X/Y-Toleranz und das exakte Z eingehalten werden. Der Befehl meldet beim Start keine garantierte Erreichbarkeit der Route.
- Follow(), Follow(0), MoverStop(), manuelle Maus-/Pfeilbewegung, eine neue Skriptroute oder Standard-Client-Folgen beenden diesen Modus. TerminateAll/Terminate("all") stoppt es ebenfalls. Wenn Sie ein noch laufendes Eigentümerskript abbrechen, wird es gestoppt Follow.
- Beide Modi enden, wenn sich die Karte oder der Charakter ändert, der Spieler stirbt oder die Verbindung unterbrochen wird. Das Verfolgen des Charakters stoppt außerdem, wenn das Ziel aus dem Speicher/der Ansicht verschwindet. Das spätere Erscheinen eines Ziels löst den Modus nicht automatisch aus: Es ist ein neues Follow erforderlich.
- Das Schließen von IDE beendet den Modus nicht. Bei normaler Beendigung eines laufenden Skripts bleibt Follow aktiviert. Eine Skriptpause ist selbst keine Pause für diesen Clientmodus; Verwenden Sie vor dem Anhalten Follow(0), wenn die Bewegung angehalten werden muss.
- Pathfinder berechnet den Pfad in Blöcken im Spielstream; Eine unvollständige Suche wird nicht erneut gestartet. Für mobile ist die normale Routenaktualisierung auf 500 ms begrenzt. Nach einem Ausfall oder Abbruch einer Route ohne Annäherung betragen die ersten drei Wiederholungsverzögerungen 1000 ms, dann 2000, 4000 und maximal 5000 ms. Der Absprungzähler wird zurückgesetzt, wenn der X/Y/Z Spieler oder das Ziel wechselt; Durch Ändern des Ziels kann die Wartezeit um bis zu 500 ms verkürzt werden. Es gibt keine allgemeine Begrenzung für die Anzahl der Wiederholungen für ein verfügbares mobile-Ziel: Der Modus kann aktiv bleiben, ohne sich zu bewegen, also stellen Sie ihn auf „verstrichen“ oder stoppen Sie ihn explizit. Die Koordinatenaufgabe endet, wenn der Pfad vollständig ausfällt.
- Entfernungs-/Zeitfelder: Entfernung – aktuelle Entfernung zum Ziel in Zellen max(abs(dx),abs(dy)); Höhe – absolute Differenz Z in Welteinheiten; verstrichen – Millisekunden seit der Annahme dieses Follow. Distanz > 12 stoppt, wenn man sich weiter als 12 Zellen bewegt, verstrichen >= 30000 - nach 30 Sekunden. Ein wiederholtes erfolgreiches Follow startet den Countdown erneut.
- Der Zustand deines Charakters: self.hp / self.mana / self.stam – aktuelle Werte; self.hppercent / self.manapercent / self.stampercent – Prozentsätze 0..100 vom entsprechenden Maximum. Unbekanntes Maximum (<=0) bedeutet unbekannten Wert: Die Bedingung für dieses Merkmal wird nicht ausgelöst, anstatt den fiktiven 0 zu erhalten.
- Logische Felder für deinen Charakter: self.poisoned (vergiftet), self.paralyzed (gelähmt), self.hidden (versteckt). Werte 1/0. Im Bedingungsarray Follow folgt die Regel für das Feld „self.paralyzed“ mit dem Operator „=" und dem Wert true nicht mehr, wenn sie paralysiert ist. Dies ist der Stringname des Regelfelds, nicht die C#-Variable self.
- Zielfelder: target.dead – tot mobile, target.hidden – ausgeblendet, target.visible – für den Client sichtbar (nicht CheckLOS), target.hp / target.hppercent – geladen HP/percent. Wenn HP max unbekannt ist, schlägt die HP-Bedingung fehl. Der Server kann die relative Skala HP des Charakters einer anderen Person senden, daher ist hppercent für ihn bequemer.
- Zusätzliche Zielfelder: target.notoriety – Status 0..7 (0 unbekannt, 1 unschuldig, 2 Verbündeter, 3 grau, 4 kriminell, 5 Feind, 6 Mörder, 7 Unverwundbar); Ziel.body – numerischer graphic des Körpers. Es handelt sich hierbei nicht um type-Kleidung. Beispielsweise stoppt target.notoriety != 2 die Verfolgung, wenn der Verbündetenstatus verloren geht.
- Beim Aufruf wird eine Kopie der Bedingungen erfasst, einschließlich numerischer Schwellenwerte. Durch das Ändern des Quellarrays/der Quellvariablen wird der Modus nicht aktualisiert; Wiederholen Sie Follow mit dem neuen Array. Der abgebrochene Modus wird nicht selbst wieder aufgenommen, wenn die Bedingung nicht mehr erfüllt ist.
- Die Bedingungen werden sowohl während der Bewegung als auch dann überprüft, wenn der Charakter bereits in der Nähe des Ziels steht. Eine reguläre Liste von bis zu 64 Elementen wird in einem Spielrahmen überprüft, die nächste Überprüfung erfolgt nicht früher als nach 250 ms. Eine größere Liste – 64 Elemente pro Frame, dann eine Pause 250 ms. Das abgelaufene Feld stoppt möglicherweise später als der Schwellenwert für die Dauer der Prüfung/des Frames: Es handelt sich nicht um einen genauen Timer.
- Bis die erste Prüfung der gesamten Liste abgeschlossen ist, beginnt keine neue Route. Wenn die Bedingung bereits erfüllt ist, gibt Follow 1 für die akzeptierte Anfrage zurück und stoppt dann die Aktualisierung ohne den ersten Schritt. Möglicherweise wurden bereits Pakete mit Schritten aus der vorherigen Bewegung gesendet.
- Durch die neuen Bedingungen werden obligatorische Stoppgründe nicht deaktiviert: Verlust von Ziel/Spieler/Karte/Link, Spielertod, Löschung des Besitzers, Terminate alle und manuelle/sonstige Bewegung. Skriptcode wird im Spielthread nicht ausgeführt; Es werden nur die aufgeführten lokalen Werte überprüft.
- Koordinatenformen: Follow(x,y,z,distance,running) und Follow(x,y,z,distance,running,stopConditions). Die ersten fünf Argumente sind erforderlich. Follow(x,y,z) ist keine Abkürzung für Koordinaten: Die drei Argumente bedeuten immer noch Ziel, Entfernung, Laufen.
- Im Koordinatenmodus bedeutet „Abstand“ in der Bedingung den verbleibenden X/Y-Abstand zum Punkt, die Höhe ist die absolute Differenz von seinem Z-Wert; abgelaufen und alle self.* funktionieren wie gewohnt. Die Felder „target.*“ sind ungültig: Der Punkt hat keinen HP, Körper oder Status. Der Versuch, sie zu übergeben, führt zu einem Skriptfehler, bis der alte Modus ersetzt wird.
- Die Bedingungen werden vor der ersten Route, während ihrer Berechnung und während der Bewegung des Charakters überprüft. Das Auslösen einer beliebigen Bedingung entfernt die Aufgabe und bricht den zugehörigen Pfad ab. Die Häufigkeit und Verarbeitung großer Listen entspricht dem Verfolgen eines Zeichens. Schritte, die bereits an den Server gesendet wurden, werden möglicherweise abgeschlossen.
- Die Koordinatenaufgabe endet, wenn der Punkt erreicht ist oder die Suche und Bewegung fehlschlägt bzw. endet, ohne ihn zu erreichen. Unendliche Wiederholungsversuche zu einem nicht erreichbaren Punkt werden nicht ausgelöst. Die normalen internen Neuberechnungen von Pathfinder für Hindernisse bleiben erhalten. Sobald der Vorgang abgeschlossen ist, wird die Aufgabe durch das Verlassen des Standorts nicht fortgesetzt.
- Wenn Pathfinder die letzten Schritte bereits gesendet und den Pfad abgeschlossen hat, diese Schritte jedoch noch ausgeführt werden/auf Bestätigung warten, prüft die Aufgabe weiterhin die Bedingungen. Die Warteschlange der gesendeten Schritte selbst wird nicht gelöscht: Sie muss vom normalen Serverbewegungs- und Bestätigungsmechanismus verarbeitet werden.
- Die Liste kann über List.Add am DO ... Ende der Schleife oder FOR zusammengestellt und dann einmal an checks.ToArray() als letztes Argument der entsprechenden Form übergeben werden. Es ist nicht erforderlich, Follow bei jeder Iteration erneut aufzurufen: Dadurch wird der Modus ersetzt und die verstrichenen Werte zurückgesetzt. Die Anzahl der Zeilen ist nicht auf eine geringe Anzahl beschränkt, der Satz unterstützter Felder ist jedoch auf die oben aufgeführten Felder beschränkt.
- Nach 2000 ms ohne Änderung von X/Y/Z können Spieler mobile-Follow erneut einen Pfad zu einem stationären Ziel anfordern. Die Prüfung wird nur durchgeführt, wenn der nächste Termin außerhalb der Suche eintritt, nachdem Player.Steps und die Walker-Warteschlange freigegeben wurden und der nächste Schritt zulässig ist. Es entstehen keine Kosten, langsam voranzukommen und auf Bestätigungen zu warten; Gesendete Schritte werden nicht gelöscht. Die Koordinate Follow löst keine solche externe unendliche Wiederholung aus: Die Wiederherstellung ihres Pfades wird vom eingeschränkten Pathfinder übernommen.
- Der allgemeine Pathfinder speichert bis zu 8 temporäre X/Y/Z-Richtungsverbote für 2000 ms, nur bei abgelehnter Bewegung der entsprechenden aktiven Anfrage. Rotation, unbekannte Reihenfolge, Resynchronisation und Alt-/Fremdanfrage begründen kein solches Verbot. Durch eine neue externe Anfrage und den Verlust des Karten-/Spielerkontexts werden sie gelöscht. Die Suche nach geladener Geometrie versucht, den Übergang zu umgehen; Es geht darum, nicht alle Serverhindernisse zu kennen. Ohne die X/Y/Z des Spielers zu ändern, sind bis zu 8 interne Neuberechnungen mit einer Pause von mindestens 40 ms zulässig. Es gibt keinen vollständigen Weg oder dieses Budget ist erschöpft – die Route endet. Die Koordinatenaufgabe wird dann abgeschlossen, nachdem die übermittelten Schritte verarbeitet wurden. mobile-Follow versucht es aufgrund der Verzögerung möglicherweise erneut.
- Der Controller vergleicht die Nummer seiner eigenen Bewegungsanforderung, nicht die Tatsache AutoWalking: Das natürliche Ende des Pfades wird nicht als Fremdbefehl betrachtet. StopOwnedPath überträgt die gespeicherte Nummer an StopAutoWalkIfRequestGeneration. Die neue externe Anfrage beendet das alte Follow; Durch das Stoppen wird die neue Route einer anderen Person nicht gelöscht.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Follow();
UO.Print("Follow: " + Convert.ToString(result));Parameter und Ablauf:
- Anführer – serial des letzten Ziels. Die Einheit bestätigt die Annahme des Regimes, nicht die Ankunft. Nach Beendigung der Methode arbeitet der Modus weiter, bis das Ziel stoppt/verliert.
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;Parameter und Ablauf:
- UO.Wait wird in Millisekunden gemessen. Follow(0) schaltet den allgemeinen Folgemodus aus; Nachfolgende Bewegungen des Ziels verursachen keine Bewegung mehr.
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;Parameter und Ablauf:
- Distanz=2, Laufen=true; maximale 20-Erwartungen über 500 ms. Exists prüft die Anwesenheit eines Objekts, nicht jedoch die Erreichbarkeit des Pfades.
finallystoppt den Modus während des normalen Beendens/Fehlers; Die Notfallstornierung durch den Eigentümer erfolgt zusätzlich durch den Kunden.
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;
}Parameter und Ablauf:
- Anhalten unter JEDER Bedingung: Das Ziel ist weiter als 12 Zellen ODER unser HP nicht mehr als 40% ODER 30 Sekunden sind vergangen. Das ist nicht AND. StopWhen ist vollständig angegeben, es kann in Include eingebunden werden. Eins bedeutet Akzeptanz, nicht Ankunft.
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;Parameter und Ablauf:
- Wir hören auf, wenn das Ziel verschwunden ist/gestorben ist/kein Verbündeter mehr ist, nicht mehr als 5 Ausdauer übrig ist oder die Differenz in Z 16 überschritten hat. false bedeutet gehen. ToArray übergibt eine Liste von Bedingungszeilen; Die Größe wird nicht im Voraus angegeben. Wenn das Ziel kein Verbündeter mehr ist, beginnt die Bewegung nicht.
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;
}Parameter und Ablauf:
- Eingehaltener Abstand 1, Stoppbedingung <=3; Bei der Überprüfung alle 250 ms kann es zu einer verzögerten Leistung kommen. Das 15000 ms-Timeout ermöglicht keine Verfolgung auf unbestimmte Zeit. Die Rückgabe von Follow bedeutet immer noch Akzeptanz und nicht das Erreichen von drei Feldern.
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;
}
}Parameter und Ablauf:
- while sammelt eine separate Bedingung für jedes Statuselement. Stoppen Sie bei Status 5 ODER 6, besitzen Sie HP <=40% ODER nach 30000 ms. Leere Status überspringen die Schleife, die nächsten beiden Bedingungen bleiben jedoch bestehen. Neue Zeilen bis Follow hinzufügen; Eine spätere Änderung an List ändert nichts an der bereits installierten Kopie. Für Hintergrundüberprüfungen muss der Schleifenkörper nicht wiederholt werden.
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. Eigene Ausdrücke am Ende der Schleife UNTIL und ein obligatorischer Stopp bei „Endlich“ – Skriptfunktion
Parameter und Ablauf:
- StopEscort(Leader, startedAt) gibt bool-kompatibel 1/0 zurück: Ziel über 12 Zellen hinaus ODER eigene HP <=30 ODER 30 Sekunden sind vergangen. || hinzufügen (another_condition); Für eine obligatorische Kombination aus zwei Prüfungen verwenden Sie (BedingungA && BedingungB). Unbekannt HP kann als 0 gelesen werden; Das Beispiel weigert sich dann zu starten. Während das Skript ausgeführt wird, überprüft es Ausdrücke ungefähr alle 250 ms; Durch das Anhalten des Skripts werden diese Prüfungen angehalten. Löst schließlich einen Stopp bei normalem Exit/Fehler aus; Die Stornierung durch den Eigentümer wird zusätzlich vom Kunden verfolgt. Wenn das Ziel verschwunden ist und der Client bereits gestoppt wurde Follow, endet diese Schleife zu ihren eigenen Bedingungen, spätestens bei der Timeout-Prüfung. Um nach dem Ende der Methode zu arbeiten, verwenden Sie das vierte Argument, wie in den vorherigen Beispielen.
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;Parameter und Ablauf:
- Fünf Argumente: X=1445, Y=1690, Z=0, Toleranz X/Y=0, Lauf. Rückgabe 1 bedeutet Annahme, nicht bereits abgeschlossene Ankunft. Sobald Sie dort angekommen sind, wird die Aufgabe vollständig deaktiviert. Um manuell vorzeitig anzuhalten, rufen Sie UO.Follow(0) auf.
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;
}Parameter und Ablauf:
- Bei HP <=40%, Lähmung oder nach 30 Sekunden stoppt der Client seinen aktuellen Pfad. Andernfalls endet die Aufgabe innerhalb von zwei X/Y-Zellen von (1445,1690), genau genommen bei Z=0. Die Kontrollen werden sowohl während der Wegfindung als auch während der Bewegung fortgesetzt. Dies ist keine einmalige Kontrolle vor dem Start. target.* gilt hier nicht.
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. Um auf den Punkt zu kommen, aber die Eskorte drei Zellen davor zu beenden, ist eine Funktion des Skripts
Parameter und Ablauf:
- distance=0 im Aufruf gibt eine genaue Ankunft an, aber die Bedingung distance<=3 beendet die Aufgabe früher, wenn die nächste Prüfung eine solche Entfernung feststellt. false bedeutet Gehen. Der Unterschied Z>16 oder 20000 ms stoppt die Aufgabe ebenfalls. Die Richtung garantiert keine Passierbarkeit; Ersetzen Sie den Offset durch Ihren Routenpunkt.
Mindestschrittintervall: Gehen – Gehen 400 ms, Laufen 200 ms; Reiten - Gehen 200 ms, Laufen 100 ms.
Hierbei handelt es sich um Standard-Client-Limits und nicht um automatisch definierte Einstellungen für Ihren Shard. Servergeschwindigkeit und Flugmodi werden separat gezählt. Skript-Timer können die Bewegung verlangsamen, verringern diese Grenzwerte jedoch nicht.
Schritte, Routen, Follow, Maus-/Tastensteuerung und Karte nutzen die gemeinsame Warteschlange des Charakters. Durch das Ersetzen der Route, das Abbiegen oder das Anpassen der Position durch den Server wird die verbleibende Pause nach der Schrittanforderung nicht aufgehoben. Nach der Verzögerung gibt es keinen schnellen Burst, um die verlorenen Frames auszugleichen. Das Warten auf eine Bestätigung, Hindernisse und schlechte Kommunikation können die Bewegung verlangsamen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)Parameter: target (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)Parameter: target (Any), distance (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)Parameter: target (Any), distance (Any), running (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)Parameter: target (Any), distance (Any), running (Any), stopConditions (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[3]). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(values[0]). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[2]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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);
}Parameter: x (Any), y (Any), z (Any), distance (Any), running (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[5], coordinateGoal: true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[4]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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);
}Parameter: x (Any), y (Any), z (Any), distance (Any), running (Any), stopConditions (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [Follow]. -
InjectionScript.Runtime.FollowStopCondition.Parse:FollowStopCondition.Parse(values[5], coordinateGoal: true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]). -
InjectionScript.Runtime.InjectionApiUO.ToBoolean:ToBoolean(values[4]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values =>
{
FollowStopCondition[] conditions = count == 6
? FollowStopCondition.Parse(values[5], coordinateGoal: true) : Array.Empty<FollowStopCondition>();
return new InjectionValue(bridge is IApiCoordinateFollowBridge follow
? follow.FollowPoint(NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]),
NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), ToBoolean(values[4]), conditions) : 0);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetDir();
int UO.GetDir(object? id);Liest die Zeichenrichtung aus dem Clientmodell.
-
id– Optionales Objekt nur in den angegebenen Einzelparameterformen: serial Zahl/Hex-Zeichenfolge, „self“, „lasttarget“ oder Name AddObject. Dies ist nicht graphic/type. Ohne Argumente wird der eigene Charakter gelesen. Bevor Sie ein anderes Objekt lesen, überprüfen Sie UO.Exists; Ein unbekannter Name öffnet den Bereich nicht.
int — Richtung mobile ohne Laufbit: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Für unbekannt gibt mobile 0 zurück, was ebenfalls Norden bedeutet.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Die Richtung des Zeichens wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die Richtung des Zeichens wird in der angezeigten Berechnung oder Bedingung verwendet.
- Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
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;Parameter und Ablauf:
- Das einzelne Argument wählt das Objekt lasttarget; sein serial muss dem Client bekannt sein. Grafik/type wird hier nicht übertragen.
- Die Daten eines anderen Objekts können auch bei positiven Exists unbekannt sein. Für die Koordinaten eines Gegenstands in einer Tasche wird die Position des Behälters ermittelt, nicht der Weltpunkt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
InjectionScript.Runtime.InjectionApiUO.GetDir:GetDir("self").
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDir() => GetDir("self");Parameter: id (Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDir(int id) => bridge.GetDir(id);Parameter: id (Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetDir. -
InjectionScript.Runtime.InjectionApiUO.GetDir:GetDir(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDir(string id) => GetDir(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetDirection();
dynamic UO.GetDirection(object? objID);Liest die Zeichenrichtung aus dem Clientmodell.
-
objID– Optionales Objekt nur in den angegebenen Einzelparameterformen: serial Zahl/Hex-Zeichenfolge, „self“, „lasttarget“ oder Name AddObject. Dies ist nicht graphic/type. Ohne Argumente wird der eigene Charakter gelesen. Bevor Sie ein anderes Objekt lesen, überprüfen Sie UO.Exists; Ein unbekannter Name öffnet den Bereich nicht.
int — Richtung mobile ohne Laufbit: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Für unbekannt gibt mobile 0 zurück, was ebenfalls Norden bedeutet.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Die Richtung des Zeichens wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die Richtung des Zeichens wird in der angezeigten Berechnung oder Bedingung verwendet.
- Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
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;Parameter und Ablauf:
- Das einzelne Argument wählt das Objekt lasttarget; sein serial muss dem Client bekannt sein. Grafik/type wird hier nicht übertragen.
- Die Daten eines anderen Objekts können auch bei positiven Exists unbekannt sein. Für die Koordinaten eines Gegenstands in einer Tasche wird die Position des Behälters ermittelt, nicht der Weltpunkt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetDirection]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.GetDir(bridge.Self)API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Parameter: objID (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "getdirection": return new InjectionValue(bridge.GetDir(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetPathArray(object? xdst, object? ydst, object? optimized, object? accuracy);Gibt den Pfad von der aktuellen Position des Charakters zu X/Y zurück, ohne eine Bewegung auszuführen.
-
xdst– Weltkoordinate X des Ziels, 0..65535. Dies ist nicht serial oder eine Position innerhalb eines Gumps. -
ydst– Welt-Y-Koordinate des Ziels, 0..65535. -
optimized- true ermöglicht diagonale Übergänge; false hinterlässt in dieser kompatiblen Form vier gerade Richtungen. Dies unterscheidet sich von der optimierten Bedeutung von MoveXY. -
accuracy– Toleranz für X und Y in Zellen: Beide Abweichungen müssen hineinpassen. Der Wert ist auf den Bereich 0..20 begrenzt; 0 erfordert präzises X/Y.
Array von [x,y,z]-Datensätzen, jedes Feld ist ein int. [0] des äußeren Arrays ist der Startpunkt; der letzte Eintrag liegt innerhalb der vorgegebenen Solltoleranz. Die Anzahl der Schritte beträgt ArrayLength(Pfad)-1 nur für ein nicht leeres Array. Ein leeres Array [] bedeutet, dass der vollständige gültige Pfad nicht erhalten wurde (Ziel/Karte nicht erreichbar, Einschränkungen oder Suchbeschränkung). Wenn der Startpunkt bereits geeignet ist, wird ein Datensatz zurückgegeben und die Anzahl der Schritte beträgt 0. Der Teilpfad wird nicht zurückgegeben.
- Das Team berechnet nur die Route; Es startet keine Bewegung und öffnet keine Türen. Verwenden Sie zum Ausführen NewMoveXY/MoveXYZ und überprüfen Sie das eigene Ergebnis.
- Die Suche vermeidet Hindernisse, indem benachbarte Züge als gleich teuer angesehen werden. Auf einer konstanten Karte wird der Weg mit der geringsten Anzahl von Schritten gesucht. Die tatsächliche Durchgängigkeit jeder Rippe wird überprüft, einschließlich der Höhe und Einschränkungen der Diagonalen des Kunden.
- UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.
- Im Client wird die Berechnung in Abschnitte von bis zu 32 Knoten aufgeteilt, mit einer Budgetprüfung von etwa 1 ms zwischen den Knoten. Die Stornierung wird zwischen den Portionen überprüft. Das Lesen der Karte bleibt im Spielthread; Es ist kein Versprechen einer festen Lesezeit für einzelne Festplatten.
- Die Karte kann sich nach der Überprüfung ändern: Charaktere bewegen sich, Türen schließen sich, der Server korrigiert die Situation. Das resultierende Array ist ein Plan für verfügbare lokale Daten, keine Serverbestätigung.
- SetBadLocation schließt Zellen aus, SetBadObject schließt Bereiche um geeignete geladene Weltobjekte aus. Es wird ein Snapshot Ihrer Laufzeitlisten zum Zeitpunkt der Anfrage verwendet; Verbote von einem anderen Start werden nicht vererbt. Die Startzelle wird nicht auf Status überprüft: Sie wird durch den aufrufenden Code angegeben. Sie können kein beliebiges Z innerhalb einer Wand als gültige Startposition verwenden.
- Aktuelle Karte und Start-X/Y/Z stammen von der Figur; Z-Toleranz 255. moveThroughNPC legt die Ausdauerschwelle fest, moveOpenDoor erlaubt die Planung durch Türen. GetPathArray öffnet keine Türen und bewegt die Figur nicht.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), true, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Xdst – fünf Zellen östlich; Ydst ehemaliger; Optimiert=true; Genauigkeit=0.
- count umfasst den Startpunkt. Die Subtraktion 1 wird erst durchgeführt, nachdem nach einem nicht leeren Array gesucht wurde.
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;Parameter und Ablauf:
- Ziel 1445/1690; Optimized=false schließt Diagonalen aus; Accuracy=1 löst die nächstgelegene Zelle im Toleranzquadrat auf.
- Punkt[0]/[1]/[2] - X/Y/Z. Es handelt sich nicht um graphic, serial oder Oberflächentyp.
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;Parameter und Ablauf:
- Das erste Team zählt nur den Weg. Der zweite prüft/führt die Bewegung erneut aus, Callback=0, Timeout=5000.
- Wenn Sie einfach gehen müssen, ist das vorläufige GetPathArray optional und erhöht die Arbeit.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: xdst (Any), ydst (Any), optimized (Any), accuracy (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. - Aktuelle Karte und Start-X/Y/Z stammen von der Figur; Z-Toleranz 255. moveThroughNPC legt die Ausdauerschwelle fest, moveOpenDoor erlaubt die Planung durch Türen. GetPathArray öffnet keine Türen und bewegt die Figur nicht.
-
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Interner Implementierungscode; kein eigenständiges Skript.
case "getpatharray":
return BuildPortablePath(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self),
Arg(0), Arg(1), bridge.GetZ(bridge.Self), bridge.WorldNumber, Arg(3), 255, Arg(2) != 0, false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors, object? allowDiagonal);Berechnet ein Array des vollständigen Pfads zwischen zwei Punkten auf der Welt mit Höhenkontrolle und zusätzlichen Filtern.
-
startX– Anfangswelt X, 0..65535. -
startY– Anfangswelt Y, 0..65535. -
startZ– Anfangshöhe -128..127. -
finishX– Zielwelt X, 0..65535. -
finishY– Zielwelt Y, 0..65535. -
finishZ– Zielhöhe -128..127. -
map– Nummer der aktuell geladenen Karte, zum Beispiel UO.WorldNum(). Die andere Karte ergibt ein leeres Array einschließlich passender X/Y/Z. -
accuracyXY– Toleranz für X und Y in Zellen: Beide Abweichungen müssen hineinpassen. Der Wert ist auf den Bereich 0..20 begrenzt; 0 erfordert präzises X/Y. -
accuracyZ– Höhentoleranz: abs (tatsächliches Z – erforderliches Z), begrenzt durch 0..255. Null erfordert eine genaue Höhe; 255 deaktiviert praktisch die Z-Grenze. -
run– Erforderliches kompatibles Laufflag. Die Anfrage bewegt nichts; In dieser Form ist „Optimiert“ immer true, sodass sich bei „Ausführen“ weder die Reihenfolge der Zellen noch die Anzahl der Schritte ändert. - UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.
-
maxSteps— Optionale Anzahl der Wegkanten ohne Startpunkt. maxSteps > 0 begrenzt sie; null, negativ oder nicht angegeben bedeutet keine Schrittzahlgrenze. UO.LimitMove prüft unabhängig die Zielentfernung. -
maxDistance– Optionale Begrenzung der anfänglichen Entfernung max(abs(dx),abs(dy)) zum Ziel. 0/Abwesenheit deaktiviert es. Dies ist nicht die erlaubte Abweichung während der Durchquerung und nicht die Länge des gefundenen Pfades. -
avoidMobiles– true schließt X/Y geladene Zeichen aus, außer self, durch Snapshot zu Beginn des Anrufs; Die Höhe dieses Filters wird nicht berücksichtigt. Der Standardwert ist false. Die normale Kundenfreigabeprüfung gilt weiterhin. -
avoidStatics- true schließt eine Zelle mit statischem Eintrag aus, auch wenn dieser befahrbar ist oder sich auf einer anderen Höhe befindet. Der Standardwert ist false. Dabei handelt es sich um einen strengen Filter und nicht nur um ein Verbot unpassierbarer Mauern. -
allowDoors– true ermöglicht einen vorläufigen Pfad durch eine gefundene Türkachel, auch wenn die geschlossene Tür die normale Prüfung nicht besteht. Der Standardwert ist false. Die Tür öffnet sich nicht; Zugang, Z und Durchlässigkeit müssen bei der Ausführung erneut überprüft werden. -
allowDiagonal- true/absent ermöglicht acht Richtungen mit Winkelprüfung; false – nur vier Vorwärtsrichtungen.
Array von [x,y,z]-Datensätzen, jedes Feld ist ein int. [0] des äußeren Arrays ist der Startpunkt; der letzte Eintrag liegt innerhalb der vorgegebenen Solltoleranz. Die Anzahl der Schritte beträgt ArrayLength(Pfad)-1 nur für ein nicht leeres Array. Ein leeres Array [] bedeutet, dass der vollständige gültige Pfad nicht erhalten wurde (Ziel/Karte nicht erreichbar, Einschränkungen oder Suchbeschränkung). Wenn der Startpunkt bereits geeignet ist, wird ein Datensatz zurückgegeben und die Anzahl der Schritte beträgt 0. Der Teilpfad wird nicht zurückgegeben.
- Das Team berechnet nur die Route; Es startet keine Bewegung und öffnet keine Türen. Verwenden Sie zum Ausführen NewMoveXY/MoveXYZ und überprüfen Sie das eigene Ergebnis.
- Die Suche vermeidet Hindernisse, indem benachbarte Züge als gleich teuer angesehen werden. Auf einer konstanten Karte wird der Weg mit der geringsten Anzahl von Schritten gesucht. Die tatsächliche Durchgängigkeit jeder Rippe wird überprüft, einschließlich der Höhe und Einschränkungen der Diagonalen des Kunden.
- UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.
- Im Client wird die Berechnung in Abschnitte von bis zu 32 Knoten aufgeteilt, mit einer Budgetprüfung von etwa 1 ms zwischen den Knoten. Die Stornierung wird zwischen den Portionen überprüft. Das Lesen der Karte bleibt im Spielthread; Es ist kein Versprechen einer festen Lesezeit für einzelne Festplatten.
- Die Karte kann sich nach der Überprüfung ändern: Charaktere bewegen sich, Türen schließen sich, der Server korrigiert die Situation. Das resultierende Array ist ein Plan für verfügbare lokale Daten, keine Serverbestätigung.
- SetBadLocation schließt Zellen aus, SetBadObject schließt Bereiche um geeignete geladene Weltobjekte aus. Es wird ein Snapshot Ihrer Laufzeitlisten zum Zeitpunkt der Anfrage verwendet; Verbote von einem anderen Start werden nicht vererbt. Die Startzelle wird nicht auf Status überprüft: Sie wird durch den aufrufenden Code angegeben. Sie können kein beliebiges Z innerhalb einer Wand als gültige Startposition verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- Die ersten drei Werte sind die ursprünglichen X/Y/Z-Werte; Die nächsten drei sind der Zweck.
- map=WorldNum(), accuracyXY=0, accuracyZ=0 erfordern eine genaue Position. run=false löst kein Gehen aus.
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;Parameter und Ablauf:
- Ziel 1445/1690/20; accuracyXY=1, accuracyZ=2; run=true bleibt ein Kompatibilitätsflag.
- maxSteps=80, maxDistance=30; avoidMobiles=true, avoidStatics=false, allowDoors=true, allowDiagonal=false. Das Array ist möglicherweise leer.
- Der Türabstand ist eine Planungsannahme; Es gibt keine Garantie für Öffnung und Durchgang.
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;Parameter und Ablauf:
- accuracyXY=2/accuracyZ=5 löst den nächstgelegenen geeigneten Punkt auf; maxSteps=100.
- last ist der letzte Eintrag im Plan, nicht die aktuelle Position des Charakters. Das Team bewegt ihn nicht.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)
Parameter: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: 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)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: 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)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: 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)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: 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)
Ergebnis: dynamic / Array.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [GetPathArray3D]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetPathArray3D:CompactGetPathArray3D(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => CompactGetPathArray3D(values)Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetRun();
int UO.GetRun(object? id);Überprüft die Laufflagge in der letzten bekannten Richtung mobile.
-
id– Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse oder die Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel. GetRun hat auch die Form GetRun() für self.
int 1 – geladen mobile hat das Direction.Running-Attribut. int 0 – das Attribut fehlt, das Objekt ist nicht mobile, unbekannt oder gelöscht. Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch Moving().
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
- Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
- Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch Moving().
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetRun("self");
UO.Print("GetRun: " + Convert.ToString(result));Parameter und Ablauf:
- Das Argument self wählt explizit seinen Charakter aus. Zustand – nur 1/0.
- Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch 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));Parameter und Ablauf:
- IsNpc schließt Subjekt und unbekanntes Objekt aus. Das Ziel speichert ein einzelnes serial und keinen Live-Verweis auf ein sich änderndes lasttarget.
- Das Ergebnis bezieht sich auf das Feld Direction.Running. Die Daten werden erst aktualisiert, nachdem der Client den entsprechenden Status erhält.
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;Parameter und Ablauf:
- UO.Wait(500) – Pause in Millisekunden. Anschließend wird separat geprüft, ob mobile noch vorhanden ist.
- Zwei Fotos werden verglichen. Zwischenänderungen können unter Umständen übersehen werden und es handelt sich hierbei nicht um ein fortlaufendes Abonnement von Serverereignissen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
public int GetRun() => bridge.GetRun(bridge.Self);Parameter: id (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetRun. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetRun(InjectionValue id) => bridge.GetRun(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetRunMountTimer();Zeigt das konfigurierte Intervall eines Pferdelaufschritts in Millisekunden an. Nützlich, um den Modus zu überprüfen, das Timing abzuschätzen und die Einstellung zu speichern, bevor Sie vorübergehend langsamer fahren.
Es gibt keine Parameter.
int von 100 bis einschließlich 2000 – konfiguriertes Intervall in Millisekunden. Der Standardwert ist 100. Dies ist die Anzahl, nicht true/false, nicht ID und nicht die Anzahl der durchlaufenen Zellen.
- Die Einstellung gilt für den Fahrmodus. Der standardmäßige und minimal zulässige Wert beträgt 100 ms; die Obergrenze liegt bei 2000 ms. Die anderen drei Modi haben separate Einstellungen.
- Dies ist das lokale Bewegungsintervall des Charakters, nicht Ping, FPS, Pathfinding-Timeout oder gemessene Serverschrittdauer. Eine Erhöhung der Zahl verlangsamt die Bewegung; Eine Verringerung unter das Standardintervall führt nicht zu einer Beschleunigung des Paketversands.
- Das Team selbst setzt sich nicht in Bewegung, besteigt nicht das Reittier und ändert den Geh-/Laufmodus nicht. Der Modus wird während der Fahrt ausgewählt; Der vom Server vorgegebene Geschwindigkeitsmodus und Flug werden vom Client ebenfalls berücksichtigt.
- Die Einstellung ist allgemein für die Bewegung dieses Clients: Sie kann durch manuelle Steuerung, Kartenroute und andere Skripte verwendet werden. Wenn Sie ihn vorübergehend ändern, behalten Sie den vorherigen Wert bei und stellen ihn nach dem Vorgang wieder her. Ändern Sie nicht gleichzeitig einen Modus aus mehreren Verfahren.
- Wende- und Abweichungsschritte unterscheiden sich von normalen Bewegungen. Serverbestätigungen, Kommunikationsverzögerungen und Hindernisse können die tatsächliche Zeit verlängern. Der Client sendet keine Reihe beschleunigter Schritte, um fehlende Frames nachzuholen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetRunMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- UO.GetRunMountTimer() wird ohne Argumente aufgerufen. delayMs – Laufintervall zu Pferd; andere Modi werden hier nicht gemessen.
var delayMs = UO.GetRunMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));Parameter und Ablauf:
- steps=5 ist die Anzahl der auszuwertenden Schritte, kein Befehlsparameter. Die Multiplikation ergibt nur den Beitrag der konfigurierten Verzögerungen; Es handelt sich nicht um eine Zusage der Ankunftszeit oder eine Zeitüberschreitung der Route.
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;
}Parameter und Ablauf:
- vorherige wird mit 100 ms verglichen. Das Standardintervall ist eingestellt, die anderen drei Modi sind gespeichert. Der Charakter weicht der Herausforderung selbst nicht aus.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
case "getrunmounttimer": return new InjectionValue(state.RunMountTimer);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetRunUnMountTimer();Zeigt das konfigurierte Intervall eines Gehschritts in Millisekunden an. Nützlich, um den Modus zu überprüfen, das Timing abzuschätzen und die Einstellung zu speichern, bevor Sie vorübergehend langsamer fahren.
Es gibt keine Parameter.
int von 200 bis einschließlich 2000 – konfiguriertes Intervall in Millisekunden. Der Standardwert ist 200. Dies ist die Anzahl, nicht true/false, nicht ID und nicht die Anzahl der durchlaufenen Zellen.
- Die Einstellung gilt für den Gehmodus. Der standardmäßige und minimal zulässige Wert beträgt 200 ms; die Obergrenze liegt bei 2000 ms. Die anderen drei Modi haben separate Einstellungen.
- Dies ist das lokale Bewegungsintervall des Charakters, nicht Ping, FPS, Pathfinding-Timeout oder gemessene Serverschrittdauer. Eine Erhöhung der Zahl verlangsamt die Bewegung; Eine Verringerung unter das Standardintervall führt nicht zu einer Beschleunigung des Paketversands.
- Das Team selbst setzt sich nicht in Bewegung, besteigt nicht das Reittier und ändert den Geh-/Laufmodus nicht. Der Modus wird während der Fahrt ausgewählt; Der vom Server vorgegebene Geschwindigkeitsmodus und Flug werden vom Client ebenfalls berücksichtigt.
- Die Einstellung ist allgemein für die Bewegung dieses Clients: Sie kann durch manuelle Steuerung, Kartenroute und andere Skripte verwendet werden. Wenn Sie ihn vorübergehend ändern, behalten Sie den vorherigen Wert bei und stellen ihn nach dem Vorgang wieder her. Ändern Sie nicht gleichzeitig einen Modus aus mehreren Verfahren.
- Wende- und Abweichungsschritte unterscheiden sich von normalen Bewegungen. Serverbestätigungen, Kommunikationsverzögerungen und Hindernisse können die tatsächliche Zeit verlängern. Der Client sendet keine Reihe beschleunigter Schritte, um fehlende Frames nachzuholen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetRunUnMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- UO.GetRunUnmountTimer() wird ohne Argumente aufgerufen. delayMs – Intervall des Laufens zu Fuß; andere Modi werden hier nicht gemessen.
var delayMs = UO.GetRunUnMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));Parameter und Ablauf:
- steps=5 ist die Anzahl der auszuwertenden Schritte, kein Befehlsparameter. Die Multiplikation ergibt nur den Beitrag der konfigurierten Verzögerungen; Es handelt sich nicht um eine Zusage der Ankunftszeit oder eine Zeitüberschreitung der Route.
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;
}Parameter und Ablauf:
- vorherige wird mit 200 ms verglichen. Das Standardintervall ist eingestellt, die anderen drei Modi sind gespeichert. Der Charakter weicht der Herausforderung selbst nicht aus.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
case "getrununmounttimer": return new InjectionValue(state.RunUnmountTimer);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWalkMountTimer();Zeigt das konfigurierte Intervall eines Schrittes beim Pferderücken in Millisekunden an. Nützlich, um den Modus zu überprüfen, das Timing abzuschätzen und die Einstellung zu speichern, bevor Sie vorübergehend langsamer fahren.
Es gibt keine Parameter.
int von 200 bis einschließlich 2000 – konfiguriertes Intervall in Millisekunden. Der Standardwert ist 200. Dies ist die Anzahl, nicht true/false, nicht ID und nicht die Anzahl der durchlaufenen Zellen.
- Die Einstellung gilt für den Fahrmodus. Der standardmäßige und minimal zulässige Wert beträgt 200 ms; die Obergrenze liegt bei 2000 ms. Die anderen drei Modi haben separate Einstellungen.
- Dies ist das lokale Bewegungsintervall des Charakters, nicht Ping, FPS, Pathfinding-Timeout oder gemessene Serverschrittdauer. Eine Erhöhung der Zahl verlangsamt die Bewegung; Eine Verringerung unter das Standardintervall führt nicht zu einer Beschleunigung des Paketversands.
- Das Team selbst setzt sich nicht in Bewegung, besteigt nicht das Reittier und ändert den Geh-/Laufmodus nicht. Der Modus wird während der Fahrt ausgewählt; Der vom Server vorgegebene Geschwindigkeitsmodus und Flug werden vom Client ebenfalls berücksichtigt.
- Die Einstellung ist allgemein für die Bewegung dieses Clients: Sie kann durch manuelle Steuerung, Kartenroute und andere Skripte verwendet werden. Wenn Sie ihn vorübergehend ändern, behalten Sie den vorherigen Wert bei und stellen ihn nach dem Vorgang wieder her. Ändern Sie nicht gleichzeitig einen Modus aus mehreren Verfahren.
- Wende- und Abweichungsschritte unterscheiden sich von normalen Bewegungen. Serverbestätigungen, Kommunikationsverzögerungen und Hindernisse können die tatsächliche Zeit verlängern. Der Client sendet keine Reihe beschleunigter Schritte, um fehlende Frames nachzuholen.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetWalkMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- UO.GetWalkMountTimer() wird ohne Argumente aufgerufen. delayMs – Intervall des Gehens zu Pferd; andere Modi werden hier nicht gemessen.
var delayMs = UO.GetWalkMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));Parameter und Ablauf:
- steps=5 ist die Anzahl der auszuwertenden Schritte, kein Befehlsparameter. Die Multiplikation ergibt nur den Beitrag der konfigurierten Verzögerungen; Es handelt sich nicht um eine Zusage der Ankunftszeit oder eine Zeitüberschreitung der Route.
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;
}Parameter und Ablauf:
- vorherige wird mit 200 ms verglichen. Das Standardintervall ist eingestellt, die anderen drei Modi sind gespeichert. Der Charakter weicht der Herausforderung selbst nicht aus.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
case "getwalkmounttimer": return new InjectionValue(state.WalkMountTimer);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWalkUnmountTimer();Zeigt das konfigurierte Intervall eines Gehschritts in Millisekunden an. Nützlich, um den Modus zu überprüfen, das Timing abzuschätzen und die Einstellung zu speichern, bevor Sie vorübergehend langsamer fahren.
Es gibt keine Parameter.
int von 400 bis einschließlich 2000 – konfiguriertes Intervall in Millisekunden. Der Standardwert ist 400. Dies ist die Anzahl, nicht true/false, nicht ID und nicht die Anzahl der durchlaufenen Zellen.
- Die Einstellung gilt für den Gehmodus. Der standardmäßige und minimal zulässige Wert beträgt 400 ms; die Obergrenze liegt bei 2000 ms. Die anderen drei Modi haben separate Einstellungen.
- Dies ist das lokale Bewegungsintervall des Charakters, nicht Ping, FPS, Pathfinding-Timeout oder gemessene Serverschrittdauer. Eine Erhöhung der Zahl verlangsamt die Bewegung; Eine Verringerung unter das Standardintervall führt nicht zu einer Beschleunigung des Paketversands.
- Das Team selbst setzt sich nicht in Bewegung, besteigt nicht das Reittier und ändert den Geh-/Laufmodus nicht. Der Modus wird während der Fahrt ausgewählt; Der vom Server vorgegebene Geschwindigkeitsmodus und Flug werden vom Client ebenfalls berücksichtigt.
- Die Einstellung ist allgemein für die Bewegung dieses Clients: Sie kann durch manuelle Steuerung, Kartenroute und andere Skripte verwendet werden. Wenn Sie ihn vorübergehend ändern, behalten Sie den vorherigen Wert bei und stellen ihn nach dem Vorgang wieder her. Ändern Sie nicht gleichzeitig einen Modus aus mehreren Verfahren.
- Wende- und Abweichungsschritte unterscheiden sich von normalen Bewegungen. Serverbestätigungen, Kommunikationsverzögerungen und Hindernisse können die tatsächliche Zeit verlängern. Der Client sendet keine Reihe beschleunigter Schritte, um fehlende Frames nachzuholen.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetWalkUnmountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- UO.GetWalkUnmountTimer() wird ohne Argumente aufgerufen. delayMs – Gehintervall; andere Modi werden hier nicht gemessen.
var delayMs = UO.GetWalkUnmountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));Parameter und Ablauf:
- steps=5 ist die Anzahl der auszuwertenden Schritte, kein Befehlsparameter. Die Multiplikation ergibt nur den Beitrag der konfigurierten Verzögerungen; Es handelt sich nicht um eine Zusage der Ankunftszeit oder eine Zeitüberschreitung der Route.
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;
}Parameter und Ablauf:
- vorherige wird mit 400 ms verglichen. Das Standardintervall ist eingestellt, die anderen drei Modi sind gespeichert. Der Charakter weicht der Herausforderung selbst nicht aus.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
case "getwalkunmounttimer": return new InjectionValue(state.WalkUnmountTimer);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsMoving();Überprüft die Bewegung Ihres Charakters.
Es gibt keine Parameter.
int bool (1/0): 1 – automatischer Pathfinder ist aktiv oder es gibt noch Schritte in der Warteschlange des Charakters; 0 – beide fehlen oder das Zeichen ist nicht geladen. Dies ist keine Bestätigung über das Erreichen eines Ziels oder die Anzahl der Schritte.
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.IsMoving();
UO.Print("IsMoving: " + Convert.ToString(result));Parameter und Ablauf:
- Leere Klammern lauten self. aktiv – Nummer 1 oder 0; Der Nachrichtentext dient als Beispiel für die Verzweigungsverarbeitung.
- 1 – der automatische Pathfinder ist aktiv oder es befinden sich noch Schritte in der Warteschlange des Charakters; 0 – beide fehlen oder das Zeichen ist nicht geladen. Dies ist keine Bestätigung über das Erreichen eines Ziels oder die Anzahl der Schritte.
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;Parameter und Ablauf:
- Der Befehl hat kein Objektargument: Auch nach Exists(self) liest er nur seinen eigenen Zustand.
- Exists(self) prüft die Auslastung des Spielers getrennt von der angeforderten Flagge. Zwischen den Schecks kann sich die Welt verändern.
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;Parameter und Ablauf:
- Die beiden Aufrufe ohne Argumente lauten self; UO.Wait(500) – eine halbe Sekunde pausieren.
- Es werden zwei Flag-Snapshots verglichen. Übergänge zwischen den Aufnahmen können übersprungen werden; Es handelt sich nicht um ein Abonnement für alle Serverereignisse.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.IsMoving. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMoving:bridge.IsMoving().
Interner Implementierungscode; kein eigenständiges Skript.
public int IsMoving() => bridge.IsMoving();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsRunning(object? objID);Überprüft die Laufflagge in der letzten bekannten Richtung mobile.
-
objID– Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse oder Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel. Das Argument ist erforderlich; Bestehen Sie für sich selbst self.
int 1 – geladen mobile hat das Direction.Running-Attribut. int 0 – das Attribut fehlt, das Objekt ist nicht mobile, unbekannt oder gelöscht. Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch Moving().
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
- Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
- Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch Moving().
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.IsRunning("self");
UO.Print("IsRunning: " + Convert.ToString(result));Parameter und Ablauf:
- Das Argument self wählt explizit seinen Charakter aus. Zustand – nur 1/0.
- Die letzte laufende Flagge kann nach dem Stoppen beibehalten werden. Hierbei handelt es sich nicht um die Aktivität der Route, nicht um die Geschwindigkeit oder die Anzahl der verbleibenden Schritte. Um self zu verschieben, verwenden Sie auch 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));Parameter und Ablauf:
- IsNpc schließt Subjekt und unbekanntes Objekt aus. Das Ziel speichert ein einzelnes serial und keinen Live-Verweis auf ein sich änderndes lasttarget.
- Das Ergebnis bezieht sich auf das Feld Direction.Running. Die Daten werden erst aktualisiert, nachdem der Client den entsprechenden Status erhält.
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;Parameter und Ablauf:
- UO.Wait(500) – Pause in Millisekunden. Anschließend wird separat geprüft, ob mobile noch vorhanden ist.
- Zwei Fotos werden verglichen. Zwischenänderungen können unter Umständen übersehen werden und es handelt sich hierbei nicht um ein fortlaufendes Abonnement von Serverereignissen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: objID (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetRun:bridge.GetRun(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "isrunning": return new InjectionValue(bridge.GetRun(Arg(0, bridge.Self)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastStepQUsedDoor();
dynamic UO.LastStepQUsedDoor(object? value);Liest oder ändert manuell das Flag für den Türöffnungsversuch des letzten StepQ-Befehls.
-
value– Optionale Ganzzahl. Genau diese Zahl wird mit dem Argument gespeichert; Ohne Argument wird der Lesevorgang durchgeführt.
int – gespeicherte Markierung. Das übliche StepQ setzt es auf 0 zurück und zeichnet, wenn moveOpenDoor aktiviert ist, das Ergebnis von TryOpenDoorForStep auf: 1, wenn ein Versuch erkannt wird, andernfalls 0. Das manuelle Formular erlaubt andere Nummern. Dies ist keine serial-Tür oder Bestätigung ihrer Öffnung.
- Die Prüfung liest den Türstatus nicht vom Server. Der Fallback-Aufruf OpenDoor verändert die Nullmarke nicht.
- Wenn StepQ aufgrund der Verbindung/Ausdauer vorzeitig fehlschlägt, ist der Reset noch nicht durchgeführt, sodass der vorherige Wert möglicherweise bestehen bleibt.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.LastStepQUsedDoor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Ohne Argumente wird die gespeicherte Nummer gelesen.
- Verwenden Sie es nicht wie ID für UseObject.
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));Parameter und Ablauf:
- value=0 löscht die vorherige Markierung. Richtung=2 — E; run=false.
- Das StepQ-Ergebnis und die Türmarke haben unterschiedliche Bedeutungen.
return RunScenario();
object? RunScenario()
{
UO.LastStepQUsedDoor(0);
var status = UO.StepQ(2, false);
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
return null;
}Parameter und Ablauf:
- previous – gespeicherter Wert.
- Bei der manuellen Wiederherstellung wird keine Aktion an der Tür ausgeführt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "laststepquseddoor":
if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);
return new InjectionValue(state.LastStepUsedDoor);Parameter: value (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "laststepquseddoor":
if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);
return new InjectionValue(state.LastStepUsedDoor);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Move();Liest, ob es eine automatische Route oder noch nicht abgeschlossene Zeichenschritte gibt.
Es gibt keine Parameter.
int 1 – Pathfinder ist aktiv oder Schritte verbleiben in der Charakteranimationswarteschlange; 0 – beide fehlen oder das Zeichen ist nicht geladen. Dies ist nicht die Anzahl der Schritte, das Ergebnis des Erreichens eines früheren Ziels oder ein Zeichen dafür, dass man die Maus hält.
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Der Befehl liest nur den Status. Wenn das Ergebnis ungleich Null ist, wird der kompatible Timer TicksAnim aktualisiert. Per Maus/Tasten angeforderte Schritte werden auch gezählt, solange sie in der Warteschlange verbleiben.
- Um die automatische Route zu stoppen, verwenden Sie MoverStop. MoveOff steuert andere Tastaturschritte.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Move();
UO.Print("Move: " + Convert.ToString(result));Parameter und Ablauf:
- Es gibt keine Argumente.
- 0 beweist nicht, dass das Ziel erreicht wurde: Die Route hätte abgebrochen werden können.
UO.Print("Movement active or queued: " + Convert.ToString(UO.Move()));Parameter und Ablauf:
- 100 wartet über 50 ms und legt den ungefähren Grenzwert von 5 Sekunden fest.
- Durch die Durchführung dieser Prüfung wird die Bewegung selbst nicht gestartet oder gestoppt.
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;Parameter und Ablauf:
- Move() prüft auf Aktivität, MoverStop() entfernt die Route.
- Bereits gesendete Pakete können weiterhin vom Server bestätigt werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Move. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Move:bridge.Move(). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
Interner Implementierungscode; kein eigenständiges Skript.
public int Move()
{
int result = bridge.Move();
if (result != 0)
ticksAnim = Timer();
return result;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.MoveOff();Deaktiviert kompatible PMove-Schlüsselschritte.
Es gibt keine Parameter.
void – kein Rückgabewert. Rufen Sie eine separate Leitung an; es ist nicht true/false oder die Anzahl der Schritte.
- Ändert das Flag MoveEnabled im Laufzeitzustand. Dies ist keine universelle Zeichensperre: NewMoveXY, MoveXYZ, Step und die Maus werden nicht von diesem Flag gesteuert.
- MoveOff stoppt einen bereits laufenden Pathfinder nicht; es erfordert MoverStop.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.MoveOff");
UO.MoveOff();Parameter und Ablauf:
- Es gibt keine Argumente.
- Das PMove-Flag wird ohne Rückgabewert geändert.
UO.MoveOff();Parameter und Ablauf:
- MoveOn ermöglicht wichtige Schritte vor PMove; MoveOff schaltet sich nach dem normalen Abschluss aus.
- Dies sind sequentielle Befehle; Eine deaktivierte Flagge bedeutet nicht für alle Verfahren einen Notstopp.
return RunScenario();
object? RunScenario()
{
UO.MoveOn();
UO.PMove(UO.GetX() + 1, UO.GetY());
UO.MoveOff();
return null;
}Parameter und Ablauf:
- Die beiden Teams steuern unterschiedliche Bewegungsmechanismen.
- Move() liest die automatische Route; Betrachten Sie es nicht als Test von 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.MoveOff. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnableMove:bridge.EnableMove(false).
Interner Implementierungscode; kein eigenständiges Skript.
public void MoveOff() => bridge.EnableMove(false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.MoveOn();Ermöglicht kompatible PMove-Schlüsselschritte.
Es gibt keine Parameter.
void – kein Rückgabewert. Rufen Sie eine separate Leitung an; es ist nicht true/false oder die Anzahl der Schritte.
- Ändert das Flag MoveEnabled im Laufzeitzustand. Dies ist keine universelle Zeichensperre: NewMoveXY, MoveXYZ, Step und die Maus werden nicht von diesem Flag gesteuert.
- MoveOff stoppt einen bereits laufenden Pathfinder nicht; es erfordert MoverStop.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.MoveOn");
UO.MoveOn();Parameter und Ablauf:
- Es gibt keine Argumente.
- Das PMove-Flag wird ohne Rückgabewert geändert.
UO.MoveOn();Parameter und Ablauf:
- MoveOn ermöglicht wichtige Schritte vor PMove; MoveOff schaltet sich nach dem normalen Abschluss aus.
- Dies sind sequentielle Befehle; Eine deaktivierte Flagge bedeutet nicht für alle Verfahren einen Notstopp.
return RunScenario();
object? RunScenario()
{
UO.MoveOn();
UO.PMove(UO.GetX() + 1, UO.GetY());
UO.MoveOff();
return null;
}Parameter und Ablauf:
- MoveOn aktiviert kompatible PMove-Schlüsselschritte und gibt keinen Wert zurück. Das Ergebnis der Bewegung wird anhand der Koordinaten überprüft; MoveOn steuert nicht alle Bewegungsmodi.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.MoveOn. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnableMove:bridge.EnableMove(true).
Interner Implementierungscode; kein eigenständiges Skript.
public void MoveOn() => bridge.EnableMove(true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.MoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running);Verschiebt das Zeichen mit fünf erforderlichen Parametern nach X/Y und wartet auf das Ergebnis.
-
xdst– Weltkoordinate X des Ziels, 0..65535. Dies ist nicht serial oder eine Position innerhalb eines Gumps. -
ydst– Welt-Y-Koordinate des Ziels, 0..65535. -
optimized- true – normaler Such- und Überprüfungsmodus für den Weg vorwärts; false – reduzierte Heuristik und Überprüfung des nächsten Schritts. false deaktiviert die Hindernisvermeidung nicht. -
accuracy– Toleranz für X und Y in Zellen: Beide Abweichungen müssen hineinpassen. Der Wert ist auf den Bereich 0..20 begrenzt; 0 erfordert präzises X/Y. -
running– true/1 – Anforderung ausführen, false/0 – Schritt. Es bestehen weiterhin Verzögerungen bei der Serverbewegung. Es ist kein Geschwindigkeitsmultiplikator.
int 1 – am Ende der Prüfung befindet sich der Charakter in der vorgegebenen Toleranz X/Y/Z, auch wenn er bereits vor der Herausforderung dort war. int 0 – ungültige Koordinaten, Startfehler, nicht erreichter Punkt oder ausgelöste Stoppbedingung. Es kommt nicht auf die Anzahl der Schritte oder serial an; Im Falle einer Notfallstornierung wird der Vorgang abgebrochen, anstatt normal zurückzukehren 0.
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Die vollständige A*-Route wird vor dem ersten Schritt in kurzen Abschnitten zwischen Client-Updates erstellt. Bei Optimized=true werden die nächsten 4 Zellen des Pfades überprüft; wenn false der nächste Schritt ist. Hierbei handelt es sich um eine Überprüfung des bereits berechneten Pfades und nicht der Entfernung der gesamten Route und nicht der Umleitungsregler beim Bewegen der Maus.
- Serverausfall DenyWalk oder ein neues Hindernis erfordert eine Neuberechnung von der aktuellen Position nach Abschluss der Schrittwarteschlange. Die Anzahl der Wiederholungen und die Häufigkeit der Neuberechnung sind begrenzt; Kein Weg darf die Bewegung mit 0 beenden.
- Die Route gehört zu der Prozedur, die sie gestartet hat: Ihr Notstopp bricht den verbleibenden automatischen Pfad ab. Wenn die Route bereits durch einen anderen Lauf oder Benutzer ersetzt wurde, hat die Stornierung des vorherigen Eigentümers keine Auswirkungen auf die neue Route. Bereits gesendete Schritte werden nicht zurückgerufen.
- SetBadLocation und SetBadObject werden beim Start der Route als Momentaufnahme der Verbote der aktuellen Laufzeit verwendet. Sie werden bei der internen Neuberechnung gespeichert. Das Ändern oder Löschen von Listen wirkt sich auf die nächste Route aus, anstatt eine bereits laufende Route zu überschreiben.
- UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.
- Die Zeitüberschreitung wird gezählt, nachdem die Anfrage angenommen wurde, und umfasst nachfolgende Teile der Suche und Neuberechnung. stopOnStuck betrachtet eine laufende Suche nicht als steckengebliebenes Zeichen; Nach Abschluss der Planung werden keine Positionsänderungen mehr berücksichtigt. Das abschließende 1/0 überprüft die tatsächlichen Koordinaten, nicht nur die Bereitschaft des Pfades.
- Das Ergebnis berücksichtigt die lokale Position des Kunden; Eine nachträgliche Serverkorrektur ist weiterhin möglich. Das Ausführen konkurrierender Bewegungsbefehle aus verschiedenen Routinen verändert die Gesamtroute des Charakters.
- Die Einstellungen moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost und moveBetweenTwoCorners wirken sich auf die Leistung aus. Explizites avoidMobiles/openDoors überschreibt die entsprechenden Werte für diesen Aufruf.
- Das Ergebnis 0 gibt keinen Aufschluss über die genaue Ursache. Überprüfen Sie Koordinaten, Verbindung, Ausdauer und Protokoll. Wiederholen Sie die Bewegung nicht endlos ohne UO.Wait und eine Begrenzung der Versuche.
- Beim Aufruf wird das Ziel Z übernommen, Toleranz Z=255. Für zusätzliche Einschränkungen verwenden Sie NewMoveXY; um die Höhe auszuwählen - MoveXYZ.
- Die Hauptbrücke zeichnet die Anfragenummer, Spieler-/Pathfinder-/Karteninstanzen und den Kartenindex auf. Eine neue Anfrage, Kontextänderung oder endgültige Ablehnung ergibt 0; Die Prüfung wird nach dem Auslesen der Koordinaten und dem letzten Rückruf wiederholt. Timeout, maxSteps und Callback=0 stoppen nur die gespeicherte Anfrage, keine neue fremde Route. Vorübergehend gesperrt, während die Wiederherstellung noch aktiv ist, der Ballbesitz nicht verloren geht: Das Warten geht weiter. Für externe Legacy-Bridges ohne IApiMovementOwnershipBridge bleibt der bisherige kompatible Mechanismus erhalten.
- Der allgemeine Pathfinder speichert bis zu 8 temporäre X/Y/Z-Richtungsverbote für 2000 ms, nur bei abgelehnter Bewegung der entsprechenden aktiven Anfrage. Rotation, unbekannte Reihenfolge, Resynchronisation und Alt-/Fremdanfrage begründen kein solches Verbot. Durch eine neue externe Anfrage und den Verlust des Karten-/Spielerkontexts werden sie gelöscht. Die Suche nach geladener Geometrie versucht, den Übergang zu umgehen; Es geht darum, nicht alle Serverhindernisse zu kennen. Ohne die X/Y/Z des Spielers zu ändern, sind bis zu 8 interne Neuberechnungen mit einer Pause von mindestens 40 ms zulässig. Es gibt keinen vollständigen Weg oder dieses Budget ist erschöpft – die Route endet. Die Koordinatenaufgabe wird dann abgeschlossen, nachdem die übermittelten Schritte verarbeitet wurden. mobile-Follow versucht es aufgrund der Verzögerung möglicherweise erneut.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Xdst – zwei Zellen östlich; Ydst ändert sich nicht.
- Optimiert=true, Genauigkeit=0, Betrieb=false. Der Aufruf gibt das Ergebnis zurück, wenn er abgeschlossen ist.
var ok = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(Convert.ToString(ok));Parameter und Ablauf:
- Xdst/Ydst werden vom ausgewählten Objekt gelesen; Es muss ein Objekt der Welt sein, kein Objekt innerhalb des Containers.
- Genauigkeit=1 ermöglicht es Ihnen, näher heranzukommen; Laufen=true. Höhen sind nicht auf diese Herausforderung beschränkt.
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;Parameter und Ablauf:
- Ersetzen Sie das Ziel 1445/1690 durch Ihr eigenes. Der Ausdauerschwellenwert wird durch eine separate Einstellung festgelegt, nicht durch den sechsten MoveXY-Parameter.
- Nach einer normalen Rückgabe wird der ursprüngliche Wert wiederhergestellt. Bei einem Abbruch werden keine weiteren Zeilen ausgeführt.
Mindestschrittintervall: Gehen – Gehen 400 ms, Laufen 200 ms; Reiten - Gehen 200 ms, Laufen 100 ms.
Hierbei handelt es sich um Standard-Client-Limits und nicht um automatisch definierte Einstellungen für Ihren Shard. Servergeschwindigkeit und Flugmodi werden separat gezählt. Skript-Timer können die Bewegung verlangsamen, verringern diese Grenzwerte jedoch nicht.
Schritte, Routen, Follow, Maus-/Tastensteuerung und Karte nutzen die gemeinsame Warteschlange des Charakters. Durch das Ersetzen der Route, das Abbiegen oder das Anpassen der Position durch den Server wird die verbleibende Pause nach der Schrittanforderung nicht aufgehoben. Nach der Verzögerung gibt es keinen schnellen Burst, um die verlorenen Frames auszugleichen. Das Warten auf eine Bestätigung, Hindernisse und schlechte Kommunikation können die Bewegung verlangsamen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::MoveTo:MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "movexy":
return new InjectionValue(MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles, object? openDoors);Verschiebt den Charakter an einen Punkt in der Welt mit separaten horizontalen und vertikalen Toleranzen.
-
x– Erforderlicher int: die Welt-X-Koordinate des Ziels, 0..65535, auf der aktuellen Karte. Nicht die Gumpkoordinate. -
y– Erforderlicher int: die Welt-Y-Koordinate des Ziels, 0..65535, auf der aktuellen Karte. -
z– Erforderlicher int: Zielwelthöhe -128..127. Dies ist die Oberflächenhöhe, nicht die Stockwerksnummer. -
accuracyXY– Erforderlicher int. Toleranz für X und Y in Zellen: Beide Abweichungen müssen hineinpassen. Der Wert ist auf den Bereich 0..20 begrenzt; 0 erfordert präzises X/Y. -
accuracyZ– Erforderlicher int. Höhentoleranz: abs (tatsächliches Z – erforderliches Z), begrenzt durch 0..255. Null erfordert eine genaue Höhe; 255 deaktiviert praktisch die Z-Grenze. -
running– Obligatorisches boolesches Flag. true/1 – Anforderung ausführen, false/0 – Schritt. Es bestehen weiterhin Verzögerungen bei der Serverbewegung. Es ist kein Geschwindigkeitsmultiplikator. -
timeout– Optionales Wartelimit in Millisekunden; ein fehlendes Argument, 0 und ein negativer Wert weisen auf das Fehlen dieser zusätzlichen Grenze hin. Der Countdown beginnt, nachdem die Route zur Ausführung angenommen wurde; Dies stellt keine feste Begrenzung der Dauer des gesamten Anrufs sowie der Routenvorbereitung dar. -
maxSteps– Optionaler Grenzwert der beobachteten Positionsänderungen, nicht der Netzwerkpakete. 0/negativ/abwesend – ohne diese Begrenzung. Zwischen den Umfragen können mehrere Schritte liegen, daher handelt es sich hierbei nicht um einen genauen Zellenzähler. -
avoidMobiles– Optionales Flag: true verhindert die Weitergabe der berücksichtigten Zeichen; false erlaubt den Versuch. Ohne Argument wird moveThroughNPC verwendet. Der Server verweigert möglicherweise weiterhin den Zugriff. -
openDoors– Optionale Flagge zum Öffnen von Türen unterwegs. Ohne Argument wird moveOpenDoor verwendet; true bietet keinen Zugang zu verschlossenen Türen.
int 1 – am Ende der Prüfung befindet sich der Charakter in der vorgegebenen Toleranz X/Y/Z, auch wenn er bereits vor der Herausforderung dort war. int 0 – ungültige Koordinaten, Startfehler, nicht erreichter Punkt oder ausgelöste Stoppbedingung. Es kommt nicht auf die Anzahl der Schritte oder serial an; Im Falle einer Notfallstornierung wird der Vorgang abgebrochen, anstatt normal zurückzukehren 0.
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- So funktioniert es, Schritt 1: prüft Koordinaten, konfigurierte Verbindung und Ausdauerbedingungen. Wenn sich das Zeichen bereits innerhalb von accuracyXY und accuracyZ befindet, wird sofort 1 ohne neue Route zurückgegeben.
- Schritt 2: Erstellt eine Route auf der aktuellen Karte unter Berücksichtigung der Oberflächenhöhe, Hindernisse und ausgewählter Durchgangsbedingungen. Der optimierte Modus wird hier im Befehl aktiviert; Es ist nicht erforderlich, einen solchen Parameter an MoveXYZ zu übergeben.
- Schritt 3: Beginnt mit dem Gehen oder Laufen entlang der Route und wartet auf das Ergebnis im aktuellen Vorgang. Die Zeile nach dem Aufruf wird nach Abschluss ausgeführt. Die Client-Schnittstelle funktioniert weiterhin.
- Schritt 4: Wenn ein Schritt fehlschlägt oder ein neues Hindernis auftritt, kann der Client die Route von der aktuellen Position aus neu berechnen. Die Versuche sind begrenzt. Wenn eine Zeitüberschreitung auftritt oder die Grenze der beobachtbaren Bewegungen über das Ziel hinaus erreicht wird, stoppt die Bewegung mit 0.
- Schritt 5: Nachdem die Bewegung beendet ist, wird das tatsächliche X/Y/Z des Kunden mit dem Ziel verglichen. Sowohl abs(X-x)<=accuracyXY, abs(Y-y)<=accuracyXY als auch abs(Z-z)<=accuracyZ sind erforderlich. Beispielsweise sind für das Ziel 1279/540/20 mit den Toleranzen 1 und 2 X=1278..1280, Y=539..541 geeignet, Z=18..22.
- Die Minimalform enthält sechs Argumente: UO.MoveXYZ(1279,540,20,1,2,true). Weitere Argumente werden rechts im Bestell-Timeout hinzugefügt, maxSteps, avoidMobiles, openDoors. Um openDoors anzugeben, müssen auch die vorherigen Positionen übergeben werden; Leerzeichen zwischen Kommas werden nicht unterstützt.
- Unterschied zu NewMoveXY: MoveXYZ übernimmt die Zielhöhe als drittes Argument. NewMoveXY hat ein drittes Argument von Optimized; Dort kann man keine Höhe übertragen. MoveXYZ verfügt in dieser Laufzeit über keinen Rückruf.
- Die Route gehört zu der Prozedur, die sie gestartet hat: Ihr Notstopp bricht den verbleibenden automatischen Pfad ab. Wenn die Route bereits durch einen anderen Lauf oder Benutzer ersetzt wurde, hat die Stornierung des vorherigen Eigentümers keine Auswirkungen auf die neue Route. Bereits gesendete Schritte werden nicht zurückgerufen.
- SetBadLocation und SetBadObject werden beim Start der Route als Momentaufnahme der Verbote der aktuellen Laufzeit verwendet. Sie werden bei der internen Neuberechnung gespeichert. Das Ändern oder Löschen von Listen wirkt sich auf die nächste Route aus, anstatt eine bereits laufende Route zu überschreiben.
- UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.
- Die Zeitüberschreitung wird gezählt, nachdem die Anfrage angenommen wurde, und umfasst nachfolgende Teile der Suche und Neuberechnung. stopOnStuck betrachtet eine laufende Suche nicht als steckengebliebenes Zeichen; Nach Abschluss der Planung werden keine Positionsänderungen mehr berücksichtigt. Das abschließende 1/0 überprüft die tatsächlichen Koordinaten, nicht nur die Bereitschaft des Pfades.
- Das Ergebnis berücksichtigt die lokale Position des Kunden; Eine nachträgliche Serverkorrektur ist weiterhin möglich. Das Ausführen konkurrierender Bewegungsbefehle aus verschiedenen Routinen verändert die Gesamtroute des Charakters.
- Die Einstellungen moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost und moveBetweenTwoCorners wirken sich auf die Leistung aus. Explizites avoidMobiles/openDoors überschreibt die entsprechenden Werte für diesen Aufruf.
- Das Ergebnis 0 gibt keinen Aufschluss über die genaue Ursache. Überprüfen Sie Koordinaten, Verbindung, Ausdauer und Protokoll. Wiederholen Sie die Bewegung nicht endlos ohne UO.Wait und eine Begrenzung der Versuche.
- Die Hauptbrücke zeichnet die Anfragenummer, Spieler-/Pathfinder-/Karteninstanzen und den Kartenindex auf. Eine neue Anfrage, Kontextänderung oder endgültige Ablehnung ergibt 0; Die Prüfung wird nach dem Auslesen der Koordinaten und dem letzten Rückruf wiederholt. Timeout, maxSteps und Callback=0 stoppen nur die gespeicherte Anfrage, keine neue fremde Route. Vorübergehend gesperrt, während die Wiederherstellung noch aktiv ist, der Ballbesitz nicht verloren geht: Das Warten geht weiter. Für externe Legacy-Bridges ohne IApiMovementOwnershipBridge bleibt der bisherige kompatible Mechanismus erhalten.
- Der allgemeine Pathfinder speichert bis zu 8 temporäre X/Y/Z-Richtungsverbote für 2000 ms, nur bei abgelehnter Bewegung der entsprechenden aktiven Anfrage. Rotation, unbekannte Reihenfolge, Resynchronisation und Alt-/Fremdanfrage begründen kein solches Verbot. Durch eine neue externe Anfrage und den Verlust des Karten-/Spielerkontexts werden sie gelöscht. Die Suche nach geladener Geometrie versucht, den Übergang zu umgehen; Es geht darum, nicht alle Serverhindernisse zu kennen. Ohne die X/Y/Z des Spielers zu ändern, sind bis zu 8 interne Neuberechnungen mit einer Pause von mindestens 40 ms zulässig. Es gibt keinen vollständigen Weg oder dieses Budget ist erschöpft – die Route endet. Die Koordinatenaufgabe wird dann abgeschlossen, nachdem die übermittelten Schritte verarbeitet wurden. mobile-Follow versucht es aufgrund der Verzögerung möglicherweise erneut.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print("MoveXYZ: " + Convert.ToString(result));Parameter und Ablauf:
- x/y/z ist der Zielpunkt. accuracyXY=0 und accuracyZ=0 erfordern eine genaue Position.
- running=false – Gehen. Wenn die angrenzende Fläche eine andere Höhe hat, kann das Ergebnis 0 sein.
var ok = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print(Convert.ToString(ok));Parameter und Ablauf:
- Vorbereitung: Der Charakter muss im Spiel sein und der Punkt muss auf der aktuellen Karte vorhanden sein. 1279/540/20 sind Trainingskoordinaten: Ersetzen Sie sie durch Ihren verfügbaren Punkt, einschließlich der tatsächlichen Höhe der Oberfläche.
-
- destinationX=1279 ist das erste Argument, die X-Weltkoordinate des Ziels.
-
- destinationY=540 ist das zweite Argument, die Y-Weltkoordinate des Ziels.
-
- destinationZ=20 – drittes Argument, Höhe. Das Team muss einen Durchgang oder eine Treppe finden; Der Wert 20 allein überträgt sich nicht auf den Boden.
-
- Mit accuracyXY=1 können Sie innerhalb einer Zelle entlang jeder horizontalen Koordinate enden. Auch die diagonal angrenzende Zelle ist geeignet.
-
- accuracyZ=2 ermöglicht Höhen von 18 bis einschließlich 22. Ein X/Y-Match auf einer anderen Etage reicht für den Erfolg nicht aus.
-
- running=true Anfragen werden ausgeführt. Ersetzen Sie zum Gehen „true“ durch „false“.
-
- timeout=8000 begrenzt die Wartezeit nach dem Start der Route auf acht Sekunden. Nach dieser Zeit, während die Bewegung noch läuft, stoppt der Befehl sie und gibt 0 zurück.
-
- maxSteps=100 begrenzt die Anzahl der beobachteten Positionsänderungen. Dies ist nicht die genaue Anzahl der durchquerten Quadrate; Zwischen den Umfragen können mehrere Schritte erfolgen.
-
- avoidMobiles=true verbietet das Durchlaufen der bei der Routenberechnung berücksichtigten Zeichen.
-
- openDoors=true ermöglicht Versuche, unterwegs Türen zu öffnen. Dieses Flag umgeht weder eine verschlossene Tür noch Serverbeschränkungen.
- Der erreichte Teilnehmer erhält nach Gesprächsende int 1 oder 0. wenn erreicht == 1 führt den Erfolgszweig aus; else behandelt das Scheitern des Ziels, ohne den Befehl endlos zu wiederholen.
- In der letzten Zeile werden die aktuellen X/Y/Z-Werte zur Überprüfung ausgedruckt. Wenn die Prozedur abbricht, werden keine weiteren Zeilen, einschließlich dieser Ausgabe, ausgeführt.
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;Parameter und Ablauf:
- x/y/z=1445/1690/0; accuracyXY=1, accuracyZ=3; running=true.
- Timeout=5000, maxSteps=60 der beobachteten Bewegungen, avoidMobiles=true und 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;
}
}Parameter und Ablauf:
- Zeilen mit # sind C#-Kommentare: Sie werden beim Kopieren gespeichert und nicht ausgeführt. Das Beispiel enthält beide notwendigen Teile: die Funktion GoToPoint und die ausführbare Prozedur Main.
- Alle sechs Parameter GoToPoint werden ohne Änderung an MoveXYZ übergeben. Innerhalb der Funktion werden vier zusätzliche Parameter angegeben: 8000 ms, 100 beobachtete Positionsänderungen, Zeichendurchquerung und Türöffnung.
- Zweckmäßig 1279/540/20 mit Toleranzen 1/2 fit X=1278..1280, Y=539..541, Z=18..22. Ein Punkt auf einer anderen Höhe draußen 18..22 gilt als nicht erreicht.
- Dies ist ein Wrapper um den eigentlichen Befehl und keine zweite Implementierung der Pfadfindung im Skript. Es ruft kein zusätzliches GetPathArray auf und löst keine endlosen Wiederholungsversuche aus. Wenn dies nicht erreicht wird, erhält die aufrufende Prozedur 0 und wählt die weitere Aktion aus.
Mindestschrittintervall: Gehen – Gehen 400 ms, Laufen 200 ms; Reiten - Gehen 200 ms, Laufen 100 ms.
Hierbei handelt es sich um Standard-Client-Limits und nicht um automatisch definierte Einstellungen für Ihren Shard. Servergeschwindigkeit und Flugmodi werden separat gezählt. Skript-Timer können die Bewegung verlangsamen, verringern diese Grenzwerte jedoch nicht.
Schritte, Routen, Follow, Maus-/Tastensteuerung und Karte nutzen die gemeinsame Warteschlange des Charakters. Durch das Ersetzen der Route, das Abbiegen oder das Anpassen der Position durch den Server wird die verbleibende Pause nach der Schrittanforderung nicht aufgehoben. Nach der Verzögerung gibt es keinen schnellen Burst, um die verlorenen Frames auszugleichen. Das Warten auf eine Bestätigung, Hindernisse und schlechte Kommunikation können die Bewegung verlangsamen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactMoveXYZ(values))
UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any)
Parameter: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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)
Parameter: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any), openDoors (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveXYZ]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveXYZ:CompactMoveXYZ(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactMoveXYZ(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.MoverStop();Stoppt die automatische Route von Pathfinder.
Es gibt keine Parameter.
void – kein Rückgabewert. Rufen Sie eine separate Leitung an; es ist nicht true/false oder die Anzahl der Schritte.
- Entfernt lokale automatische Bewegung. Bereits gesendete Schritte und Serverbestätigungen werden nicht zurückgerufen.
- Dies ist nicht TerminateAll: Die Ausführung der verbleibenden Skriptzeilen und anderer Prozeduren wird fortgesetzt.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.MoverStop");
UO.MoverStop();Parameter und Ablauf:
- Es gibt keine Argumente.
- Der Befehl gibt keinen Erfolgscode zurück.
UO.MoverStop();Parameter und Ablauf:
- Move() liest automatische Bewegung.
- Print – lokale Skriptnachricht; Es handelt sich nicht um eine Serverbestätigung.
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;Parameter und Ablauf:
- UO.Wait=100 ms ermöglicht es dem Client, die nächsten Ereignisse zu verarbeiten.
- Nach dem Anhalten werden die Koordinaten separat gelesen; Die Verzögerung garantiert nicht den Empfang aller Netzwerkbestätigungen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.StopMoving:bridge.StopMoving().
Interner Implementierungscode; kein eigenständiges Skript.
case "moverstop": bridge.StopMoving(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Moving();Überprüft die Bewegung Ihres Charakters.
Es gibt keine Parameter.
int bool (1/0): 1 – automatischer Pathfinder ist aktiv oder es gibt noch Schritte in der Warteschlange des Charakters; 0 – beide fehlen oder das Zeichen ist nicht geladen. Dies ist keine Bestätigung über das Erreichen eines Ziels oder die Anzahl der Schritte.
Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Moving();
UO.Print("Moving: " + Convert.ToString(result));Parameter und Ablauf:
- Leere Klammern lauten self. aktiv – Nummer 1 oder 0; Der Nachrichtentext dient als Beispiel für die Verzweigungsverarbeitung.
- 1 – der automatische Pathfinder ist aktiv oder es befinden sich noch Schritte in der Warteschlange des Charakters; 0 – beide fehlen oder das Zeichen ist nicht geladen. Dies ist keine Bestätigung über das Erreichen eines Ziels oder die Anzahl der Schritte.
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;Parameter und Ablauf:
- Der Befehl hat kein Objektargument: Auch nach Exists(self) liest er nur seinen eigenen Zustand.
- Exists(self) prüft die Auslastung des Spielers getrennt von der angeforderten Flagge. Zwischen den Schecks kann sich die Welt verändern.
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;Parameter und Ablauf:
- Die beiden Aufrufe ohne Argumente lauten self; UO.Wait(500) – eine halbe Sekunde pausieren.
- Es werden zwei Flag-Snapshots verglichen. Übergänge zwischen den Aufnahmen können übersprungen werden; Es handelt sich nicht um ein Abonnement für alle Serverereignisse.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Moving]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMoving:bridge.IsMoving().
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.IsMoving()API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
UO.LimitMove — Reichweite der Bewegung. UO.LimitMove begrenzt die Zielentfernung: Standard 2000, Null unbegrenzt. Versteckte Grenzen von 4096 Schritten/Knoten oder 10000 Knoten entfallen. Die Arbeit erfolgt in abbrechbaren Abschnitten. GetPathArray berücksichtigt moveThroughNPC als Ausdauerschwelle sowie moveOpenDoor.