DE UO Topic character Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Charakter — 2

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

Referenzteile

1 · 2 · 3 · 4 · 5

Vollständige Befehlsreferenz


UO.GetEquipment

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

C#-Signaturen

dynamic UO.GetEquipment(object? id);

Liest die Liste der Geräte auf Objektebenen ungleich Null.

Parameter

  • id – Seriell/ID eines bestimmten Objekts: int, Dezimal-/Hex-Zeichenfolge oder Set-Alias ​​self, backpack, lasttarget, lastobject oder Name AddObject. Dies ist nicht graphic/type. Die Zeilen my/backpack wählen den Rucksack aus. Nur explizites 0, „0“ oder „ground“ Land auswählen. Ein unbekannter Alias, ein fehlender Rucksack, ein negatives ID oder ein unpassender Werttyp führen zu einem leeren Array.

Rückgabewert

Array – serial jedes Elements, dessen Container ID ist und dessen Layer nicht gleich „Ungültig“ ist. Für ground/0 wird ein leeres Array zurückgegeben. Ohne Einträge wird ein leeres Array zurückgegeben. Die Liste enthält ID, nicht type und keine Ebenen.

Verhalten

  • Vom Client bereits heruntergeladene Daten werden gelesen. Der Befehl öffnet nicht den Container, verschiebt keine Elemente und lädt keine Objekte vom gesamten Server herunter.
  • Array – Array mit Indizes beginnend bei 0. Speichern Sie es in var, überprüfen Sie ArrayLength, bevor Sie darauf zugreifen. Nach der Aufnahme eines Schnappschusses können Elemente aus der Welt verschwinden: Überprüfen Sie „Exists(serial)“, bevor Sie Maßnahmen ergreifen.
  • Es gibt kein rekursives Durchlaufen verschachtelter Taschen, keine Entfernungssortierung und keinen Ignore- oder FindDistance/FindVertical-Filter. Der reguläre FindType-Snapshot bleibt unverändert.
  • GetEquipment(self) umfasst den Rucksack und andere bekannte Nicht-Null-Schichten; Das bloße Vorhandensein einer Schicht bedeutet nicht, dass eine Waffe oder Rüstung getragen wird. GetContent(self) kann Ausrüstung enthalten, da sein übergeordnetes Element ein Charakter 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.

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

1. Listengröße abrufen – direktes Skript

Parameter und Ablauf:

  • ID="self" – der aktuelle Charakter, seine direkten Gegenstände mit einer Ebene ungleich Null werden ausgewählt.
  • Länge – Anzahl der Datensätze/ID. Dies ist nicht die Anzahl der Stapel. Die leere Liste ergibt 0.
var items = UO.GetEquipment("self");
UO.Print(Convert.ToString(ArrayLength(items)));

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

2. Alle gefundenen ID durchlaufen – Skriptfunktion

Parameter und Ablauf:

  • ID="self" – der aktuelle Charakter, seine direkten Gegenstände mit einer Ebene ungleich Null werden ausgewählt.
  • items[i] – numerisch serial. Hex wird nur für die Ausgabe verwendet. Die Schleife greift nicht auf den letzten Index zu.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetEquipment("self");
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

3. Überprüfen Sie den ersten Datensatz vor dem Lesen – Skriptklasse

Parameter und Ablauf:

  • ID="self" – der aktuelle Charakter, seine direkten Gegenstände mit einer Ebene ungleich Null werden ausgewählt.
  • Es werden zwei verschiedene Dinge überprüft: der Datensatz im Snapshot und die aktuelle Existenz des Objekts. Ordnung ohne explizite Sortierung bedeutet nicht Nähe.
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 items = UO.GetEquipment("self");
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

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

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.GetEquipment(id) — UO.GetEquipment(Any)

Parameter: id (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getcontent":

                case "getequipment":

                {

                    InjectionValue selection = arguments[0];

                    bool ground = false, explicitZero;

                    int container;

                    if (selection.Kind == InjectionValueKind.String)

                    {

                        string text = Text(0).Trim();

                        ground = text.Equals("ground", StringComparison.OrdinalIgnoreCase);

                        explicitZero = NumberConversions.TryStr2Int(text, out int literal) && literal == 0;

                        container = ground ? 0 : text.Equals("my", StringComparison.OrdinalIgnoreCase)

                            ? bridge.Backpack : GetObject(text);

                    }

                    else

                    {

                        if (selection.Kind != InjectionValueKind.Integer && selection.Kind != InjectionValueKind.Decimal)

                            return new InjectionValue(Array.Empty<InjectionValue>());

                        container = Arg(0);

                        explicitZero = selection.Kind == InjectionValueKind.Integer ? selection.Integer == 0 : selection.Decimal == 0d;

                    }

                    // Only an explicit ground/zero selector may query world items.

                    if (container < 0 || container == 0 && !ground && !explicitZero)

                        return new InjectionValue(Array.Empty<InjectionValue>());

                    bool equipment = name.Equals("GetEquipment", StringComparison.OrdinalIgnoreCase);

                    int[] items = equipment

                        ? container == 0 ? Array.Empty<int>() : bridge.GetEquipment(container)

                        : bridge.GetContent(container);

                    return new InjectionValue(items.Select(serial => new InjectionValue(serial)).ToArray());

                }

UO.GetFireResist

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

C#-Signaturen

int UO.GetFireResist();

Liest das Widerstandsfeld des aktuellen Charakters: Feuer.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FireResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetFireResist();
UO.Print("FireResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetFireResist();
    await Delay(500);
    var after = UO.GetFireResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetFireResist();
        return value >= minimum;
    }

    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.GetFireResist() — UO.GetFireResist()

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

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


UO.GetFlying

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

C#-Signaturen

int UO.GetFlying();
int UO.GetFlying(object? value);

Überprüft, ob der Charakter gerade fliegt. Dies wird normalerweise für Gargoyle benötigt: zum Beispiel vor dem Starten einer Route oder vor der Anforderung, einen Flug zu ermöglichen. Beantwortet die Frage „Fliegt mein Charakter jetzt?“ ohne Argument. Der Befehl liest nur den Status: Er ermöglicht weder das Fliegen, Landen noch das Bewegen des Charakters.

Parameter

  • value – Optionales serial-Zeichen: Zahl, Hex-Zeichenfolge, self, lasttarget oder über UO.AddObject gespeicherter Name. Ohne Argument wird Ihr Charakter verwendet. Dies ist ID des spezifischen mobile, nicht graphic/type und nicht die Koordinate von Z. Ein unbekannter Name, fehlendes/entferntes mobile oder Element ergibt 0.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Prüfergebnis != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig. 1 - mobile hat IsFlying, 0 hat keine Flagge oder mobile fehlt. Die Höhe Z allein bedeutet noch keinen Flug.

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

  • Die wichtigste Spielanwendung ist der Flug von Gargoyle. Allerdings überprüft der Getter das Rennen nicht: In diesem Client liest er das 0x04-Bit von mobile mit der Protokollversion 7.0.0.0 und höher. Beim alten Protokoll wird 0 zurückgegeben. Stehen auf einem Dach, hohes Z, Flügelanimationen oder das Gargoyle-Rennen selbst sind kein Flugnachweis möglich.
  • Für den Zustandswechsel gibt es einen separaten UO.ToggleFly(): Dieser sendet eine Schaltanforderung statt eines „Einschalt“-Befehls. Wenn Sie bereits fliegen, fordert ein Wiederholungsruf die Landung an. Der Server kann ausfallen; Lesen Sie nach Aufforderung Flying erneut mit begrenzter Wartezeit. false ist auch ohne verfügbare Zeichen/Daten möglich, also prüfen Sie Connected, bevor Sie die Aktion abspielen.
  • Liest das lokale Modell: öffnet das Ziel nicht, fordert keinen Status an, ändert das Flag nicht und sendet das Paket nicht. Ein zerstörtes Objekt gilt bereits als fehlend, bevor der Eintrag aus dem Wörterbuch gelöscht wird.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.

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

1. Überprüfen Sie den Modus vor dem nächsten Skriptschritt – Direktskript

Parameter und Ablauf:

  • Leere Klammern geben self an. true ist gleich 1, false ist gleich 0; wenn UO.Flying() { ... } akzeptabel ist. Dieses Beispiel ändert nichts.
var active = UO.GetFlying();
if (Truth(Truth(active) == true))
{
    UO.Print("Flying mode active");
}
else
{
    UO.Print("Ground mode or character data unavailable");
}

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

2. Zuvor ausgewähltes Zeichen prüfen – Skriptfunktion

Parameter und Ablauf:

  • ReadState(obj) nimmt serial/alias und gibt den Status zurück. Die vollständige Definition finden Sie unten. Das Fehlen eines Objekts wird vor dem Lesen behandelt. Auch der Charakter einer anderen Person wird anhand der vom Client bereits empfangenen Daten überprüft.
return  RunScenario();
 object? RunScenario()
{
    var target = Asc(UO.GetSerial("lasttarget"), 0);
    if (Truth(target != 0) && Truth(UO.Exists(target)))
    {
        if (Truth(ReadState(target)))
        {
            UO.AddObject("flying_mobile", target);
        }
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    if (!(Truth(UO.Exists(obj))))
    {
        return false;
    }

    return UO.GetFlying(obj);
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

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

3. Einmal einen Flug anfordern und auf das Ergebnis warten – Szenarioklasse

Parameter und Ablauf:

  • Das Beispiel gilt für Ihren Gargoyle auf einem flugunterstützenden Server. EnsureFlight(timeoutMs) gibt 1/true zurück, wenn ein Flug beobachtet wird, andernfalls 0/false. 2000 — Wartelimit in Millisekunden; prüft alle 50 ms. Wenn Sie bereits fliegen, wird ToggleFly nicht aufgerufen. Es wird höchstens eine Anfrage gesendet, dann wird der Antwortstatus überprüft. Skriptpausen/Scheduler-Verzögerungen können die Echtzeit verlängern.
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(await EnsureFlight(2000)))
        {
            UO.Print("Flight confirmed; ready for the next stage");
        }
        else
        {
            UO.Print("Flight not confirmed; route was not started");
        }

        return null;
    }

    async Task<dynamic> EnsureFlight(dynamic timeoutMs)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
        {
            return false;
        }

        if (Truth(UO.GetFlying()))
        {
            return true;
        }

        UO.ToggleFly();
        var waited = 0;
        while (Truth(waited < timeoutMs))
        {
            if (!(Truth(UO.Connected())))
            {
                return false;
            }

            if (Truth(UO.GetFlying()))
            {
                return true;
            }

            await Delay(50);
            waited += 50;
        }

        return UO.GetFlying();
    }

    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.GetFlying() — UO.GetFlying()

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.

