Skip to content

DE UO Topic client connection

Codex edited this page Oct 12, 2026 · 4 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Kunde & Verbindung

Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen

Verbindung, Welteintragsstatus, Latenz, Serveradresse und Charakterliste.

Abschnitte

Thema Befehle und Erklärungen
Connect UO.Connect
Disconnect UO.Disconnect
Connected UO.Connected
Online UO.Online
Ping UO.GetPing
Server IP UO.GameServerIPString
Shard Name UO.ShardName
Shard Path UO.ShardPath
Zeichenliste UO.GetCharsListForShard
Resend UO.Resend
CheckLag UO.CheckLag

Alle Theme-Befehle

Verbindung

UO.Connect · UO.Disconnect · UO.Connected · UO.Online · UO.IsOnline · UO.ConnectedTime · UO.DisconnectedTime · UO.GetPing · UO.CheckLag · UO.GameServerIPString · UO.ShardName · UO.ShardPath · UO.GetCharsListForShard · UO.Resend · UO.CloseUO

Beispiele zum Thema

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.

UO.Connected

Parameter, Ergebnis und alle Szenarien

if (Truth(Truth(UO.Connected()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.GameServerIPString

Parameter, Ergebnis und alle Szenarien

var address = UO.GameServerIPString();
UO.Print(address);

Vollständige Befehlsreferenz


UO.CheckLag

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

int UO.CheckLag();
dynamic UO.CheckLag(object? timeoutMS);
int UO.CheckLag(object? timeout, object? retries);

Überprüft, ob innerhalb der vorgegebenen Zeit eine neue Antwort vom Spieleserver empfangen wurde. Praktisch, bevor das Skript nach einer Netzwerkverzögerung fortgesetzt wird.

Parameter

  • timeout – Timeout / timeoutMS – Wartezeit für einen Versuch in Millisekunden, konvertiert in int. Ein negativer Wert ist auf Null begrenzt. Mit 0 kann die Anfrage gesendet werden, es wird jedoch keine Antwort erwartet; Es ist keine unendliche Auszeit.
  • timeoutMS – Timeout / timeoutMS – Wartezeit für einen Versuch in Millisekunden, konvertiert in int. Ein negativer Wert ist auf Null begrenzt. Mit 0 kann die Anfrage gesendet werden, es wird jedoch keine Antwort erwartet; Es ist keine unendliche Auszeit.
  • retries – Wiederholungen – Gesamtzahl der Versuche, nicht die Zahl der zusätzlichen Wiederholungen. Konvertiert in int und ist von unten auf eins begrenzt. Zum Beispiel (250, 3) – bis zu drei Versuche bei 250 ms; eine erfolgreiche Antwort schließt die Prüfung vorzeitig ab.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – neue Antwort empfangen; 0 (Bedingung nicht erfüllt) – die Anfrage ist nicht möglich oder die Frist ist abgelaufen. Einzelparameterregistrierung object? gibt tatsächlich dieses int zurück. Dabei handelt es sich nicht um den Ping-Wert oder die Anzahl der Versuche.

Verhalten

  • CheckLag() unternimmt einen Versuch und wartet bis zu 10000 ms. CheckLag(timeoutMS) – ein Versuch mit der angegebenen Erwartung. CheckLag(Timeout, Wiederholungen) wiederholt die Prüfung, bis sie erfolgreich ist oder die Gesamtzahl der Versuche erschöpft ist.
  • Durch Warten wird das aufrufende Skript verzögert, anstatt die Spielaktion zu bestätigen. Der Befehl stellt keine erneute Verbindung her und ändert die Netzwerkeinstellungen nicht. Der Server antwortet möglicherweise nicht auf Echo: Ein Fehler allein beweist nicht, dass die Verbindung unterbrochen wurde. Der Zeitpunkt hängt auch von der Ablaufplanung ab; Rufen Sie nicht für jeden Frame eine aktive Prüfung auf. Das Anhalten des Skripts unterbricht die Wartezeit.
  • UO.GetPing · UO.CheckLag · UO.IsOnline

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.CheckLag();
UO.Print("CheckLag: " + Convert.ToString(result));

1. CheckLag – 1 – direktes Skript

Parameter und Ablauf:

  • Ein Formular ohne Parameter kann bis zu 10 Sekunden warten. true bedeutet eine neue Echoantwort. Das Verstecken wird durch einen separaten Befehl aufgerufen und kann durch die Spielmechanik außer Kraft gesetzt werden.
if (Truth(Truth(UO.CheckLag()) == true))
{
    UO.UseSkill("Hiding");
}
else
{
    UO.Print("No fresh server response");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. CheckLag — 2 — Skriptfunktion

Parameter und Ablauf:

  • 250 – Warten auf einen Versuch, 3 – Gesamtzahl der Versuche. Bei Erfolg werden keine weiteren Versuche unternommen; mit 0 wird das Skript nicht fortgesetzt. Dies ist keine 250 ms-Ping-Messung oder drei zusätzliche Wiederholungen.
return  RunScenario();
 object? RunScenario()
{
    var responsive = UO.CheckLag(250, 3);
    if (Truth(responsive == 0))
    {
        UO.Print("No response after the allowed attempts");
        return null;
    }

    UO.Print("Fresh response received; the script can continue");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. CheckLag – 3 – Szenarioklasse

Parameter und Ablauf:

  • CanContinue(timeoutMs, Versuche) prüft zuerst UO.IsOnline, dann die neueste Antwort. false und 0 sind für dieses Prädikat äquivalent. 500 ms und 2 Versuche werden separat angegeben; Die Funktion löst keine automatische Wiederverbindung 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()
    {
        if (!(Truth(CanContinue(500, 2))))
        {
            return null;
        }

        UO.UseSkill("Hiding");
        return null;
    }

    dynamic CanContinue(dynamic timeoutMs, dynamic attempts)
    {
        if (Truth(Truth(UO.IsOnline()) == false))
        {
            return false;
        }

        return Truth(Truth(UO.CheckLag(timeoutMs, attempts)) == true);
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.CheckLag() — UO.CheckLag()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int CheckLag() => bridge.CheckLag(10_000);

UO.CheckLag(timeoutMS) — UO.CheckLag(Any)

Parameter: timeoutMS (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "checklag": return new InjectionValue(bridge.CheckLag(Arg(0, 10_000)));

UO.CheckLag(timeout, retries) — UO.CheckLag(Any,Any)

Parameter: timeout (Any), retries (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int CheckLag(InjectionValue timeout, InjectionValue retries)

        {

            int timeoutMs = Math.Max(0, NumberConversions.ToInt(timeout));

            int attempts = Math.Max(1, NumberConversions.ToInt(retries));

            for (int attempt = 0; attempt < attempts; attempt++)

            {

                if (bridge.CheckLag(timeoutMs) != 0)

                    return 1;

            }

            return 0;

        }

UO.CloseUO

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

void UO.CloseUO();

Fordert die aktuelle Clientanwendung zum Beenden über Client.Game.Exit auf.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Rückgabewert.

Verhalten

  • CloseUO wird an dieselbe Bridge gesendet.CloseHandle. Exit wird im Spielthread ausgeführt; Wenn Client.Game fehlt, gibt es keine Aktion. Der Befehl ist kein Herunterfahren eines separaten Gumps.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.CloseUO");
UO.CloseUO();

1. Client beenden – Direktes Skript

Parameter und Ablauf:

  • Der Aufruf fordert die Beendigung der Clientanwendung an.
UO.CloseUO();

2. Explizite Beendigungsbedingung – Skriptfunktion

Parameter und Ablauf:

  • Das Beispiel zeigt einen kontrollierten Zustand; Der Wert 0 hält den Client geöffnet.
return  RunScenario();
 object? RunScenario()
{
    var finishClient = 0;
    if (Truth(finishClient))
    {
        UO.CloseUO();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Abschlussprozedur – Skriptklasse

Parameter und Ablauf:

  • Ein vollständig deklarierter Helfer ermöglicht die explizite Exit-Aktivierung.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        FinishClient(0);
        return null;
    }

    void FinishClient(dynamic enabled)
    {
        if (Truth(enabled))
        {
            UO.CloseUO();
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.CloseUO() — UO.CloseUO()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "closeuo": bridge.CloseHandle(); break;

UO.Connect

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

void UO.Connect();

Fordert eine Verbindung oder erneute Verbindung der aktuellen Clientsitzung an.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Rückgabewert.

Verhalten

  • Ruft in einer Managersitzung SessionControl.RequestConnect auf. Im Standalone-Client bleibt die aktive/vorbereitete Verbindung unverändert.
  • Für GameScene ist eine gespeicherte Wiederverbindung geplant, um die Szene während der Aktualisierung nicht zu verändern. In LoginScene werden das aktuelle Konto und das gespeicherte Passwort verwendet, Reconnect aktiviert und Connect mit dem gespeicherten Shard/Charakter aufgerufen, auch wenn die automatische Reconnect-Funktion deaktiviert ist.
  • Das Team wartet nicht darauf, die Welt zu betreten. Überprüfen Sie UO.Connected nach einer separaten Wartezeit, ob für weitere Aktionen eine Verbindung erforderlich ist.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.Connect");
UO.Connect();

1. Connect – direktes Skript

Parameter und Ablauf:

  • Durch den Anruf wird lediglich eine Verbindung aufgebaut.
UO.Connect();

2. Verbinden, wenn keine Verbindung besteht – Skriptfunktion

Parameter und Ablauf:

  • Durch die Überprüfung kann eine erneute Anfrage vermieden werden.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Connected())))
    {
        UO.Connect();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Status später prüfen – Skriptklasse

Parameter und Ablauf:

  • Das Warten von 1000 ms garantiert keinen Eintritt; Die Ausgabe zeigt das tatsächliche aktuelle Flag.
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.Connect();
        await Delay(1000);
        UO.Print(Convert.ToString(UO.Connected()));
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.Connect() — UO.Connect()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "connect": bridge.ConnectClient(); return InjectionValue.Unit;

UO.Connected

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.Connected();

Überprüft, ob sich die aktuelle Sitzung in der Spielwelt befindet und ob ihre Spielverbindung geöffnet ist. Verwenden Sie es vor einer Charakteraktion oder während Sie auf den Eintritt warten.

Parameter

Es gibt keine Parameter.

Rückgabewert

int. 1 - es gibt gleichzeitig einen Spieler, eine geladene Karte und einen aktiven Spielsockel; sonst 0. Ein geöffnetes Client-Fenster, eine Zeichenliste oder eine TCP-Verbindung in der Anmeldephase bedeuten nicht 1. Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Ergebnis prüfen != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig.

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.

Verhalten

  • Es gibt keine Parameter: serial, type, Charaktername und IP können nicht übertragen werden. UO.Online(), UO.Connected() und UO.IsOnline() überprüfen dasselbe. Dies ist der Status des jeweiligen Sitzungseigentümers, nicht eines anderen Managerprofils.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.Connected();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Führe die Spielfertigkeit nicht offline aus – direktes Skript

Parameter und Ablauf:

  • false entspricht 0. Return beendet Main zu UseSkill. Verstecken ist der einzige Parameter von UseSkill, dem Namen der Fertigkeit. Bei 1 fordert das Skript nur zur Nutzung des Skills auf; Das Ergebnis hängt vom Status des Charakters und des Servers ab.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
if (Truth(Truth(UO.Connected()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verbindung anfordern, wenn keine Verbindung besteht – Skriptfunktion

Parameter und Ablauf:

  • Beim Vergleich mit 0 wird die aktuelle Verbindung überprüft, nicht die Einstellung für die automatische Wiederverbindung. Connect ohne Argumente verwendet die gespeicherten Einstellungen und wartet nicht, bis die Anmeldung abgeschlossen ist. Das Wiederholen eines Befehls während einer bereits gestarteten Anmeldung sollte keine zweite Sitzung erzeugen.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected() == 0))
    {
        UO.Connect();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Warten Sie, bis die Welt mit Zeitlimit bereit ist – Szenarioklasse

Parameter und Ablauf:

  • WaitForWorld(timeoutMs) ist eine vollständig angezeigte benutzerdefinierte Funktion, kein integrierter Befehl. 5000 – Budget in ms, UO.Wait(50) – Prüfintervall. Ein negativer Wert ergibt false; 0 erlaubt nur eine vorgefertigte Welt. Timer misst Sekunden, daher wird die Differenz mit 1000 multipliziert. Autopause muss vorher ausgeschaltet werden, andernfalls wird Main beendet. Die Funktion ruft Connect nicht auf und bricht die gestartete Eingabe nicht ab, wenn die Zeit abgelaufen ist.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.Connected())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.Connected() — UO.Connected()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "connected": return new InjectionValue(bridge.IsOnline());

UO.ConnectedTime

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.ConnectedTime();

Gibt den Kalenderstempel des letzten erfolgreichen Eintritts des Charakters in die Welt zurück. Hilft Ihnen zu verstehen, ob sich die Verbindung während des Wartens oder Anhaltens geändert hat, bevor Sie mit der gleichen Aufgabe fortfahren.

Parameter

Es gibt keine Parameter.

Rückgabewert

double: Anzahl der Tage von 1899-12-30, Bruchteil – Tageszeit (OLE Automatisierungsdatum). 0 bedeutet, dass dieser Sitzungsbesitzer die Welt noch nicht betreten hat. Nach dem Trennen bleibt die letzte Eingabemarke erhalten. Es ist nicht bool oder die Dauer in Sekunden.

Verhalten

  • Es gibt keine Argumente. Der Verlauf ist für Skripte desselben Sitzungseigentümers gleich: Spätes Starten, Anhalten und Schließen IDE ändern die Markierungen nicht. Ein neuer Sitzungsprozess beginnt eine neue Geschichte; Es handelt sich nicht um ein Protokoll aller Verbindungen.
  • Ein fehlgeschlagener Anmeldeversuch, ohne dass der Charakter in der Welt erscheint, gilt nicht als erfolgreiche Anmeldung. Wiederholte Offline-Prüfungen verändern die Abschaltzeit nicht. Verwenden Sie für den aktuellen Status UO.Connected() anstelle eines Datums ungleich Null.
  • Die Uhren werden von der lokalen Uhr des Computers übernommen. Die Differenz multipliziert mit 86400 ergibt Kalendersekunden; Das Ändern der Uhr/Zeitzone kann die Ergebnisse verfälschen. Verwenden Sie für Zeitüberschreitungen den monotonen Timer(). Einzelne Aufrufe bilden keinen atomaren Snapshot; Die gleiche Markierung ist keine eindeutige ID-Verbindung.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.ConnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Fordern Sie den allerersten Input an – Direktskript

Parameter und Ablauf:

  • 0 prüft, ob in diesem bestimmten Prozess keine Eingaben vorliegen. Connect verwendet das gespeicherte Profil und fragt nur nach einer Anmeldung. In diesem Beispiel wird eine bereits beendete Verbindung absichtlich nicht wiederhergestellt.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
if (Truth(UO.ConnectedTime() == 0))
{
    UO.Connect();
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Erwartetes Ziel nach neuer Anmeldung zurücksetzen – Skriptfunktion

Parameter und Ablauf:

  • 30.0 – Überwachung des Budgets in Timer-Sekunden; 250 – Intervall UO.Wait in ms. Nach dem Ändern der Eingabemarkierung löscht CancelWaitTarget das vorherige verzögerte Ziel. Erfolgt keine neue Eingabe, endet die Schleife ohne diese Aktion.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var login = UO.ConnectedTime();
    var started = Environment.TickCount;
    while (Truth(Environment.TickCount - started < 30.0))
    {
        if (Truth(UO.Connected()) && Truth(UO.ConnectedTime() != login))
        {
            UO.CancelWaitTarget();
            return null;
        }

        await Delay(250);
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Testen Sie die Verbindung, bevor Sie fortfahren – Skriptklasse

Parameter und Ablauf:

  • SameConnection(Anmeldung) gibt bool zurück. Wir speichern die Markierung, warten 500 ms und verbieten dann die Fortsetzung, wenn keine Verbindung besteht oder sich die Eingabe ändert. Dies ist ein erneuter Test und keine Garantie für die zukünftige Serververfügbarkeit.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
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 login = UO.ConnectedTime();
        await Delay(500);
        if (!(Truth(SameConnection(login))))
        {
            return null;
        }

        UO.AddToSystemJournal("Same connection; continue this batch");
        return null;
    }

    dynamic SameConnection(dynamic login)
    {
        return Truth(login != 0) && Truth(UO.Connected()) && Truth(UO.ConnectedTime() == login);
    }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.ConnectedTime() — UO.ConnectedTime()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "connectedtime":

                    UpdateConnectionState();

                    return new InjectionValue(state.ConnectedTime == default(DateTime) ? 0d : state.ConnectedTime.ToOADate());

UO.Disconnect

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

void UO.Disconnect();

Trennt den aktuellen oder installierten Client-Transport und bereitet Skripts für die erneute Verbindung vor.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Rückgabewert.

Verhalten

  • Wenn die automatische Wiederverbindung deaktiviert ist, speichert BeginScriptControlledDisconnect den Anruf des Mitarbeiters für später UO.Connect. Die Managersitzung erhält RequestDisconnect.
  • Der eigenständige Client ruft Socket.Disconnect und PrepareForReconnect auf. Wenn die globale Wiederverbindung aktiviert ist, wird der gespeicherte Szenenübergang explizit geplant. In LoginScene wird das Popup gelöscht und Main zurückgegeben.
  • Die Rückgabe von void meldet nicht das Ergebnis der erneuten Verbindung. Der Verbindungsstatus wird separat ausgelesen; Die Einstellungen für die automatische Wiederverbindung können eine neue Anmeldung initiieren.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.Disconnect");
UO.Disconnect();

1. Sitzung trennen – direktes Skript

Parameter und Ablauf:

  • Der Befehl bricht sowohl den aktiven als auch den installierten Transport ab.
UO.Disconnect();

2. Explizite Wiederverbindung – Skriptfunktion

Parameter und Ablauf:

  • Wenn AR deaktiviert ist, kann der anrufende Mitarbeiter Connect selbst erreichen.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.Disconnect();
    await Delay(1000);
    UO.Connect();
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

3. Nur verbundene Sitzung deaktivieren – Skriptklasse

Parameter und Ablauf:

  • Die Bedingung verwendet ein lokales Flag für die aktuelle Sitzung.
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.Disconnect();
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.Disconnect() — UO.Disconnect()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "disconnect": bridge.DisconnectClient(); return InjectionValue.Unit;

UO.DisconnectedTime

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.DisconnectedTime();

Gibt den Kalenderstempel des letzten Verbindungsabbruchs zum Spiel zurück. Es wird benötigt, um eine Unterbrechung zu diagnostizieren und die Dauer einer hergestellten Verbindung abzuschätzen, und nicht, um die Anzahl der Anmeldeversuche zu bestimmen.

Parameter

Es gibt keine Parameter.

Rückgabewert

double: Anzahl der Tage von 1899-12-30 mit Bruchteil des Tages. Nach der Pause – der Zeitpunkt, zu dem der Kunde den Ausfall bemerkt hat; vor der ersten Pause ist der Zeitpunkt, zu dem der Sitzungseigentümer erstellt wurde. Dies ist kein Offline-Flag und keine Millisekunden.

Verhalten

  • Es gibt keine Argumente. Der Verlauf ist für Skripte desselben Sitzungseigentümers gleich: Spätes Starten, Anhalten und Schließen IDE ändern die Markierungen nicht. Ein neuer Sitzungsprozess beginnt eine neue Geschichte; Es handelt sich nicht um ein Protokoll aller Verbindungen.
  • Ein fehlgeschlagener Anmeldeversuch, ohne dass der Charakter in der Welt erscheint, gilt nicht als erfolgreiche Anmeldung. Wiederholte Offline-Prüfungen verändern die Abschaltzeit nicht. Verwenden Sie für den aktuellen Status UO.Connected() anstelle eines Datums ungleich Null.
  • Die Uhren werden von der lokalen Uhr des Computers übernommen. Die Differenz multipliziert mit 86400 ergibt Kalendersekunden; Das Ändern der Uhr/Zeitzone kann die Ergebnisse verfälschen. Verwenden Sie für Zeitüberschreitungen den monotonen Timer(). Einzelne Aufrufe bilden keinen atomaren Snapshot; Die gleiche Markierung ist keine eindeutige ID-Verbindung.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.DisconnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Schätzen Sie die Dauer einer abgeschlossenen Verbindung – direktes Skript

Parameter und Ablauf:

  • CompletedConnectionSeconds() gibt Sekunden zurück oder -1, wenn keine abgeschlossene Verbindung besteht oder sich die Eingabe zwischen den Lesevorgängen geändert hat. 86400 – Sekunden pro Tag. Nur das letzte Eingabe-/Unterbrechungspaar wird neu berechnet; Die Funktion fasst nicht den Verlauf aller Sitzungen zusammen.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
var seconds = CompletedConnectionSeconds();
if (Truth(seconds >= 0))
{
    UO.AddToSystemJournal("Completed connection seconds: " + Convert.ToString(seconds));
}

dynamic CompletedConnectionSeconds()
{
    var login = UO.ConnectedTime();
    var loss = UO.DisconnectedTime();
    if (Truth(login == 0) || Truth(loss < login) || Truth(UO.Connected()))
    {
        return -1;
    }
    if (Truth(UO.ConnectedTime() != login))
    {
        return -1;
    }
    return (loss - login) * 86400.0;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Login nach kurzer Wartezeit offline anfordern – Script-Funktion

Parameter und Ablauf:

  • Wenn die automatische Pause aktiviert ist, wird dieser Controller sofort beendet; Um offline arbeiten zu können, muss es vorher ausgeschaltet werden. Nach UO.Wait(1000) offline und der vorherigen Pausenmarke werden erneut überprüft. Connect garantiert keinen Erfolg und ersetzt nicht die Einstellung für die automatische Wiederverbindung.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
    {
        return null;
    }

    if (Truth(UO.Connected()))
    {
        return null;
    }

    var loss = UO.DisconnectedTime();
    await Delay(1000);
    if (!(Truth(UO.Connected())) && Truth(UO.DisconnectedTime() == loss))
    {
        UO.Connect();
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Beachten Sie die Unterbrechung zwischen den Prüfungen – Skriptklasse

Parameter und Ablauf:

  • Der Vergleich mit previousLoss stellt einen Break Even fest, nachdem bereits ein Wiedereintritt stattgefunden hat. 30 Sekunden begrenzen die Überwachung, während das Skript ausgeführt wird, WaitAsync(250) gibt den Thread zwischen Überprüfungen frei. Mehrere Unterbrechungen können zu einer Benachrichtigung zusammengefasst werden.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.
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 previousLoss = UO.DisconnectedTime();
        var started = Environment.TickCount;
        while (Truth(Environment.TickCount - started < 30.0))
        {
            if (Truth(UO.DisconnectedTime() != previousLoss))
            {
                UO.AddToSystemJournal("A connection loss occurred; check the session");
                return null;
            }

            await Delay(250);
        }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.DisconnectedTime() — UO.DisconnectedTime()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "disconnectedtime":

                    UpdateConnectionState();

                    return new InjectionValue(state.DisconnectedTime.ToOADate());

UO.GameServerIPString

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.GameServerIPString();

Liest die konfigurierte Serveradresse aus den globalen Einstellungen des Clients.

Parameter

Es gibt keine Parameter.

Rückgabewert

string – Settings.GlobalSettings.IP oder eine leere Zeichenfolge, wenn kein Wert vorhanden ist.

Verhalten

  • GameServerAddress in der aktuellen Bridge liest die globale Einstellung IP. Hierbei handelt es sich weder um eine DNS/Netzwerk-Anfrage, noch wird die Adresse des tatsächlichen Peers überprüft. Eine Managersitzung kann über eigene Verbindungsparameter verfügen.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.GameServerIPString();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Adresse lesen - direktes Skript

Parameter und Ablauf:

  • Die aktuelle globale Einstellung IP wird zurückgegeben.
var address = UO.GameServerIPString();
UO.Print(address);

2. Auf leere Adresse prüfen – Skriptfunktion

Parameter und Ablauf:

  • Ein leerer Wert weist auf keine Konfiguration und keinen gemessenen Netzwerkfehler hin.
return  RunScenario();
 object? RunScenario()
{
    var address = UO.GameServerIPString();
    if (Truth(Len(address) == 0))
    {
        UO.Print("no configured address");
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Snapshot speichern – Skriptklasse

Parameter und Ablauf:

  • Die Variable speichert die beim ersten Aufruf erhaltene Zeichenfolge.
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 address = UO.GameServerIPString();
        await Delay(100);
        UO.Print(address);
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.GameServerIPString() — UO.GameServerIPString()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "gameserveripstring": return new InjectionValue(bridge.GameServerAddress);

UO.GetCharsListForShard

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.GetCharsListForShard();

Gibt die Charakternamen des aktuellen Shards zurück, die dem Client bekannt sind.

Parameter

Es gibt keine Parameter.

Rückgabewert

Array von Strings. Es sind keine Namen bekannt und das aktuelle Zeichen ist ein leeres Array.

Verhalten

  • Die Manager-Sitzung lautet SessionControl.Characters. Im Standalone-Modus wird LastCharacterManager zuerst für Konto/Server verwendet; wenn die Liste leer ist, lesen Sie LoginScene.Zeichen ohne leere Namen; dann wird der aktuelle Player.Name als einziges Element verwendet.
  • Dies sind lokal bekannte Namen; Der Befehl fordert keine vollständige Liste vom Server an und garantiert nicht die Aktualität des Caches.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.GetCharsListForShard();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Drucknamen - direktes Skript

Parameter und Ablauf:

  • Die Schleife arbeitet mit einem tatsächlichen Array bekannter Namen.
var names = UO.GetCharsListForShard();
for (int i = (int)(0); i <= ArrayLength(names)-1; i += (int)(1))
{
    UO.Print(names[i]);
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Bekannter Vorname – Skriptfunktion

Parameter und Ablauf:

  • Der Index 0 wird nur für ein nicht leeres Array verwendet.
return  RunScenario();
 object? RunScenario()
{
    var names = UO.GetCharsListForShard();
    if (Truth(ArrayLength(names) > 0))
    {
        UO.Print(names[0]);
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Anzahl der Namen – Skriptklasse

Parameter und Ablauf:

  • Die Listengröße gibt nicht die Anzahl der Kontoslots auf dem Server an.
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 names = UO.GetCharsListForShard();
        UO.Print(Convert.ToString(ArrayLength(names)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.GetCharsListForShard() — UO.GetCharsListForShard()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getcharslistforshard": return StringArray(bridge.GetCharactersForCurrentShard());

UO.GetPing

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

int UO.GetPing();
int UO.GetPing(object? timeout);

Liest die Antwortverzögerung des Spielservers. Ohne Argument wird die letzte Dimension verwendet; mit einer Zeitüberschreitung fordert eine neue Antwort an.

Parameter

  • timeout – Timeout / timeoutMS – Wartezeit für einen Versuch in Millisekunden, konvertiert in int. Ein negativer Wert ist auf Null begrenzt. Mit 0 kann die Anfrage gesendet werden, es wird jedoch keine Antwort erwartet; Es ist keine unendliche Auszeit.

Rückgabewert

int, Millisekunden. Wert >= 0 – Messung; 0 ms sind ebenfalls akzeptabel. -1 – keine Messung: Bei einem Formular mit einem Argument wurde die Anfrage nicht abgeschlossen oder die Antwort kam nicht rechtzeitig an. Das ist NICHT bool; 0 kann nicht als Misserfolg und -1 als Erfolg gewertet werden.

Verhalten

  • GetPing() sendet nichts und liest sofort das letzte ServerPing. Der alte Wert allein beweist nicht, dass die Verbindung jetzt funktioniert. Dies ist die letzte Serverechomessung, nicht der geglättete/Backup-TCP-Indikator-Ping und nicht der ICMP-Ping (Host). GetPing(Timeout) wartet auf eine neue Antwort und liest dann die letzte Servermessung.
  • Durch Warten wird das aufrufende Skript verzögert, anstatt die Spielaktion zu bestätigen. Der Befehl stellt keine erneute Verbindung her und ändert die Netzwerkeinstellungen nicht. Der Server antwortet möglicherweise nicht auf Echo: Ein Fehler allein beweist nicht, dass die Verbindung unterbrochen wurde. Der Zeitpunkt hängt auch von der Ablaufplanung ab; Rufen Sie nicht für jeden Frame eine aktive Prüfung auf. Das Anhalten des Skripts unterbricht die Wartezeit.
  • UO.GetPing · UO.CheckLag · UO.IsOnline

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.GetPing();
UO.Print("GetPing: " + Convert.ToString(result));

1. GetPing – 1 – direktes Skript

Parameter und Ablauf:

  • Cache ohne neue Netzwerkanfrage lesen. Das Beispiel wählt 50 oder 200 ms aus, um bei einem Schwellenwert von 250 ms auf das Skript selbst zu warten. Die unbekannte Dimension wird separat verarbeitet. Bei diesen Zahlen handelt es sich um eine Beispieleinstellung und nicht um einen universellen Servergrenzwert.
var pingMs = UO.GetPing();
if (Truth(pingMs < 0))
{
    UO.Print("No server latency sample");
    return null;
}
var delayMs = 50;
if (Truth(pingMs > 250))
{
    delayMs = 200;
}
await Delay(delayMs);

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. GetPing — 2 — Skriptfunktion

Parameter und Ablauf:

  • 1000 – maximale Wartezeit auf eine neue Antwort in Millisekunden. Bei -1 endet der Vorgang. Bei erfolgreicher Messung wird das Ausblenden angefordert; Eine Echoantwort ist kein Beweis für den erfolgreichen Einsatz der Fertigkeit.
return  RunScenario();
 object? RunScenario()
{
    var pingMs = UO.GetPing(1000);
    if (Truth(pingMs == -1))
    {
        UO.Print("No fresh server response");
        return null;
    }

    UO.UseSkill("Hiding");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. GetPing – 3 – Szenarioklasse

Parameter und Ablauf:

  • MeanPing(Samples, timeoutMs) vollständig angezeigt: 3 Versuche bei 500 ms; erfolglose Messungen werden aus der Mittelung ausgeschlossen. Wenn es keine erfolgreichen gibt, wird -1 zurückgegeben. Proben begrenzt auf 1–10; UO.Wait(100) reduziert die Anfragerate zwischen Versuchen.
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 meanMs = await MeanPing(3, 500);
        if (Truth(meanMs < 0))
        {
            UO.Print("No successful samples");
        }
        else
        {
            UO.Print("Measured mean, ms: " + Convert.ToString(meanMs));
        }

        return null;
    }

    async Task<dynamic> MeanPing(dynamic samples, dynamic timeoutMs)
    {
        if (Truth(samples < 1) || Truth(samples > 10))
        {
            return -1;
        }

        var total = 0;
        var count = 0;
        for (int i = (int)(1); i <= samples; i += (int)(1))
        {
            var current = UO.GetPing(timeoutMs);
            if (Truth(current >= 0))
            {
                total = total + current;
                count = count + 1;
            }

            await Delay(100);
        }

        if (Truth(count == 0))
        {
            return -1;
        }

        return total / count;
    }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.GetPing() — UO.GetPing()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetPing(timeout) — UO.GetPing(Any)

Parameter: timeout (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int GetPing(InjectionValue timeout) => bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout)));

UO.IsOnline

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

int UO.IsOnline();

Überprüft, ob sich die aktuelle Sitzung in der Spielwelt befindet und ob ihre Spielverbindung geöffnet ist. Verwenden Sie es vor einer Charakteraktion oder während Sie auf den Eintritt warten.

Parameter

Es gibt keine Parameter.

Rückgabewert

int. 1 - es gibt gleichzeitig einen Spieler, eine geladene Karte und einen aktiven Spielsockel; sonst 0. Ein geöffnetes Client-Fenster, eine Zeichenliste oder eine TCP-Verbindung in der Anmeldephase bedeuten nicht 1. Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Ergebnis prüfen != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig.

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.

Verhalten

  • Es gibt keine Parameter: serial, type, Charaktername und IP können nicht übertragen werden. UO.Online(), UO.Connected() und UO.IsOnline() überprüfen dasselbe. Dies ist der Status des jeweiligen Sitzungseigentümers, nicht eines anderen Managerprofils.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.IsOnline();
UO.Print("IsOnline: " + Convert.ToString(result));

1. Führe die Spielfertigkeit nicht offline aus – direktes Skript

Parameter und Ablauf:

  • false entspricht 0. Return beendet Main zu UseSkill. Verstecken ist der einzige Parameter von UseSkill, dem Namen der Fertigkeit. Bei 1 fordert das Skript nur zur Nutzung des Skills auf; Das Ergebnis hängt vom Status des Charakters und des Servers ab.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
if (Truth(Truth(UO.IsOnline()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verbindung anfordern, wenn keine Verbindung besteht – Skriptfunktion

Parameter und Ablauf:

  • Beim Vergleich mit 0 wird die aktuelle Verbindung überprüft, nicht die Einstellung für die automatische Wiederverbindung. Connect ohne Argumente verwendet die gespeicherten Einstellungen und wartet nicht, bis die Anmeldung abgeschlossen ist. Das Wiederholen eines Befehls während einer bereits gestarteten Anmeldung sollte keine zweite Sitzung erzeugen.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline() == 0))
    {
        UO.Connect();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Warten Sie, bis die Welt mit Zeitlimit bereit ist – Szenarioklasse

Parameter und Ablauf:

  • WaitForWorld(timeoutMs) ist eine vollständig angezeigte benutzerdefinierte Funktion, kein integrierter Befehl. 5000 – Budget in ms, UO.Wait(50) – Prüfintervall. Ein negativer Wert ergibt false; 0 erlaubt nur eine vorgefertigte Welt. Timer misst Sekunden, daher wird die Differenz mit 1000 multipliziert. Autopause muss vorher ausgeschaltet werden, andernfalls wird Main beendet. Die Funktion ruft Connect nicht auf und bricht die gestartete Eingabe nicht ab, wenn die Zeit abgelaufen ist.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.IsOnline())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.IsOnline() — UO.IsOnline()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.Online

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

int UO.Online();

Überprüft, ob sich die aktuelle Sitzung in der Spielwelt befindet und ob ihre Spielverbindung geöffnet ist. Verwenden Sie es vor einer Charakteraktion oder während Sie auf den Eintritt warten.

Parameter

Es gibt keine Parameter.

Rückgabewert

int. 1 - es gibt gleichzeitig einen Spieler, eine geladene Karte und einen aktiven Spielsockel; sonst 0. Ein geöffnetes Client-Fenster, eine Zeichenliste oder eine TCP-Verbindung in der Anmeldephase bedeuten nicht 1. Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Ergebnis prüfen != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig.

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.

Verhalten

  • Es gibt keine Parameter: serial, type, Charaktername und IP können nicht übertragen werden. UO.Online(), UO.Connected() und UO.IsOnline() überprüfen dasselbe. Dies ist der Status des jeweiligen Sitzungseigentümers, nicht eines anderen Managerprofils.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
  • UO.Wait dauert Millisekunden. Automatische Pause bei Verbindungsverlust und manuelle Pause verzögern die Ausführung von Beispielen: Die Timeout-Prüfung wird erst fortgesetzt, nachdem die Pause entfernt wurde. Diese Befehle heben die Pause nicht auf und aktivieren keine automatische Wiederherstellung der Verbindung.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.Online();
UO.Print("Online: " + Convert.ToString(result));

1. Führe die Spielfertigkeit nicht offline aus – direktes Skript

Parameter und Ablauf:

  • false entspricht 0. Return beendet Main zu UseSkill. Verstecken ist der einzige Parameter von UseSkill, dem Namen der Fertigkeit. Bei 1 fordert das Skript nur zur Nutzung des Skills auf; Das Ergebnis hängt vom Status des Charakters und des Servers ab.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
if (Truth(Truth(UO.Online()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verbindung anfordern, wenn keine Verbindung besteht – Skriptfunktion

Parameter und Ablauf:

  • Beim Vergleich mit 0 wird die aktuelle Verbindung überprüft, nicht die Einstellung für die automatische Wiederverbindung. Connect ohne Argumente verwendet die gespeicherten Einstellungen und wartet nicht, bis die Anmeldung abgeschlossen ist. Das Wiederholen eines Befehls während einer bereits gestarteten Anmeldung sollte keine zweite Sitzung erzeugen.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Online() == 0))
    {
        UO.Connect();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Warten Sie, bis die Welt mit Zeitlimit bereit ist – Szenarioklasse

Parameter und Ablauf:

  • WaitForWorld(timeoutMs) ist eine vollständig angezeigte benutzerdefinierte Funktion, kein integrierter Befehl. 5000 – Budget in ms, UO.Wait(50) – Prüfintervall. Ein negativer Wert ergibt false; 0 erlaubt nur eine vorgefertigte Welt. Timer misst Sekunden, daher wird die Differenz mit 1000 multipliziert. Autopause muss vorher ausgeschaltet werden, andernfalls wird Main beendet. Die Funktion ruft Connect nicht auf und bricht die gestartete Eingabe nicht ab, wenn die Zeit abgelaufen ist.
  • Der Befehl liest nur den lokalen Status. Es sendet keinen Ping, stellt keine Verbindung her, pausiert nicht und prüft nicht die Verfügbarkeit des Internets. Nach dem Lesen kann sich der Zusammenhang ändern; 1 garantiert nicht den Erfolg der nächsten Aktion.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.Online())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.Online() — UO.Online()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.IsOnline()

API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.


UO.Resend

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

void UO.Resend();

Sendet eine Anfrage zur Neusynchronisierung der Welt.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.

Verhalten

  • Resync sendet NetClient.Socket.Send_Resync im Spielthread. Hierbei handelt es sich um eine Aktualisierungsanforderung, nicht um eine erneute Verbindung oder um eine Bestätigung, dass Daten empfangen wurden.
  • In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.Resend");
UO.Resend();

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Sendet eine Anfrage zur Neusynchronisierung der Welt.
UO.Resend();

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • Resync sendet NetClient.Socket.Send_Resync im Spielthread. Hierbei handelt es sich um eine Aktualisierungsanforderung, nicht um eine erneute Verbindung oder um eine Bestätigung, dass Daten empfangen wurden.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline()))
    {
        UO.Resend();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
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.Resend();
        UO.Wait(500);
        UO.Print(UO.GetX());
        return null;
    }
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.Resend() — UO.Resend()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "resend": bridge.Resync(); break;

UO.ShardName

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.ShardName();

Liest den Shard-Namen.

Parameter

Es gibt keine Parameter.

Rückgabewert

string – Text des Bridge-Feldes.ShardName; Ohne verfügbare Daten ist ein leerer String möglich. Dies ist kein Verbindungszeichen und kein numerisches ID.

Verhalten

  • ExecuteClientApiCompatibility gibt Bridge.ShardName zurück, ohne das Profil oder die Serverauswahl zu ändern.
  • Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.ShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Liest den Shard-Namen.
var value = UO.ShardName();
UO.Print(value);

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • ExecuteClientApiCompatibility gibt Bridge.ShardName zurück, ohne das Profil oder die Serverauswahl zu ändern.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ShardName();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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 before = UO.ShardName();
        UO.Wait(500);
        var after = UO.ShardName();
        UO.Print(before = after);
        return null;
    }
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.ShardName() — UO.ShardName()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "shardname":

                case "profileshardname": return new InjectionValue(bridge.ShardName);

UO.ShardPath

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-Signaturen

dynamic UO.ShardPath();

Liest den Pfad des aktuellen Profils.

Parameter

Es gibt keine Parameter.

Rückgabewert

string – Text des Bridge-Feldes.CurrentProfilePath; Ohne verfügbare Daten ist ein leerer String möglich. Dies ist kein Verbindungszeichen und kein numerisches ID.

Verhalten

  • ExecuteClientApiCompatibility gibt Bridge.CurrentProfilePath zurück, ohne das Profil oder die Serverauswahl zu ändern.
  • Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.

Eigenständige C#-Skripte

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.

Einfaches Beispiel

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.ShardPath();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Liest den Pfad des aktuellen Profils.
var value = UO.ShardPath();
UO.Print(value);

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • ExecuteClientApiCompatibility gibt Bridge.CurrentProfilePath zurück, ohne das Profil oder die Serverauswahl zu ändern.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ShardPath();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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 before = UO.ShardPath();
        UO.Wait(500);
        var after = UO.ShardPath();
        UO.Print(before = after);
        return null;
    }
}

Implementierung des Befehls

C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

UO.ShardPath() — UO.ShardPath()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "shardpath":

                case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);

Clone this wiki locally