serial => bridge.Flying(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetFlying(value) — UO.GetFlying(Any)

Parameter: value (Any)

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.

serial => bridge.Flying(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetFrozen

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

C#-Signaturen

int UO.GetFrozen();
int UO.GetFrozen(object? value);

Überprüft die dem Client bekannte Lähmungsflagge des Charakters.

Parameter

  • value – Optional serial/ID mobile: Zahl, Hexadezimalzeichenfolge, self, lasttarget oder ein anderer Standardobjektname oder AddObject-Name. Dies ist nicht graphic/type. Ohne Argument wird self verwendet. Unbekannter Name wird in 0 aufgelöst; Ziel öffnet sich nicht.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – geladen mobile hat Flag IsParalyzed; 0 (Bedingung nicht erfüllt) – kein Flag, mobile unbekannt, gelöscht oder das Objekt ist ein Element. Dies ist keine Zeit der Lähmung und garantiert nicht die Bewegungsfähigkeit mit dem Ergebnis 0.

Verhalten

  • Verwenden Sie Paralyzed, um die Lähmungsflagge zu überprüfen. Die Varianten Is/Get, GetParalisa, Frozen und GetLocked lesen das gleiche Flag.
  • Der Befehl liest nur lokale Daten. Es wendet keine Lähmung an oder entfernt sie, wartet nicht auf deren Ende und sendet keine Aktualisierungsanforderung an den Server.
  • Das Ergebnis dieses Befehls ist vom Typ int: Verwenden Sie if (Wert != 0) oder if (Wert == 0). Direkte Vergleiche mit true/false und if (value) in C# sind nicht zulässig. Der Wert behält die Bedeutung des Flags bei, nicht die Menge oder ID.

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

1. Testen Sie sich selbst über true – Direktskript

Parameter und Ablauf:

  • Leere Klammern wählen self. Der Staat speichert einen Schnappschuss der Flagge. true ist die numerische Konstante 1.
  • Ein Ergebnis von false schließt eine Wand, mangelnde Ausdauer oder einen anderen Grund für das Anhalten nicht aus.
var state = UO.GetFrozen();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • target speichert die Hex-Zeichenfolge serial des letzten Ziels. IsNpc prüft, ob es sich um den geladenen mobile handelt, einschließlich der Spieler.
  • Der Befehl mit dem Argument lautet Ziel. Sie wählt keinen neuen Charakter und ändert auch nicht lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetFrozen(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Begrenzte Wartezeit bis zur Beseitigung der Lähmung – Szenarioklasse

Parameter und Ablauf:

  • Nicht mehr als 10 Pausen für 100 ms. Jeder Aufruf ohne Argument liest self erneut.
  • Nach der Schleife wird die Anwesenheit von self separat überprüft. Dies ist eine Beobachtung für etwa eine Sekunde plus die Ausführung von Befehlen und keine garantierte Beseitigung der Lähmung.
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 attempts = 0;
        while (Truth(Truth(UO.GetFrozen()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetFrozen()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.GetFrozen() — UO.GetFrozen()

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetFrozen(value) — UO.GetFrozen(Any)

Parameter: value (Any)

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetGold

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

C#-Signaturen

dynamic UO.GetGold();

Liest die Goldmenge aus dem Status des aktuellen Charakters.

Parameter

Es gibt keine Parameter.

Rückgabewert

int/double ist die nichtnegative Summe 0..4294967295. Bis einschließlich 2147483647 wird int zurückgegeben, oberhalb von double (Double) und stellt genau jede 32-Bit-Ganzzahl ohne Vorzeichen dar. 0 bedeutet auch, dass es keinen aktuell wiederhergestellten Spieler oder empfangenen Betrag gibt. Es geht nicht um bool, ID, Anzahl der Stapel oder Rucksack-/Bank-Bypass.

Verhalten

  • Es gibt keine Parameter. Liest den Cache von Player.Gold von CharacterStatus (0x11). Der Server bestimmt, welches Gold in seinem Zähler enthalten ist; Das Team geht nicht durch die Taschen und fragt nicht nach dem Kontostand. Kein/zerstörter Spieler – 0; Ein vorhandener Geist kann einen Statuswert aufrechterhalten.
  • ReadGoldValue liest einmal „bridge.Gold“. Die alte C#-Brücke behält die Int32-Signatur und überträgt UInt32-Bits. Eine ungeprüfte Konvertierung stellt die vorzeichenlose Summe wieder her. Eine kleine Menge wird zu int, eine große Menge zu double. Das höchstwertige Bit macht den Saldo nicht mehr negativ. Die Konvertierung erfolgt lokal, es gibt keine Pakete.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

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

1. Den erhaltenen Betrag abheben – direktes Skript

Parameter und Ablauf:

  • Betrag speichert ein Ergebnis; Convert.ToString formatiert es für das Magazin. Gold wird nicht gesucht, getragen oder ausgegeben.
var amount = UO.GetGold();
UO.Print("Status gold: " + Convert.ToString(amount));

2. Volle Funktion CanAfford mit großem Preis – Skriptfunktion

Parameter und Ablauf:

  • preis=3000000000.0 ist ein Beispiel für den Preis, nicht das Limit. CanAfford(Preis) lehnt einen negativen Preis oder keinen Player ab, liest den Betrag einmal und gibt bool zurück: true oder false, wenn Betrag >= Preis. Der Betrag selbst beträgt nicht bool. Die Funktion ist unten vollständig definiert.
return  RunScenario();
 object? RunScenario()
{
    var price = 3000000000.0;
    if (Truth(Truth(CanAfford(price)) == true))
    {
        UO.Print("Local balance is sufficient");
    }
    else
    {
        UO.Print("Local check failed");
    }

    return null;
}

dynamic CanAfford(dynamic price)
{
    if (Truth(price < 0) || Truth(UO.Self() == 0))
    {
        return false;
    }

    var amount = UO.GetGold();
    return amount >= price;
}

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

3. Beobachten Sie die Balance-Änderung – Skriptklasse

Parameter und Ablauf:

  • Vorher/Nachher trennt UO.Wait(500) Millisekunden. differenz=nachher-vorher kann negativ sein, wenn der Saldo abnimmt; Dies ist kein behobener Überlauf eines vorzeichenlosen Zählers. Zwischenaktualisierungen und Charakteränderungen können unter Umständen ü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.GetGold();
        await Delay(500);
        var after = UO.GetGold();
        var difference = after - before;
        UO.Print("Balance change: " + Convert.ToString(difference));
        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.GetGold() — UO.GetGold()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

private InjectionValue ReadGoldValue()

        {

            // The existing bridge carries all 32 unsigned status-counter bits in

            // an Int32. Keep small results Integer; Double exactly represents

            // every UInt32 and avoids returning a negative large gold amount.

            uint amount = unchecked((uint)bridge.Gold);

            return amount <= int.MaxValue ? new InjectionValue((int)amount)

                : new InjectionValue((double)amount);

        }

UO.GetHP

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

C#-Signaturen

int UO.GetHP();
int UO.GetHP(object? id);

Liest den aktuellen Zustand aus dem lokalen Modell.

Parameter

  • id – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

int ist der Wert des Feldes Treffer, nicht der Prozentsatz und nicht bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

Beispiel .csx

int hp = UO.GetHP();
UO.Print($"HP = {hp}");

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetHP();
UO.Print("GetHP: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetHP();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt; Exists prüft die Existenz. obj ist der einzige Parameter von ReadValue. Die Funktion gibt die Befehlsnummer unverändert zurück und wird vollständig angegeben.
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 value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetHP(obj);
    }

    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.GetHP() — UO.GetHP()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetHP(id) — UO.GetHP(Any)

Parameter: id (Any/Integer/String)

Ergebnis: int / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "gethp": return new InjectionValue(bridge.GetHP(Arg(0, bridge.Self)));

UO.GetHP(id) — UO.GetHP(Integer)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetHP(id) — UO.GetHP(String)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetHidden

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

C#-Signaturen

int UO.GetHidden();
int UO.GetHidden(object? value);

Testet die Tarnung des Charakters.

Parameter

  • value – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Prüfergebnis != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig. 1 - mobile hat IsHidden, 0 hat keine Flagge oder mobile fehlt. Dies ist eine Serverflagge, keine Sichtbarkeit hinter einer Wand.

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

  • Liest das lokale Modell: öffnet das Ziel nicht, fordert keinen Status an, ändert das Flag nicht und sendet das Paket nicht. Ein zerstörtes Objekt gilt bereits als fehlend, bevor der Eintrag aus dem Wörterbuch gelöscht wird.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.

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

1. Überprüfen Sie Ihren eigenen Status – direktes Skript

Parameter und Ablauf:

  • Leere Klammern lauten self. aktiv speichert das Ergebnis einmal; true und false definieren zwei Zweige. Print zeigt nur eine Beispielnachricht an.
var active = UO.GetHidden();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. Ausgewähltes Objekt und volle Funktion ReadState – Skriptfunktion

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt. Exists prüft, ob es vorhanden ist. obj ist der einzige Parameter ReadState; Die Funktion gibt das Ergebnis des Befehls ohne Änderung zurück. Seine Definition ist im kopierten Code enthalten.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.GetHidden(obj);
}

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 eine Änderung in einer halben Sekunde – Skriptklasse

Parameter und Ablauf:

  • Zwei Aufrufe ohne Argumente lesen self, UO.Wait(500) setzt 500 Millisekunden. Zwei Bilder werden verglichen; Zwischenübergänge können übersprungen werden. Es gibt kein endloses Warten.
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.GetHidden();
        await Delay(500);
        var after = UO.GetHidden();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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;
}

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.GetHidden() — UO.GetHidden()

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.

serial => bridge.Hidden(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetHidden(value) — UO.GetHidden(Any)

Parameter: value (Any)

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.

serial => bridge.Hidden(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetInt

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

C#-Signaturen

int UO.GetInt();
int UO.GetInt(object? objID);

Liest die aktuelle Intelligenz (Intelligence, INT) des Charakters.

Parameter

  • objID – ObjID nur in der gezeigten Form, mit einem Argument: serial Zeichennummer, Dezimal-/0x-Hex-Zeichenfolge, „self“, „lasttarget“ oder Name AddObject. Wählt ein anderes Objekt als graphic/type aus. Ohne Argument wird das aktuelle Zeichen gelesen.

Rückgabewert

int – aktuelle Statistikpunkte, 0..65535 im Client-Modell; nicht Prozentsatz, ID, Fähigkeit, Sperrmodus oder bool. 0 bedeutet auch fehlendes/gelöschtes Zeichen oder unzugängliches Objekt. Vergleichen Sie mit der numerischen Anforderung, nicht == true. Dies ist keine statistische Obergrenze oder ein garantierter Basiswert ohne Modifikatoren.

Verhalten

  • Unterstützt werden () für self und (ObjID) für ein explizites Objekt. Es gibt keine weiteren optionalen Argumente.
  • Liest Player.Intelligence, wenn Player existiert und nicht zerstört wurde; andernfalls 0. Ein vorhandener toter Charakter ist kein entferntes Objekt. Der Wert wird nicht aus HP, Mana oder Ausdauer berechnet.
  • GetStr/GetInt/GetDex akzeptieren ObjID. PlayerMobile-Daten sind nur für self verfügbar; für ein weiteres serial - 0, auch für geladenes mobile. Die Eigenschaften einer anderen Person werden nicht ersetzt oder erraten.
  • Aufrufen von Lesevorgängen im Spielstream mit der Möglichkeit, das Warten per Skript abzubrechen. Fragt den Status nicht ab, öffnet kein Ziel, sendet kein Paket, ändert die Eigenschaften nicht und fügt keine Verzögerung hinzu.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().
  • ExecuteClientApiCompatibility.Arg löst zuerst den Objektnamen auf und konvertiert dann die Nummer. Eine unbekannte nicht-numerische Zeichenfolge verursacht einen Konvertierungsfehler, kein Ziel. double wird auf int reduziert, Array/void wird auf 0 reduziert. Um ein Zeichen auszuwählen, verwenden Sie das richtige serial, nicht solche Transformationen.

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

1. Punkte lesen und anzeigen - direktes Skript

Parameter und Ablauf:

  • value speichert das numerische Ergebnis; Convert.ToString formatiert es nur für das Magazin. Es gibt keine Argumente oder Charakteraktionen.
var value = UO.GetInt();
UO.Print("Intelligence: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • vor und nach separaten 1000 ms; UO.Wait zum Beispiel hinzugefügt. change=after-before kann positiv, null oder negativ sein. An sich unterscheidet es nicht zwischen allen Zwischenaktualisierungen und dem Verlassen der Welt.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetInt();
    await Delay(1000);
    var after = UO.GetInt();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. Vollständige Anforderungsvalidierungsfunktion – Skriptklasse

Parameter und Ablauf:

  • Minimum=80 ist ein Beispiel für eine Anforderung, kein Client-Limit. AttributeAtLeast(Minimum) lehnt das fehlende Zeichen ab, liest das Merkmal einmal und gibt bool zurück: true oder false, wenn >= Minimum. Die logische Bedeutung ergibt sich aus dem Vergleich, nicht aus dem Merkmal selbst.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetInt();
        return value >= minimum;
    }

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

4. Wählen Sie das Zeichen mit serial und dem Objektnamen aus – direktes Skript

Parameter und Ablauf:

  • id ist das Ergebnis von UO.Self(), nicht type. AddObject speichert ID als statSubject ohne Gültigkeitsbereich, da das zweite Argument angegeben ist. Bei beiden Aufrufen wird das gleiche Zeichen ausgewählt, die Messwerte sind jedoch nicht atomar.
var id = UO.Self();
if (Truth(id != 0))
{
    UO.AddObject("statSubject", id);
    var direct = UO.GetInt(id);
    var byName = UO.GetInt("statSubject");
    UO.Print("Direct: " + Convert.ToString(direct) + "; alias: " + Convert.ToString(byName));
}

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.GetInt() — UO.GetInt()

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

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

UO.GetInt(objID) — UO.GetInt(Any)

Parameter: objID (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getint": return new InjectionValue(arguments.Length > 0 ? bridge.GetIntelligence(Arg(0)) : bridge.Intelligence);

UO.GetIntelligence

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

C#-Signaturen

int UO.GetIntelligence();

Liest die aktuelle Intelligenz (Intelligence, INT) des Charakters.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – aktuelle Statistikpunkte, 0..65535 im Client-Modell; nicht Prozentsatz, ID, Fähigkeit, Sperrmodus oder bool. 0 bedeutet auch fehlendes/gelöschtes Zeichen oder unzugängliches Objekt. Vergleichen Sie mit der numerischen Anforderung, nicht == true. Dies ist keine statistische Obergrenze oder ein garantierter Basiswert ohne Modifikatoren.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Liest Player.Intelligence, wenn Player existiert und nicht zerstört wurde; andernfalls 0. Ein vorhandener toter Charakter ist kein entferntes Objekt. Der Wert wird nicht aus HP, Mana oder Ausdauer berechnet.
  • GetStr/GetInt/GetDex akzeptieren ObjID. PlayerMobile-Daten sind nur für self verfügbar; für ein weiteres serial - 0, auch für geladenes mobile. Die Eigenschaften einer anderen Person werden nicht ersetzt oder erraten.
  • Aufrufen von Lesevorgängen im Spielstream mit der Möglichkeit, das Warten per Skript abzubrechen. Fragt den Status nicht ab, öffnet kein Ziel, sendet kein Paket, ändert die Eigenschaften nicht und fügt keine Verzögerung hinzu.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().

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

1. Punkte lesen und anzeigen - direktes Skript

Parameter und Ablauf:

  • value speichert das numerische Ergebnis; Convert.ToString formatiert es nur für das Magazin. Es gibt keine Argumente oder Charakteraktionen.
var value = UO.GetIntelligence();
UO.Print("Intelligence: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • vor und nach separaten 1000 ms; UO.Wait zum Beispiel hinzugefügt. change=after-before kann positiv, null oder negativ sein. An sich unterscheidet es nicht zwischen allen Zwischenaktualisierungen und dem Verlassen der Welt.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetIntelligence();
    await Delay(1000);
    var after = UO.GetIntelligence();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. Vollständige Anforderungsvalidierungsfunktion – Skriptklasse

Parameter und Ablauf:

  • Minimum=80 ist ein Beispiel für eine Anforderung, kein Client-Limit. AttributeAtLeast(Minimum) lehnt das fehlende Zeichen ab, liest das Merkmal einmal und gibt bool zurück: true oder false, wenn >= Minimum. Die logische Bedeutung ergibt sich aus dem Vergleich, nicht aus dem Merkmal selbst.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetIntelligence();
        return value >= minimum;
    }

    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.GetIntelligence() — UO.GetIntelligence()

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

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


UO.GetLife

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

C#-Signaturen

int UO.GetLife();

Liest den aktuellen Zustand aus dem lokalen Modell.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der Wert des Feldes Treffer, nicht der Prozentsatz und nicht bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetLife();
UO.Print("GetLife: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetLife();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.GetLife();
    }

    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.GetLife() — UO.GetLife()

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.GetHP(bridge.Self)

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


UO.GetLuck

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

C#-Signaturen

int UO.GetLuck();

Liest den Statuszähler deines Charakters: Glückspunkte.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – Glückspunkte, 0..65535 im Kundenmodell. 0 kann ein echter Wert, keine Daten oder ein fehlender/zerstörter Player sein. Dies ist eine Menge, nicht bool, ID oder type: 1 bedeutet eine Einheit, nicht Erfolg. Der Befehl iteriert nicht über Objekte und gibt kein Array zurück.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Luck, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Luck liest als UInt16 gespeicherte Server-Glückspunkte aus dem Status type >= 4. Dabei handelt es sich nicht um einen Prozentsatz, keine Zufallszahl oder eine Garantie für die Qualität der Beute. Beim Lesen berechnet der Kunde nicht die Droprate und fügt keine Ausrüstungsboni hinzu.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

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

1. Gespeicherten Zähler anzeigen – direktes Skript

Parameter und Ablauf:

  • value speichert einen Aufruf ohne Argumente für sein eigenes Zeichen; Convert.ToString formatiert die Zahl für das Protokoll, ohne ihre Bedeutung zu ändern.
var value = UO.GetLuck();
UO.Print("Luck: " + Convert.ToString(value));

2. Änderung beobachten – Skriptfunktion

Parameter und Ablauf:

  • UO.Wait(500) trennt Vorher und Nachher um 500 Millisekunden. Die Differenz kann positiv, null oder negativ sein; Zwischenaktualisierungen und Charakteränderungen können übersprungen werden. Pause ist ein Beispiel.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetLuck();
    await Delay(500);
    var after = UO.GetLuck();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • LuckAtLeast(Minimum) erhält eine numerische Anforderung; 1000 ist ein Beispiel, kein Grenzwert oder Prozentsatz. Lehnt die Abwesenheit eines Spielers ab, liest Glück einmal und gibt bool: true oder false nach Wert >= Minimum zurück. Glück selbst ist nicht bool. Zwischengespeicherte Punkte werden verglichen und Beuteverluste werden nicht vorhergesagt.
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(Truth(LuckAtLeast(1000)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic LuckAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetLuck();
        return value >= minimum;
    }

    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.GetLuck() — UO.GetLuck()

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

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


UO.GetMana

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

C#-Signaturen

int UO.GetMana();
dynamic UO.GetMana(object? objID);

Liest das aktuelle Mana aus dem lokalen Modell.

Parameter

  • objID – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

int ist der Wert des Feldes Mana, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMana();
UO.Print("GetMana: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMana();
    if (Truth(value >= 10))
    {
        UO.Print("At least ten mana points are known");
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt; Exists prüft die Existenz. obj ist der einzige Parameter von ReadValue. Die Funktion gibt die Befehlsnummer unverändert zurück und wird vollständig angegeben.
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 value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetMana(obj);
    }

    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.GetMana() — UO.GetMana()

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

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

UO.GetMana(objID) — UO.GetMana(Any)

Parameter: objID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmana": return new InjectionValue(arguments.Length > 0 ? bridge.GetMana(Arg(0)) : bridge.Mana);

UO.GetMaxHP

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

C#-Signaturen

int UO.GetMaxHP();
int UO.GetMaxHP(object? id);

Liest den maximalen Zustand aus dem lokalen Modell.

Parameter

  • id – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

int ist der Wert des Feldes HitsMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMaxHP();
UO.Print("GetMaxHP: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxHP();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt; Exists prüft die Existenz. obj ist der einzige Parameter von ReadValue. Die Funktion gibt die Befehlsnummer unverändert zurück und wird vollständig angegeben.
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 value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetMaxHP(obj);
    }

    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.GetMaxHP() — UO.GetMaxHP()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetMaxHP(id) — UO.GetMaxHP(Any)

Parameter: id (Any/Integer/String)

Ergebnis: int / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmaxhp": return new InjectionValue(bridge.GetMaxHP(Arg(0, bridge.Self)));

UO.GetMaxHP(id) — UO.GetMaxHP(Integer)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetMaxHP(id) — UO.GetMaxHP(String)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetMaxLife

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

C#-Signaturen

int UO.GetMaxLife();

Liest den maximalen Zustand aus dem lokalen Modell.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der Wert des Feldes HitsMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMaxLife();
UO.Print("GetMaxLife: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxLife();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.GetMaxLife();
    }

    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.GetMaxLife() — UO.GetMaxLife()

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.GetMaxHP(bridge.Self)

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


UO.GetMaxMana

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

C#-Signaturen

int UO.GetMaxMana();
dynamic UO.GetMaxMana(object? objID);

Liest maximales Mana vom lokalen Modell.

Parameter

  • objID – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

int ist der Wert des Feldes ManaMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMaxMana();
UO.Print("GetMaxMana: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxMana();
    if (Truth(value > 0))
    {
        UO.Print("Mana percent: " + Convert.ToString(UO.Mana() * 100 / value));
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt; Exists prüft die Existenz. obj ist der einzige Parameter von ReadValue. Die Funktion gibt die Befehlsnummer unverändert zurück und wird vollständig angegeben.
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 value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetMaxMana(obj);
    }

    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.GetMaxMana() — UO.GetMaxMana()

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

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

UO.GetMaxMana(objID) — UO.GetMaxMana(Any)

Parameter: objID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmaxmana": return new InjectionValue(bridge.GetMaxMana(Arg(0, bridge.Self)));

UO.GetMaxStam

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

C#-Signaturen

int UO.GetMaxStam();
dynamic UO.GetMaxStam(object? objID);

Liest die maximale Ausdauer aus dem lokalen Modell.

Parameter

  • objID – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

int ist der Wert des Feldes StaminaMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMaxStam();
UO.Print("GetMaxStam: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxStam();
    if (Truth(value > 0))
    {
        UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt; Exists prüft die Existenz. obj ist der einzige Parameter von ReadValue. Die Funktion gibt die Befehlsnummer unverändert zurück und wird vollständig angegeben.
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 value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetMaxStam(obj);
    }

    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.GetMaxStam() — UO.GetMaxStam()

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

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

UO.GetMaxStam(objID) — UO.GetMaxStam(Any)

Parameter: objID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmaxstam": return new InjectionValue(bridge.GetMaxStamina(Arg(0, bridge.Self)));

UO.GetMaxStamina

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

C#-Signaturen

int UO.GetMaxStamina();

Liest die maximale Ausdauer aus dem lokalen Modell.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der Wert des Feldes StaminaMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.

Verhalten

  • Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
  • Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.

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

1. Drucken Sie den Wert Ihres Charakters aus – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.GetMaxStamina();
UO.Print("GetMaxStamina: " + Convert.ToString(value));

2. Wert in Prüfung oder Berechnung anwenden – Skriptfunktion

Parameter und Ablauf:

  • Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxStamina();
    if (Truth(value > 0))
    {
        UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
    }

    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 ReadValue – Skriptklasse

Parameter und Ablauf:

  • Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.GetMaxStamina();
    }

    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.GetMaxStamina() — UO.GetMaxStamina()

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

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


UO.GetMaxWeight

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

C#-Signaturen

int UO.GetMaxWeight();

Liest den Statuszähler deines Charakters: maximales Gewicht in Steinen.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – maximales Gewicht in Steinen, 0..65535 im Kundenmodell. 0 kann ein echter Wert, keine Daten oder ein fehlender/zerstörter Player sein. Dies ist eine Menge, nicht bool, ID oder type: 1 bedeutet eine Einheit, nicht Erfolg. Der Befehl iteriert nicht über Objekte und gibt kein Array zurück.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.WeightMax, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • MaxWeight liest den WeightMax-Cache. Der native Status type >= 5 setzt das Serverlimit auf UInt16, auch wenn es gleich 0 ist. Der alte erweiterte Status berechnet ihn einmalig beim Empfang: Protokoll UO >= 5.0.0a - 7 * floor(Strength / 2) + 40; die ältere ist Strength * 4 + 25. Das Ergebnis wird als UInt16 gespeichert; Extremwerte werden modulo 65536 umschlossen. Konvertieren.ToString=101 ergibt 390 bzw. 429. Wenn Strength separat geändert wird, berechnet der Getter selbst den Grenzwert nicht neu.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

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

1. Gespeicherten Zähler anzeigen – direktes Skript

Parameter und Ablauf:

  • value speichert einen Aufruf ohne Argumente für sein eigenes Zeichen; Convert.ToString formatiert die Zahl für das Protokoll, ohne ihre Bedeutung zu ändern.
var value = UO.GetMaxWeight();
UO.Print("WeightMax: " + Convert.ToString(value));

2. Änderung beobachten – Skriptfunktion

Parameter und Ablauf:

  • UO.Wait(500) trennt Vorher und Nachher um 500 Millisekunden. Die Differenz kann positiv, null oder negativ sein; Zwischenaktualisierungen und Charakteränderungen können übersprungen werden. Pause ist ein Beispiel.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetMaxWeight();
    await Delay(500);
    var after = UO.GetMaxWeight();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • CanCarry(extra) erhält zusätzliches Gewicht in Steinen; 10 ist ein Beispiel, nicht die Anzahl der Stapel. Lehnt negatives Extra, kein Spieler oder Maximum <= 0 ab, liest das aktuelle Gewicht und Limit und gibt dann bool zurück: true oder false durch Extra <= Maximum – aktuell. Durch Subtraktion wird ein aktueller + zusätzlicher Überlauf vermieden. Bei Überladung ist das Ergebnis false, auch für extra=0. Dies ist eine lokale Bewertung, keine Serverlösung; Lesevorgänge sind nicht atomar und die Nullgewichtung ist möglicherweise unbekannt.
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(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic CanCarry(dynamic extra)
    {
        if (Truth(extra < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Weight();
        var maximum = UO.GetMaxWeight();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extra <= maximum - current;
    }

    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.GetMaxWeight() — UO.GetMaxWeight()

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

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


UO.GetParalisa

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

C#-Signaturen

int UO.GetParalisa();
int UO.GetParalisa(object? value);

Überprüft die dem Client bekannte Lähmungsflagge des Charakters.

Parameter

  • value – Optional serial/ID mobile: Zahl, Hexadezimalzeichenfolge, self, lasttarget oder ein anderer Standardobjektname oder AddObject-Name. Dies ist nicht graphic/type. Ohne Argument wird self verwendet. Unbekannter Name wird in 0 aufgelöst; Ziel öffnet sich nicht.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – geladen mobile hat Flag IsParalyzed; 0 (Bedingung nicht erfüllt) – kein Flag, mobile unbekannt, gelöscht oder das Objekt ist ein Element. Dies ist keine Zeit der Lähmung und garantiert nicht die Bewegungsfähigkeit mit dem Ergebnis 0.

Verhalten

  • Verwenden Sie Paralyzed, um die Lähmungsflagge zu überprüfen. Die Varianten Is/Get, GetParalisa, Frozen und GetLocked lesen das gleiche Flag.
  • Der Befehl liest nur lokale Daten. Es wendet keine Lähmung an oder entfernt sie, wartet nicht auf deren Ende und sendet keine Aktualisierungsanforderung an den Server.
  • Das Ergebnis dieses Befehls ist vom Typ int: Verwenden Sie if (Wert != 0) oder if (Wert == 0). Direkte Vergleiche mit true/false und if (value) in C# sind nicht zulässig. Der Wert behält die Bedeutung des Flags bei, nicht die Menge oder ID.

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

1. Testen Sie sich selbst über true – Direktskript

Parameter und Ablauf:

  • Leere Klammern wählen self. Der Staat speichert einen Schnappschuss der Flagge. true ist die numerische Konstante 1.
  • Ein Ergebnis von false schließt eine Wand, mangelnde Ausdauer oder einen anderen Grund für das Anhalten nicht aus.
var state = UO.GetParalisa();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • target speichert die Hex-Zeichenfolge serial des letzten Ziels. IsNpc prüft, ob es sich um den geladenen mobile handelt, einschließlich der Spieler.
  • Der Befehl mit dem Argument lautet Ziel. Sie wählt keinen neuen Charakter und ändert auch nicht lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetParalisa(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Begrenzte Wartezeit bis zur Beseitigung der Lähmung – Szenarioklasse

Parameter und Ablauf:

  • Nicht mehr als 10 Pausen für 100 ms. Jeder Aufruf ohne Argument liest self erneut.
  • Nach der Schleife wird die Anwesenheit von self separat überprüft. Dies ist eine Beobachtung für etwa eine Sekunde plus die Ausführung von Befehlen und keine garantierte Beseitigung der Lähmung.
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 attempts = 0;
        while (Truth(Truth(UO.GetParalisa()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalisa()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.GetParalisa() — UO.GetParalisa()

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetParalisa(value) — UO.GetParalisa(Any)

Parameter: value (Any)

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetParalysed

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

C#-Signaturen

int UO.GetParalysed();
int UO.GetParalysed(object? value);

Überprüft die dem Client bekannte Lähmungsflagge des Charakters.

Parameter

  • value – Optional serial/ID mobile: Zahl, Hexadezimalzeichenfolge, self, lasttarget oder ein anderer Standardobjektname oder AddObject-Name. Dies ist nicht graphic/type. Ohne Argument wird self verwendet. Unbekannter Name wird in 0 aufgelöst; Ziel öffnet sich nicht.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – geladen mobile hat Flag IsParalyzed; 0 (Bedingung nicht erfüllt) – kein Flag, mobile unbekannt, gelöscht oder das Objekt ist ein Element. Dies ist keine Zeit der Lähmung und garantiert nicht die Bewegungsfähigkeit mit dem Ergebnis 0.

Verhalten

  • Verwenden Sie Paralyzed, um die Lähmungsflagge zu überprüfen. Die Varianten Is/Get, GetParalisa, Frozen und GetLocked lesen das gleiche Flag.
  • Der Befehl liest nur lokale Daten. Es wendet keine Lähmung an oder entfernt sie, wartet nicht auf deren Ende und sendet keine Aktualisierungsanforderung an den Server.
  • Das Ergebnis dieses Befehls ist vom Typ int: Verwenden Sie if (Wert != 0) oder if (Wert == 0). Direkte Vergleiche mit true/false und if (value) in C# sind nicht zulässig. Der Wert behält die Bedeutung des Flags bei, nicht die Menge oder ID.

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

1. Testen Sie sich selbst über true – Direktskript

Parameter und Ablauf:

  • Leere Klammern wählen self. Der Staat speichert einen Schnappschuss der Flagge. true ist die numerische Konstante 1.
  • Ein Ergebnis von false schließt eine Wand, mangelnde Ausdauer oder einen anderen Grund für das Anhalten nicht aus.
var state = UO.GetParalysed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • target speichert die Hex-Zeichenfolge serial des letzten Ziels. IsNpc prüft, ob es sich um den geladenen mobile handelt, einschließlich der Spieler.
  • Der Befehl mit dem Argument lautet Ziel. Sie wählt keinen neuen Charakter und ändert auch nicht lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetParalysed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Begrenzte Wartezeit bis zur Beseitigung der Lähmung – Szenarioklasse

Parameter und Ablauf:

  • Nicht mehr als 10 Pausen für 100 ms. Jeder Aufruf ohne Argument liest self erneut.
  • Nach der Schleife wird die Anwesenheit von self separat überprüft. Dies ist eine Beobachtung für etwa eine Sekunde plus die Ausführung von Befehlen und keine garantierte Beseitigung der Lähmung.
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 attempts = 0;
        while (Truth(Truth(UO.GetParalysed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalysed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.GetParalysed() — UO.GetParalysed()

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetParalysed(value) — UO.GetParalysed(Any)

Parameter: value (Any)

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetParalyzed

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

C#-Signaturen

int UO.GetParalyzed();
int UO.GetParalyzed(object? value);

Überprüft die dem Client bekannte Lähmungsflagge des Charakters.

Parameter

  • value – Optional serial/ID mobile: Zahl, Hexadezimalzeichenfolge, self, lasttarget oder ein anderer Standardobjektname oder AddObject-Name. Dies ist nicht graphic/type. Ohne Argument wird self verwendet. Unbekannter Name wird in 0 aufgelöst; Ziel öffnet sich nicht.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – geladen mobile hat Flag IsParalyzed; 0 (Bedingung nicht erfüllt) – kein Flag, mobile unbekannt, gelöscht oder das Objekt ist ein Element. Dies ist keine Zeit der Lähmung und garantiert nicht die Bewegungsfähigkeit mit dem Ergebnis 0.

Verhalten

  • Verwenden Sie Paralyzed, um die Lähmungsflagge zu überprüfen. Die Varianten Is/Get, GetParalisa, Frozen und GetLocked lesen das gleiche Flag.
  • Der Befehl liest nur lokale Daten. Es wendet keine Lähmung an oder entfernt sie, wartet nicht auf deren Ende und sendet keine Aktualisierungsanforderung an den Server.
  • Das Ergebnis dieses Befehls ist vom Typ int: Verwenden Sie if (Wert != 0) oder if (Wert == 0). Direkte Vergleiche mit true/false und if (value) in C# sind nicht zulässig. Der Wert behält die Bedeutung des Flags bei, nicht die Menge oder ID.

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

1. Testen Sie sich selbst über true – Direktskript

Parameter und Ablauf:

  • Leere Klammern wählen self. Der Staat speichert einen Schnappschuss der Flagge. true ist die numerische Konstante 1.
  • Ein Ergebnis von false schließt eine Wand, mangelnde Ausdauer oder einen anderen Grund für das Anhalten nicht aus.
var state = UO.GetParalyzed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • target speichert die Hex-Zeichenfolge serial des letzten Ziels. IsNpc prüft, ob es sich um den geladenen mobile handelt, einschließlich der Spieler.
  • Der Befehl mit dem Argument lautet Ziel. Sie wählt keinen neuen Charakter und ändert auch nicht lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetParalyzed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Begrenzte Wartezeit bis zur Beseitigung der Lähmung – Szenarioklasse

Parameter und Ablauf:

  • Nicht mehr als 10 Pausen für 100 ms. Jeder Aufruf ohne Argument liest self erneut.
  • Nach der Schleife wird die Anwesenheit von self separat überprüft. Dies ist eine Beobachtung für etwa eine Sekunde plus die Ausführung von Befehlen und keine garantierte Beseitigung der Lähmung.
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 attempts = 0;
        while (Truth(Truth(UO.GetParalyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalyzed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.GetParalyzed() — UO.GetParalyzed()

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetParalyzed(value) — UO.GetParalyzed(Any)

Parameter: value (Any)

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.

serial => bridge.GetLocked(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetPhysicalResist

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

C#-Signaturen

int UO.GetPhysicalResist();

Liest das Widerstandsfeld des aktuellen Charakters: physische Rüstung/Widerstand.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.PhysicalResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PhysicalResistance – Server-Rüstungs-/Statusfeld: Der klassische Server kann die Rüstungsbewertung übertragen, und Regeln mit Widerständen können physischen Widerstand übertragen. API konvertiert nicht von einem zum anderen und berechnet nicht den Prozentsatz der Schadensreduzierung. Armor und physische Aliase lesen dasselbe Feld.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetPhysicalResist();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetPhysicalResist();
    await Delay(500);
    var after = UO.GetPhysicalResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetPhysicalResist();
        return value >= minimum;
    }

    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.GetPhysicalResist() — UO.GetPhysicalResist()

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

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


UO.GetPlayerStatusText

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

C#-Signaturen

dynamic UO.GetPlayerStatusText(object? objID);

Erzeugt einen kurzen Text mit dem Namen und dem Zustand des Objekts.

Parameter

  • objID – Seriell/ID eines bestimmten Objekts: int, Dezimal-/Hex-Zeichenfolge oder Set-Alias ​​self, backpack, lasttarget, lastobject oder Name AddObject. Dies ist nicht graphic/type.

Rückgabewert

string im Format „Name HP/MaxHP“. Zum Beispiel „Rabe 75/100“. Für ein unbekanntes Objekt normalerweise „0/0“ mit einem führenden Leerzeichen. Dies ist Text, keine Struktur, bool oder ein offener Status-Gump.

Verhalten

  • GetName/GetHP/GetMaxHP werden gelesen, ohne nach einem Update zu fragen. Analysieren Sie Text nicht nach Leerzeichen, um ID oder HP zu erhalten: Der Name kann Leerzeichen enthalten. Verwenden Sie separate Getter-Befehle für Zahlen.

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

1. Zeigen Sie Ihre Gesundheit – direktes Drehbuch

Parameter und Ablauf:

  • ObjID=self – aktuelles Zeichen.
  • Print zeigt den fertigen Text im Journal.
UO.Print(UO.GetPlayerStatusText("self"));

2. Überprüfen Sie das Ziel, bevor Sie es anzeigen – Skriptfunktion

Parameter und Ablauf:

  • ObjID=serial des letzten Ziels.
  • Exists verhindert die Ausgabe eines unbekannten Objekts wie 0/0.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        UO.Print(UO.GetPlayerStatusText(target));
    }

    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. Zwei Schnappschüsse speichern – Skriptklasse

Parameter und Ablauf:

  • 500 – Millisekunden zwischen den Messwerten.
  • Der Text des Namens/HP wird verglichen, nicht alle Eigenschaften des Charakters.
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.GetPlayerStatusText("self");
        await Delay(500);
        var after = UO.GetPlayerStatusText("self");
        if (Truth(before != after))
        {
            UO.Print(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;
}

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.GetPlayerStatusText(objID) — UO.GetPlayerStatusText(Any)

Parameter: objID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getplayerstatustext": return new InjectionValue(bridge.GetName(Arg(0)) + " " + bridge.GetHP(Arg(0)) + "/" + bridge.GetMaxHP(Arg(0)));

UO.GetPoisonResist

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

C#-Signaturen

int UO.GetPoisonResist();

Liest das Widerstandsfeld des aktuellen Charakters: Gift.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.PoisonResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetPoisonResist();
UO.Print("PoisonResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetPoisonResist();
    await Delay(500);
    var after = UO.GetPoisonResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetPoisonResist();
        return value >= minimum;
    }

    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.GetPoisonResist() — UO.GetPoisonResist()

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

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


UO.GetPoisoned

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

C#-Signaturen

int UO.GetPoisoned();
int UO.GetPoisoned(object? value);

Überprüft die Vergiftung des Charakters.

Parameter

  • value – Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Prüfergebnis != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig. 1 - mobile hat IsPoisoned, 0 hat keine Flagge oder mobile fehlt. Der Giftgrad und die verbleibende Zeit werden nicht zurückgegeben.

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

  • Liest das lokale Modell: öffnet das Ziel nicht, fordert keinen Status an, ändert das Flag nicht und sendet das Paket nicht. Ein zerstörtes Objekt gilt bereits als fehlend, bevor der Eintrag aus dem Wörterbuch gelöscht wird.
  • Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
  • Für Poisoned/Flying wird die Protokollversion berücksichtigt: bis 7.0.0.0 Bit 0x04 bedeutet Poison; beginnend mit 7.0.0.0 bedeutet es Flucht und das Gift wird separat gelagert. Der Flug wird nicht von Z aus berechnet.

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

1. Überprüfen Sie Ihren eigenen Status – direktes Skript

Parameter und Ablauf:

  • Leere Klammern lauten self. aktiv speichert das Ergebnis einmal; true und false definieren zwei Zweige. Print zeigt nur eine Beispielnachricht an.
var active = UO.GetPoisoned();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. Ausgewähltes Objekt und volle Funktion ReadState – Skriptfunktion

Parameter und Ablauf:

  • lasttarget – zuvor ausgewähltes Objekt. Exists prüft, ob es vorhanden ist. obj ist der einzige Parameter ReadState; Die Funktion gibt das Ergebnis des Befehls ohne Änderung zurück. Seine Definition ist im kopierten Code enthalten.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.GetPoisoned(obj);
}

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 eine Änderung in einer halben Sekunde – Skriptklasse

Parameter und Ablauf:

  • Zwei Aufrufe ohne Argumente lesen self, UO.Wait(500) setzt 500 Millisekunden. Zwei Bilder werden verglichen; Zwischenübergänge können übersprungen werden. Es gibt kein endloses Warten.
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.GetPoisoned();
        await Delay(500);
        var after = UO.GetPoisoned();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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;
}

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.GetPoisoned() — UO.GetPoisoned()

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.

serial => bridge.Poisoned(serial)

Interner Implementierungscode; kein eigenständiges Skript.

() => getter(bridge.Self)

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

UO.GetPoisoned(value) — UO.GetPoisoned(Any)

Parameter: value (Any)

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.

serial => bridge.Poisoned(serial)

Interner Implementierungscode; kein eigenständiges Skript.

value => getter(GetObject(value))

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


UO.GetRace

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

C#-Signaturen

int UO.GetRace();

Liest die Rasse des Charakters aus dem Clientmodell.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – 1=Mensch, 2=Elf, 3=Wasserspeier entsprechend dem Kundenmodell. 0 bedeutet, dass kein Zeichen geladen ist. Es ist nicht body/graphic und nicht serial.

Verhalten

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

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

1. Zeigen Sie den aktuellen Wert Ihres Charakters an – direktes Skript

Parameter und Ablauf:

  • Der Aufruf ohne Argumente bezieht sich auf self. Die Rasse des Charakters wird im Wert gespeichert.
  • Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.GetRace();
UO.Print("GetRace: " + Convert.ToString(value));

2. Wert in der Anwendungsvalidierung verwenden – Skriptfunktion

Parameter und Ablauf:

  • Der Wert wird einmal ohne Argumente gelesen. Die Rasse des Charakters 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.GetRace();
    if (Truth(value == 3))
    {
        UO.Print("Player race is gargoyle");
    }

    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. Sehen Sie sich die Veränderung in einer Sekunde an – Skriptunterricht

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: Charakterrasse. 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.GetRace();
        await Delay(1000);
        var after = UO.GetRace();
        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;
}

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.GetRace() — UO.GetRace()

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

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


UO.GetResist

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

C#-Signaturen

int UO.GetResist(object? resistance);

Liest einen der Widerstände Ihres Charakters mithilfe eines numerischen oder String-Selektors.

Parameter

  • resistance – Widerstand ist erforderlich. Zahlen: 0=physisch, 1=Feuer, 2=Kälte, 3=Gift, 4=Energie. Linien: physisch/physisch/Rüstung, Feuer, Kälte, Gift, Energie. Groß- und Kleinschreibung sowie nachfolgende Leerzeichen werden ignoriert. Es gibt kein serial, type, hue, kein Sicht- oder zweites Argument.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • GetResistance unterscheidet zunächst den Werttyp: Die Zeichenfolgen „1“ und „0“ sind unbekannte Namen, ergeben 0 und sind keine numerischen Selektoren. Ein Nicht-String double verwirft den Bruch auf Null: 1.9 -> Feuer, -0.9 -> physisch. true=1 wählt Feuer, false=0 wählt physisch; Array/null wird ebenfalls in 0 konvertiert. Verwenden Sie eine explizite Ganzzahl oder einen gültigen Namen. Die Namen AddObject sind nicht erlaubt.
  • GetResistance wählt genau ein Brückenfeld aus. Unbekannte Nummern/Namen geben int 0 aus, ohne das Feld zu lesen. Der Befehl entfernt fünf Werte nicht atomar und verändert den Widerstand nicht.
  • PhysicalResistance – Server-Rüstungs-/Statusfeld: Der klassische Server kann die Rüstungsbewertung übertragen, und Regeln mit Widerständen können physischen Widerstand übertragen. API konvertiert nicht von einem zum anderen und berechnet nicht den Prozentsatz der Schadensreduzierung. Armor und physische Aliase lesen dasselbe Feld.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Aufrufen von Lesevorgängen im Spielstream mit der Möglichkeit, das Warten per Skript abzubrechen. Fragt den Status nicht ab, öffnet kein Ziel, sendet kein Paket, ändert die Eigenschaften nicht und fügt keine Verzögerung hinzu.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

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

1. Nach Namen mit unterschiedlicher Groß- und Kleinschreibung auswählen – direktes Skript

Parameter und Ablauf:

  • Resistance=" FiRe " wählt Feuer nach dem Entfernen nachfolgender Leerzeichen aus und unterscheidet nicht zwischen Groß- und Kleinschreibung. Der Wert bleibt eine vorzeichenbehaftete Zahl. der Anblick erscheint nicht.
var value = UO.GetResist(" FiRe ");
UO.Print("Fire resistance: " + Convert.ToString(value));

2. Vergleichen Sie numerische und String-Selektoren – Skriptfunktion

Parameter und Ablauf:

  • 2 wählt kalt; "Gift" - Gift. Dies sind Selektoren, nicht serial. Der Vergleich zweier Snapshots ergibt bool; Giftresistenz sagt nicht aus, ob ein Charakter vergiftet ist.
return  RunScenario();
 object? RunScenario()
{
    var cold = UO.GetResist(2);
    var poison = UO.GetResist("poison");
    if (Truth(cold < poison))
    {
        UO.Print("Cold resistance is lower");
    }
    else
    {
        UO.Print("Cold resistance is equal or higher");
    }

    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 Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
  • Selektor wird ohne Änderungen von der Funktion an GetResist übergeben; Das Beispiel verwendet „Feuer“. Die Funktion prüft, ob der Player vorhanden ist, validiert jedoch nicht den willkürlichen Selektor und bestätigt nicht die Aktualität des Status. Verwenden Sie den Selektor aus der Liste oben.
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(Truth(ResistanceAtLeast("fire", 50)) == true))
        {
            UO.Print("Local fire resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic selector, dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResist(selector);
        return value >= minimum;
    }

    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.GetResist(resistance) — UO.GetResist(Any)

Parameter: resistance (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

private int GetResistance(InjectionValue resistance)

        {

            if (resistance.Kind != InjectionValueKind.String)

            {

                switch (NumberConversions.ToInt(resistance))

                {

                    case 0: return bridge.Armor;

                    case 1: return bridge.FireResistance;

                    case 2: return bridge.ColdResistance;

                    case 3: return bridge.PoisonResistance;

                    case 4: return bridge.EnergyResistance;

                    default: return 0;

                }

            }



            switch ((resistance.String ?? string.Empty).Trim().ToLowerInvariant())

            {

                case "physical":

                case "phys":

                case "armor": return bridge.Armor;

                case "fire": return bridge.FireResistance;

                case "cold": return bridge.ColdResistance;

                case "poison": return bridge.PoisonResistance;

                case "energy": return bridge.EnergyResistance;

                default: return 0;

            }

        }

UO.GetResistCold

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

C#-Signaturen

int UO.GetResistCold();

Liest das Widerstandsfeld des aktuellen Charakters: kalt.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.ColdResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetResistCold();
UO.Print("ColdResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetResistCold();
    await Delay(500);
    var after = UO.GetResistCold();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResistCold();
        return value >= minimum;
    }

    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.GetResistCold() — UO.GetResistCold()

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

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


UO.GetResistEnergy

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

C#-Signaturen

int UO.GetResistEnergy();

Liest das Widerstandsfeld des aktuellen Charakters: Energie.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.EnergyResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetResistEnergy();
UO.Print("EnergyResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetResistEnergy();
    await Delay(500);
    var after = UO.GetResistEnergy();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResistEnergy();
        return value >= minimum;
    }

    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.GetResistEnergy() — UO.GetResistEnergy()

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

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


UO.GetResistFire

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

C#-Signaturen

int UO.GetResistFire();

Liest das Widerstandsfeld des aktuellen Charakters: Feuer.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FireResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetResistFire();
UO.Print("FireResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetResistFire();
    await Delay(500);
    var after = UO.GetResistFire();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResistFire();
        return value >= minimum;
    }

    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.GetResistFire() — UO.GetResistFire()

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

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


UO.GetResistPhysical

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

C#-Signaturen

int UO.GetResistPhysical();

Liest das Widerstandsfeld des aktuellen Charakters: physische Rüstung/Widerstand.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.PhysicalResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PhysicalResistance – Server-Rüstungs-/Statusfeld: Der klassische Server kann die Rüstungsbewertung übertragen, und Regeln mit Widerständen können physischen Widerstand übertragen. API konvertiert nicht von einem zum anderen und berechnet nicht den Prozentsatz der Schadensreduzierung. Armor und physische Aliase lesen dasselbe Feld.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetResistPhysical();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetResistPhysical();
    await Delay(500);
    var after = UO.GetResistPhysical();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResistPhysical();
        return value >= minimum;
    }

    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.GetResistPhysical() — UO.GetResistPhysical()

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

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


UO.GetResistPoison

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

C#-Signaturen

int UO.GetResistPoison();

Liest das Widerstandsfeld des aktuellen Charakters: Gift.

Parameter

Es gibt keine Parameter.

Rückgabewert

int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.PoisonResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
  • CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

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

1. Gespeicherten Wert drucken – direktes Skript

Parameter und Ablauf:

  • value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.GetResistPoison();
UO.Print("PoisonResistance: " + Convert.ToString(value));

2. Vergleichen Sie zwei Bilder – Skriptfunktion

Parameter und Ablauf:

  • Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetResistPoison();
    await Delay(500);
    var after = UO.GetResistPoison();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. Vollständige Funktion zum Testen des minimalen Widerstands – Skriptklasse

Parameter und Ablauf:

  • Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetResistPoison();
        return value >= minimum;
    }

    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.GetResistPoison() — UO.GetResistPoison()

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

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

⚠️ **GitHub.com Fallback** ⚠️