Skip to content

DE UO Topic character

Codex edited this page Oct 12, 2026 · 5 revisions

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

Charakter

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

Der Zustand Ihres Charakters, Ihrer Eigenschaften, Widerstände und Ihrer Ausrüstung. Verwenden Sie für eine bestimmte Entität eine Überladung mit serial, wenn diese in der Befehlskarte enthalten ist.

Abschnitte

Thema Befehle und Erklärungen
Identity UO.Self · UO.GetSerial · UO.GetName · UO.GetTitle · UO.GetSex · UO.GetRace
Stats UO.HP · UO.MaxHP · UO.Mana · UO.MaxMana · UO.Stamina · UO.MaxStamina · UO.Str · UO.Dex · UO.Int · UO.Weight · UO.MaxWeight · UO.Luck · UO.GetStatLockState · UO.SetStatLockState
Status UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Frozen · UO.Paralyzed · UO.Flying · UO.WarMode · UO.IsYellowHits
Resists UO.PhysicalResist · UO.GetPhysicalResist · UO.ResistPhysical · UO.GetResistPhysical · UO.FireResist · UO.GetFireResist · UO.ResistFire · UO.GetResistFire · UO.ColdResist · UO.GetColdResist · UO.ResistCold · UO.GetResistCold · UO.PoisonResist · UO.GetPoisonResist · UO.ResistPoison · UO.GetResistPoison · UO.EnergyResist · UO.GetEnergyResist · UO.ResistEnergy · UO.GetResistEnergy · UO.GetResist
Zeichenebenen UO.ObjAtLayer · UO.ObjAtLayerEx · UO.GetLayer · UO.GetEquipment
Equipment UO.GetEquipment · UO.EquipItems · UO.UnequipItems · UO.WearItem
Dress / Undress UO.SetDress · UO.Dress · UO.Undress · UO.DressSavedSet
Arm / Disarm UO.SetArm · UO.Arm · UO.Disarm
Mount / Dismount UO.Mount · UO.Dismount
Paperdoll UO.UseSelfPaperdollScroll · UO.UseOtherPaperdollScroll

Alle Theme-Befehle

Identität

UO.Self · UO.CharacterTitle · UO.CharName · UO.CharTitle · UO.GetRace · UO.GetSex · UO.Race · UO.Sex · UO.IsFemale · UO.GetTitle

Statistiken

UO.Armor · UO.GetArmor · UO.HP · UO.GetHP · UO.Life · UO.GetLife · UO.MaxHP · UO.GetMaxHP · UO.MaxLife · UO.GetMaxLife · UO.Mana · UO.GetMana · UO.MaxMana · UO.GetMaxMana · UO.Stam · UO.GetStam · UO.Stamina · UO.GetStamina · UO.MaxStam · UO.GetMaxStam · UO.MaxStamina · UO.GetMaxStamina · UO.Str · UO.GetStr · UO.Strength · UO.GetStrength · UO.Dex · UO.GetDex · UO.Dexterity · UO.GetDexterity · UO.Int · UO.GetInt · UO.Intelligence · UO.GetIntelligence · UO.Weight · UO.GetWeight · UO.MaxWeight · UO.GetMaxWeight · UO.Luck · UO.GetLuck · UO.Gold · UO.GetGold · UO.GetStatLockState · UO.SetStatLockState · UO.SetStatState · UO.RequestStats · UO.GetStatus · UO.GetPlayerStatusText · UO.LastStatus · UO.LastStatusX · UO.LastStatusY · UO.GetARStatus · UO.SetARStatus · UO.SetARExtParams

Status

UO.Alive · UO.GetAlive · UO.IsAlive · UO.Dead · UO.GetDead · UO.IsDead · UO.Hidden · UO.GetHidden · UO.IsHidden · UO.Poison · UO.Poisoned · UO.GetPoisoned · UO.IsPoisoned · UO.Frozen · UO.GetFrozen · UO.IsFrozen · UO.Paralyzed · UO.GetParalisa · UO.GetParalysed · UO.GetParalyzed · UO.IsParalysed · UO.IsParalyzed · UO.Flying · UO.GetFlying · UO.IsFlying · UO.ToggleFly · UO.GetYellowBar · UO.IsYellowHits · UO.TicksDead

Widersteht

UO.PhysicalResist · UO.GetPhysicalResist · UO.ResistPhysical · UO.GetResistPhysical · UO.FireResist · UO.GetFireResist · UO.ResistFire · UO.GetResistFire · UO.ColdResist · UO.GetColdResist · UO.ResistCold · UO.GetResistCold · UO.PoisonResist · UO.GetPoisonResist · UO.ResistPoison · UO.GetResistPoison · UO.EnergyResist · UO.GetEnergyResist · UO.ResistEnergy · UO.GetResistEnergy · UO.GetResist

Ausrüstung

UO.GetEquipment · UO.ObjAtLayer · UO.ObjAtLayerEx · UO.Equip · UO.EquipT · UO.EquipItems · UO.Unequip · UO.UnequipItems · UO.WearItem · UO.EquipLastWeapon · UO.RemoveEarrings · UO.RemoveHat · UO.RemoveNeckless · UO.RemoveRing

Dress / Undress

UO.Dress · UO.Undress · UO.SetDress · UO.UnsetDress · UO.DressSavedSet · UO.EquipDressSet · UO.DressSpeed · UO.SetDressSpeed

Arm / Disarm

UO.Arm · UO.Disarm · UO.SetArm · UO.UnsetArm

Mount / Dismount

UO.Mount · UO.Dismount

Papierpuppe

UO.UseSelfPaperdollScroll · UO.UseOtherPaperdollScroll

Charakterebenen

Alle Ebenen: Zweck, Bedeutungen und Beispiele. Die Ebenennummer serial des ausgerüsteten Gegenstands und sein graphic sind unterschiedliche Werte.

Beispiele zum Thema

Jede Befehlskarte verfügt über mehrere unabhängige Szenarien: Direktcode, Funktionen und Klassen. Nachfolgend finden Sie ausgewählte kurze Szenarien; Einschränkungen und eine vollständige Analyse sind geplant.

UO.HP

Parameter, Ergebnis und alle Szenarien

var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));

UO.ObjAtLayer

Parameter, Ergebnis und alle Szenarien

object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
    UO.Print("Right hand serial: " + serial);
}
else
{
    UO.Print("Right hand is empty or unavailable");
}

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

Referenzteile

1 · 2 · 3 · 4 · 5

Vollständige Befehlsreferenz


UO.Alive

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

C#-Signaturen

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

Überprüft das Vorhandensein eines Objekts ohne Todeszeichen.

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 – positiv serial existiert und ist nicht als tot markiert. Der berühmte Artikel gibt auch 1: Dies ist nicht der mobile-Filter. Ein totes/fehlendes Objekt gibt 0.

Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.

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.Alive();
UO.Print("Alive: " + 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.Alive();
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.Alive(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.Alive();
        await Delay(500);
        var after = UO.Alive();
        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.Alive() — UO.Alive()

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 => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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.Alive(value) — UO.Alive(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 => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

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

C#-Signaturen

void UO.Arm(object? name);

Stellt einen zuvor gespeicherten, benannten Satz Waffen und Schilde wieder her.

Parameter

  • name – String-Name des Sets, z. B. „travel“ oder „battle“. Bei Namen wird die Groß-/Kleinschreibung nicht beachtet. Kleidungsstücke und Waffen werden getrennt aufbewahrt, in beiden ist der gleiche Name erlaubt. Dies ist kein ID-Ding oder Dateiname. Nur SetDress erlaubt das Fehlen eines Namens: Dann wird für DressSavedSet/EquipDressSet ein separater Satz aufgezeichnet.

Rückgabewert

void – kein Wert. Rufen Sie eine separate Leitung an; Ordnen Sie das Ergebnis nicht zu und vergleichen Sie es nicht mit true. Durch das Speichern und Löschen wird der Eintrag verändert, nicht das Gerät.

Verhalten

  • Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
  • Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
  • Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
  • Eine exakte Übereinstimmung zwischen dem aktuellen und dem gespeicherten ID wird übersprungen, ohne erneut verwendet/erhöht zu werden. Ein fehlender Artikel wird nicht durch einen ähnlichen type ersetzt. Das Scheitern einer Operation macht erfolgreiche Operationen nicht zunichte und beeinträchtigt nicht die Versuche anderer; Es gibt kein automatisches Rollback. Benötige Verbindung und geladenes Zeug. Im abgenommenen Zustand kommt ein echter Rucksack zum Einsatz.
  • UO.Set("equipfordress", 0) wählt die Aufforderung zur Verwendung des Artikels aus (Anfangsmodus); Wert ungleich Null – Aufnehmen/Ausrüsten. In beiden Modi wird die gewünschte tragbare Schicht überprüft. Ein bereits getragener Artikel kann nicht durch wiederholtes Tragen ausgetauscht werden. DressSpeed ist nach der angenommenen Anfrage gültig, beim Widerruf gilt zusätzlich DropDelay.
  • Dress und Arm geben void zurück, auch bei einem Fehler. Die Meldung, dass Anfragen angenommen wurden, bedeutet keine Bestätigung durch den Server. Für eine vom Anziehen abhängige Fortsetzung überprüfen Sie die tatsächlichen Schichten mit begrenzter Erwartung.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

Eigenständige C#-Skripte

Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.

Einfaches Beispiel

Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.

Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.

UO.Print("Calling UO.Arm");
UO.Arm("battle");

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Der erforderliche Satz muss zuvor im gleichen Laufzeitzustand gespeichert werden. Rufen Sie SetDress/SetArm nicht unmittelbar vor jeder Wiederherstellung auf: Dadurch wird das Ziel mit den aktuellen Elementen überschrieben.
UO.Arm("battle");

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Eine Ausrüstungsadresse ungleich Null wählt Abholung/Ausrüstung aus; 350 – Millisekunden DressSpeed. Diese Einstellungen bleiben auch nach dem Beispiel zur Laufzeit erhalten. Über das Aus- und Anziehen entscheidet der Server.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Arm("battle");
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • lasttarget – ID Dinge, die in einem zuvor gespeicherten Satz enthalten sein sollten. Die Kontrollschicht 3 bedeutet Schuhe, 1 bedeutet rechte Hand. AwaitSlot gleicht 20 mit einer Pause von 100 ms aus und wiederholt den Befehl nicht. Dadurch wird nur das ausgewählte Element bestätigt, nicht der gesamte Satz.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        UO.Arm("battle");
        return AwaitSlot(1, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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.Arm(name) — UO.Arm(String)

Parameter: name (String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void Arm(string name)

            => Equip(name, armSets, weaponLayers, "Weapon set requests processed.", "No weapons set with setarm.");

UO.Armor

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

C#-Signaturen

int UO.Armor();

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.Armor();
UO.Print("Armor: " + 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.Armor();
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.Armor();
    await Delay(500);
    var after = UO.Armor();
    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.Armor();
        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.Armor() — UO.Armor()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "armor": return new InjectionValue(bridge.Armor);

UO.CharName

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

C#-Signaturen

dynamic UO.CharName();

Liest den Namen des Charakters.

Parameter

Es gibt keine Parameter.

Rückgabewert

string ist ein dem Client bekannter Name. Eine leere Zeichenfolge bedeutet einen leeren/unbekannten Wert oder kein Objekt. Dies ist nicht serial oder ein Profilpfad. Der Name/Titel des Spiels ist nicht in die Sprache übersetzt IDE.

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.

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

1. Text nach Anmeldung anzeigen – Direktskript

Parameter und Ablauf:

  • Es gibt keine Parameter: self wird gelesen.
  • Die leere Zeichenfolge wird explizit behandelt; Dies ist nicht der Text „0“.
var text = UO.CharName();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Text zur Protokollnachricht hinzufügen – Skriptfunktion

Parameter und Ablauf:

  • Ihr Zeichen wird gelesen, der Wert wird als Zeile gespeichert.
  • Der +-Operator verbindet Zeichenfolgen. Convert.ToString wird für dieses Ergebnis nicht benötigt.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharName();
    UO.Print("Player имя: " + text);
    return null;
}

3. Vergleichen Sie zwei Schnappschüsse – Szenarioklasse

Parameter und Ablauf:

  • Beide Aufrufe beziehen sich auf self; UO.Wait legt die Pause 1000 ms fest.
  • Der Unterschied kann bedeuten, dass Daten aktualisiert werden oder die Welt verlassen wird. Das Beispiel ändert weder den Namen noch den Titel.
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 previous = UO.CharName();
        await Delay(1000);
        var current = UO.CharName();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getname":

                case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));

UO.CharTitle

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

C#-Signaturen

dynamic UO.CharTitle();

Liest den Titel des Charakters.

Parameter

Es gibt keine Parameter.

Rückgabewert

string ist ein dem Kunden bekannter Titel. Eine leere Zeichenfolge bedeutet einen leeren/unbekannten Wert oder kein Objekt. Dies ist nicht serial oder ein Profilpfad. Der Name/Titel des Spiels ist nicht in die Sprache übersetzt IDE.

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.

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

1. Text nach Anmeldung anzeigen – Direktskript

Parameter und Ablauf:

  • Es gibt keine Parameter: self wird gelesen.
  • Die leere Zeichenfolge wird explizit behandelt; Dies ist nicht der Text „0“.
var text = UO.CharTitle();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Text zur Protokollnachricht hinzufügen – Skriptfunktion

Parameter und Ablauf:

  • Ihr Zeichen wird gelesen, der Wert wird als Zeile gespeichert.
  • Der +-Operator verbindet Zeichenfolgen. Convert.ToString wird für dieses Ergebnis nicht benötigt.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharTitle();
    UO.Print("Player титул: " + text);
    return null;
}

3. Vergleichen Sie zwei Schnappschüsse – Szenarioklasse

Parameter und Ablauf:

  • Beide Aufrufe beziehen sich auf self; UO.Wait legt die Pause 1000 ms fest.
  • Der Unterschied kann bedeuten, dass Daten aktualisiert werden oder die Welt verlassen wird. Das Beispiel ändert weder den Namen noch den Titel.
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 previous = UO.CharTitle();
        await Delay(1000);
        var current = UO.CharTitle();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "chartitle": return new InjectionValue(bridge.CharacterTitle);

UO.CharacterTitle

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

C#-Signaturen

string UO.CharacterTitle();

Liest den Titel des Charakters.

Parameter

Es gibt keine Parameter.

Rückgabewert

string ist ein dem Kunden bekannter Titel. Eine leere Zeichenfolge bedeutet einen leeren/unbekannten Wert oder kein Objekt. Dies ist nicht serial oder ein Profilpfad. Der Name/Titel des Spiels ist nicht in die Sprache übersetzt IDE.

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

1. Text nach Anmeldung anzeigen – Direktskript

Parameter und Ablauf:

  • Es gibt keine Parameter: self wird gelesen.
  • Die leere Zeichenfolge wird explizit behandelt; Dies ist nicht der Text „0“.
var text = UO.CharacterTitle();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Text zur Protokollnachricht hinzufügen – Skriptfunktion

Parameter und Ablauf:

  • Ihr Zeichen wird gelesen, der Wert wird als Zeile gespeichert.
  • Der +-Operator verbindet Zeichenfolgen. Convert.ToString wird für dieses Ergebnis nicht benötigt.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharacterTitle();
    UO.Print("Player титул: " + text);
    return null;
}

3. Vergleichen Sie zwei Schnappschüsse – Szenarioklasse

Parameter und Ablauf:

  • Beide Aufrufe beziehen sich auf self; UO.Wait legt die Pause 1000 ms fest.
  • Der Unterschied kann bedeuten, dass Daten aktualisiert werden oder die Welt verlassen wird. Das Beispiel ändert weder den Namen noch den Titel.
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 previous = UO.CharacterTitle();
        await Delay(1000);
        var current = UO.CharacterTitle();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

Parameter: Keine Parameter.

Ergebnis: string / String.

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

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


UO.ColdResist

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

C#-Signaturen

int UO.ColdResist();

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.ColdResist();
UO.Print("ColdResist: " + 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.ColdResist();
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.ColdResist();
    await Delay(500);
    var after = UO.ColdResist();
    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.ColdResist();
        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.ColdResist() — UO.ColdResist()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "coldresist": return new InjectionValue(bridge.ColdResistance);

UO.Dead

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

C#-Signaturen

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

Überprüft den Tod eines Charakters.

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

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 IsDead, 0 hat kein Vorzeichen oder mobile fehlt. HP=0 allein bedeutet nicht den Tod.

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.Dead();
UO.Print("Dead: " + 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.Dead();
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.Dead(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.Dead();
        await Delay(500);
        var after = UO.Dead();
        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.Dead() — UO.Dead()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.Dead(id) — UO.Dead(Any)

Parameter: id (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Dead(InjectionValue id)

        {

            int serial = GetObject(id);

            if (serial == bridge.Self)

                return Dead();

            return serial > 0 ? bridge.IsDead(serial) : 0;

        }

UO.Dex

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

C#-Signaturen

int UO.Dex();

Liest die aktuelle Beweglichkeit (Dexterity, DEX) 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.Dexterity, 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.Dex(), UO.Dexterity(), UO.GetDex(), UO.GetDexterity().

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.Dex();
UO.Print("Dex: " + 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.Dex();
UO.Print("Dexterity: " + 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.Dex();
    await Delay(1000);
    var after = UO.Dex();
    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.Dex();
        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.Dex() — UO.Dex()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dex": return new InjectionValue(bridge.Dexterity);

UO.Dexterity

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

C#-Signaturen

int UO.Dexterity();

Liest die aktuelle Beweglichkeit (Dexterity, DEX) 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.Dexterity, 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.Dex(), UO.Dexterity(), UO.GetDex(), UO.GetDexterity().

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.Dexterity();
UO.Print("Dexterity: " + 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.Dexterity();
UO.Print("Dexterity: " + 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.Dexterity();
    await Delay(1000);
    var after = UO.Dexterity();
    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.Dexterity();
        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.Dexterity() — UO.Dexterity()

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

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


UO.Disarm

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

C#-Signaturen

int UO.Disarm();

Entfernt Waffen und Schilde von den Händen: Ebenen 1 und 2. Beeinträchtigt die Kleidung nicht.

Parameter

Es gibt keine Parameter.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – lokaler Vorgang akzeptiert, 0 (Bedingung nicht erfüllt) – Ablehnung. Dies ist keine Serverbestätigung, kein ID und keine Menge. Der Server kann später ausfallen. Überprüfen Sie nach der Beantwortung die tatsächliche Ausrüstung.

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

  • Benötigt geladene Elemente und freies Ziehen mit der Hand. Beim Entfernen ist der eigentliche Rucksack self erforderlich; der Ersatzrucksack GrabBag wird nicht verwendet. Unbekannte, zerstörte und ungeeignete Artikel werden zurückgewiesen. Gegenstände anderer Personen können nicht über UnequipItems entfernt werden. Ein Set ist keine atomare Transaktion.
  • EquipItems/UnequipItems gilt DressSpeed nach der akzeptierten Operation vor dem nächsten Element; Disarm/Undress - nach jeder belegten Ebene. Die Auszahlung respektiert zusätzlich DropDelay, wenn der Übertrag akzeptiert wird. Die gleichen Einstellungen anderer Laufzeiten ändern sich nicht; Die Beschleunigung setzt Servereinschränkungen nicht außer Kraft.
  • Ein falsches Aufrufformular, ein unbekannter Layername oder ein Wert, der nicht in eine Zahl konvertierbar ist, können zu einem Skriptfehler anstelle von 0 führen. Der Geräte-Snapshot enthält nur bereits geladene Daten. Im Assistenten ist ChangeAndConfirm Layer=1 die rechte Hand: Übergeben Sie zum anderen die eigentliche Ebene.
  • Für ein Array bedeutet 1, dass alle aufgelisteten Operationen akzeptiert werden; im Falle einer Ablehnung wird 0 zurückgegeben. Die restlichen Elemente werden weiterhin verarbeitet, es erfolgt kein Rollback. Ein leeres Array erzeugt 1 ohne Aktion. Disarm/Undress geben 1 auch dann, wenn die erforderlichen Ebenen bereits leer sind; Teilausfall ergibt 0.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

1. Disarm – Ein ausgewähltes Element oder eine ausgewählte Ebene – direktes Skript

Parameter und Ablauf:

  • Wählen Sie zunächst den entsprechenden Gegenstand im Spiel aus: lasttarget – es ist ID. Im Beispiel Equip/WearItem erfordert die Ebene 1 eine Nebenhandwaffe. Unequip(1) entfernt die rechte Hand; Disarm/Undress arbeiten mit ihren eigenen festen Ebenen. Es gibt keine automatischen Wiederholungen nach einer Ablehnung.
return UO.Disarm();

2. Disarm – Zwei Elemente und gespeichert ID – Skriptfunktion

Parameter und Ablauf:

  • Zum Ausrüsten ist 0x0F5E ein Beispiel für ein Schwert, 0x1B76 ein Beispiel für einen Schild. FindType sucht sie unter den geladenen Gegenständen des Rucksacks, ASC wandelt das zurückgegebene Hex-ID um. Zum Entfernen werden die eigenen aktuellen Layer gelesen. Wenn das erforderliche Element nicht verfügbar ist, wird das Skript beendet. Das Array speichert zwei ID; Jeder Artikel wird vollständig übertragen.
return  RunScenario();
 object? RunScenario()
{
    var first = UO.ObjAtLayerEx(1, UO.Self());
    var second = UO.ObjAtLayerEx(2, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    return UO.Disarm();
    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. Disarm – Volle Funktion mit begrenzter Wartezeit – Skriptklasse

Parameter und Ablauf:

  • ChangeAndConfirm führt den Befehl einmal aus. Anschließend wird der Ist-Zustand bis zu 20 Mal mit einer Pause von 100 ms überprüft. 1 – die Prüfung hat den erwarteten Zustand festgestellt, 0 – Fehler oder abgelaufene Wartezeit. Dies ist das Ergebnis unseres Helfers, kein neuer integrierter Befehl. Auch der Aufruf des Vorgangs selbst kann einige Zeit in Anspruch nehmen.
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()
    {
        return ChangeAndConfirm();
        return null;
    }

    dynamic ChangeAndConfirm()
    {
        if (!(Truth(UO.Disarm())))
        {
            return 0;
        }

        dynamic[] layers = new dynamic[checked((int)(1) + 1)];
        layers[0] = 1;
        layers[1] = 2;
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            dynamic empty = true;
            for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
            {
                if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
                {
                    empty = false;
                }
            }

            if (Truth(empty))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Disarm()

            => Unequip(weaponLayers, "Weapons disarmed.");

UO.Dismount

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

C#-Signaturen

void UO.Dismount();

Fordert das Absteigen an, wenn der Charakter derzeit bestiegen ist.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Rückgabewert. Rufen Sie als separate Leitung auf, vergleichen Sie das Ergebnis nicht mit 1/true. Überprüfen Sie die 25-Ebene, nachdem der Server antwortet.

Verhalten

  • Der Befehl sendet eine Anfrage zur Verwendung des Protokollobjekts UO (0x06) ohne Mausemulation. Es umgeht den üblichen double-Klick-Handler der Schnittstelle: Im Kriegsmodus wird die Anfrage nicht durch einen Angriff ersetzt.
  • Der Zustand der Halterung wird aus dem Layer 25 gelesen. Es ändert sich nach den Serverdaten; Die Rückkehr vom Kommando bestätigt nicht den Abschluss der Landung/des Absteigens.
  • Wiederholte Mount-/Dismount-Anfragen werden vorübergehend zusammengeführt: Es wird keine neue Anfrage gesendet, bis ein Layer-Wechsel, ein Zeichenwechsel oder 5 Sekunden vergangen sind. Dies schützt vor Duplikaten zwischen Skripten.
  • Wenn der Charakter abwesend, nicht im Spiel oder wegen eines toten Charakters ist, wird die Anfrage nicht gesendet. Die endgültigen Regeln für Eigentum, Verfügbarkeit und Sitzplätze werden vom Server festgelegt.
  • Wenn die Ebene 25 leer ist, erfolgt keine Eingabeaufforderung und Paperdoll wird nicht geöffnet. Ein Serviceboot-Gegenstand mit graphic 0x3E96 zählt nicht als normales Reittier für dieses Team.
  • UO.Exec("dismount") ruft denselben Handler auf und verwendet denselben Wiedergabeschutz. Sie können in der Dismount-Zeile keine Parameter übergeben: Ein zusätzliches Argument verursacht einen Fehler und sendet die Anfrage nicht.

Eigenständige C#-Skripte

Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.

Einfaches Beispiel

Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.

Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.

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

1. Abstieg anfordern – direktes Skript

Parameter und Ablauf:

  • Es gibt keine Parameter. Es gibt auch keinen Rückgabewert.
UO.Dismount();

2. Vor der Anforderung prüfen, ob ein gemountetes Element vorhanden ist – Skriptfunktion

Parameter und Ablauf:

  • geritten – ID des Ebenenelements, nicht das Ziel für den erneuten Aufruf von Mount. Dismount benötigt keine Argumente.
return  RunScenario();
 object? RunScenario()
{
    var ridden = UO.ObjAtLayer(25);
    if (Truth(ridden == 0))
    {
        UO.Print("No loaded mount layer");
        return null;
    }

    UO.Print("Mounted item ID: " + Convert.ToString(ridden));
    UO.Dismount();
    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. Vervollständigen Sie die Wartefunktion für leere Ebenen – Skriptklasse

Parameter und Ablauf:

  • Der Helfer gibt „true“ zurück, wenn die Ebene bereits leer ist oder innerhalb der Erwartung leer wurde. Es wird nicht mehr als eine Anfrage gesendet.
  • Dies ist eine Überprüfung des Client-Status nach der Serverantwort, nicht des Rückgabewerts von UO.Dismount.
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 dismounted = await TryDismount();
        UO.Print("Mount layer empty: " + Convert.ToString(dismounted));
        return null;
    }

    async Task<dynamic> TryDismount()
    {
        if (Truth(UO.ObjAtLayer(25) == 0))
        {
            return true;
        }

        UO.Dismount();
        var attempts = 0;
        while (Truth(attempts < 20))
        {
            if (Truth(UO.ObjAtLayer(25) == 0))
            {
                return true;
            }

            await Delay(50);
            attempts = attempts + 1;
        }

        return false;
    }

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

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dismount": bridge.Dismount(); break;

UO.Dress

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

C#-Signaturen

void UO.Dress(object? name);

Stellt ein zuvor gespeichertes benanntes Kleidungsset wieder her.

Parameter

  • name – String-Name des Sets, z. B. „travel“ oder „battle“. Bei Namen wird die Groß-/Kleinschreibung nicht beachtet. Kleidungsstücke und Waffen werden getrennt aufbewahrt, in beiden ist der gleiche Name erlaubt. Dies ist kein ID-Ding oder Dateiname. Nur SetDress erlaubt das Fehlen eines Namens: Dann wird für DressSavedSet/EquipDressSet ein separater Satz aufgezeichnet.

Rückgabewert

void – kein Wert. Rufen Sie eine separate Leitung an; Ordnen Sie das Ergebnis nicht zu und vergleichen Sie es nicht mit true. Durch das Speichern und Löschen wird der Eintrag verändert, nicht das Gerät.

Verhalten

  • Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
  • Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
  • Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
  • Eine exakte Übereinstimmung zwischen dem aktuellen und dem gespeicherten ID wird übersprungen, ohne erneut verwendet/erhöht zu werden. Ein fehlender Artikel wird nicht durch einen ähnlichen type ersetzt. Das Scheitern einer Operation macht erfolgreiche Operationen nicht zunichte und beeinträchtigt nicht die Versuche anderer; Es gibt kein automatisches Rollback. Benötige Verbindung und geladenes Zeug. Im abgenommenen Zustand kommt ein echter Rucksack zum Einsatz.
  • UO.Set("equipfordress", 0) wählt die Aufforderung zur Verwendung des Artikels aus (Anfangsmodus); Wert ungleich Null – Aufnehmen/Ausrüsten. In beiden Modi wird die gewünschte tragbare Schicht überprüft. Ein bereits getragener Artikel kann nicht durch wiederholtes Tragen ausgetauscht werden. DressSpeed ist nach der angenommenen Anfrage gültig, beim Widerruf gilt zusätzlich DropDelay.
  • Dress und Arm geben void zurück, auch bei einem Fehler. Die Meldung, dass Anfragen angenommen wurden, bedeutet keine Bestätigung durch den Server. Für eine vom Anziehen abhängige Fortsetzung überprüfen Sie die tatsächlichen Schichten mit begrenzter Erwartung.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

Eigenständige C#-Skripte

Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.

Einfaches Beispiel

Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.

Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.

UO.Print("Calling UO.Dress");
UO.Dress("travel");

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Der erforderliche Satz muss zuvor im gleichen Laufzeitzustand gespeichert werden. Rufen Sie SetDress/SetArm nicht unmittelbar vor jeder Wiederherstellung auf: Dadurch wird das Ziel mit den aktuellen Elementen überschrieben.
UO.Dress("travel");

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Eine Ausrüstungsadresse ungleich Null wählt Abholung/Ausrüstung aus; 350 – Millisekunden DressSpeed. Diese Einstellungen bleiben auch nach dem Beispiel zur Laufzeit erhalten. Über das Aus- und Anziehen entscheidet der Server.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Dress("travel");
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • lasttarget – ID Dinge, die in einem zuvor gespeicherten Satz enthalten sein sollten. Die Kontrollschicht 3 bedeutet Schuhe, 1 bedeutet rechte Hand. AwaitSlot gleicht 20 mit einer Pause von 100 ms aus und wiederholt den Befehl nicht. Dadurch wird nur das ausgewählte Element bestätigt, nicht der gesamte Satz.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        UO.Dress("travel");
        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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.Dress(name) — UO.Dress(String)

Parameter: name (String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void Dress(string name)

            => Equip(name, dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.");

UO.DressSavedSet

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

C#-Signaturen

dynamic UO.DressSavedSet();

Stellt einen durch den Aufruf von UO.SetDress() ohne Namen gespeicherten Satz Kleidungsstücke wieder her.

Parameter

Es gibt keine Parameter.

Rückgabewert

Tatsächlich ist das numerische Flag int: 1 (Bedingung erfüllt) – alle erforderlichen Anforderungen werden lokal akzeptiert oder die erforderlichen Schichten wurden bereits abgeglichen; 0 (Bedingung nicht erfüllt) – kein Wählen, keine Verbindung oder mindestens eine Anfrage wurde abgelehnt. Anmeldung object? ermöglicht dies int. Dabei handelt es sich nicht um ID, die Anzahl der getragenen Gegenstände oder eine Serverbestätigung.

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

  • Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
  • Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
  • Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
  • Eine exakte Übereinstimmung zwischen dem aktuellen und dem gespeicherten ID wird übersprungen, ohne erneut verwendet/erhöht zu werden. Ein fehlender Artikel wird nicht durch einen ähnlichen type ersetzt. Das Scheitern einer Operation macht erfolgreiche Operationen nicht zunichte und beeinträchtigt nicht die Versuche anderer; Es gibt kein automatisches Rollback. Benötige Verbindung und geladenes Zeug. Im abgenommenen Zustand kommt ein echter Rucksack zum Einsatz.
  • UO.Set("equipfordress", 0) wählt die Aufforderung zur Verwendung des Artikels aus (Anfangsmodus); Wert ungleich Null – Aufnehmen/Ausrüsten. In beiden Modi wird die gewünschte tragbare Schicht überprüft. Ein bereits getragener Artikel kann nicht durch wiederholtes Tragen ausgetauscht werden. DressSpeed ist nach der angenommenen Anfrage gültig, beim Widerruf gilt zusätzlich DropDelay.
  • Dress und Arm geben null zurück, auch bei einem Fehler. Die Meldung, dass Anfragen angenommen wurden, bedeutet keine Bestätigung durch den Server. Für eine vom Anziehen abhängige Fortsetzung überprüfen Sie die tatsächlichen Schichten mit begrenzter Erwartung.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Der erforderliche Satz muss zuvor im gleichen Laufzeitzustand gespeichert werden. Rufen Sie SetDress/SetArm nicht unmittelbar vor jeder Wiederherstellung auf: Dadurch wird das Ziel mit den aktuellen Elementen überschrieben.
return UO.DressSavedSet();

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Eine Ausrüstungsadresse ungleich Null wählt Abholung/Ausrüstung aus; 350 – Millisekunden DressSpeed. Diese Einstellungen bleiben auch nach dem Beispiel zur Laufzeit erhalten. Über das Aus- und Anziehen entscheidet der Server.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.DressSavedSet();
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • lasttarget – ID Dinge, die in einem zuvor gespeicherten Satz enthalten sein sollten. Die Kontrollschicht 3 bedeutet Schuhe, 1 bedeutet rechte Hand. AwaitSlot gleicht 20 mit einer Pause von 100 ms aus und wiederholt den Befehl nicht. Dadurch wird nur das ausgewählte Element bestätigt, nicht der gesamte Satz.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        if (!(Truth(UO.DressSavedSet())))
        {
            return 0;
        }

        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.DressSpeed

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

C#-Signaturen

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

Liest oder setzt die Pause zwischen An-/Ausziehvorgängen in der aktuellen Laufzeit. Hilft zu vermeiden, dass eine Reihe von Aktionen für Serverregeln zu schnell gesendet werden.

Parameter

  • value – Optionale Millisekunden. Ohne Argument - Lesen; Mit Argument wird der Wert auf 10..10000 begrenzt. Der Anfangswert der Laufzeit kann 0 sein, wenn die Verzögerung noch nicht angegeben wurde; Mit diesem Befehl können Sie 0 nicht schreiben.

Rückgabewert

Kein Argument: int, aktuelle Millisekunden. Mit Argument: null gibt es keinen Rückgabewert; Lesen Sie dann UO.DressSpeed() separat. Das ist nicht bool.

Verhalten

  • EquipItems/UnequipItems gilt DressSpeed nach der akzeptierten Operation vor dem nächsten Element; Disarm/Undress - nach jeder belegten Ebene. Die Auszahlung respektiert zusätzlich DropDelay, wenn der Übertrag akzeptiert wird. Die gleichen Einstellungen anderer Laufzeiten ändern sich nicht; Die Beschleunigung setzt Servereinschränkungen nicht außer Kraft.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

1. DressSpeed – 1 – direktes Skript

Parameter und Ablauf:

  • Lesen Sie die aktuelle Pause und wählen Sie das Minimum für den nächsten Satz aus. 0 bedeutet eine Verzögerung, die noch nicht angegeben wurde.
var delay = UO.DressSpeed();
if (Truth(delay < 350))
{
    UO.DressSpeed(350);
}
return UO.DressSpeed();

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

2. DressSpeed — 2 — Skriptfunktion

Parameter und Ablauf:

  • Stellen Sie 350 ms ein und überprüfen Sie den gespeicherten Wert separat. Sie können das Ergebnis eines Setters nicht einer Variablen zuweisen: Setter gibt Einheit zurück.
return  RunScenario();
 object? RunScenario()
{
    UO.DressSpeed(350);
    return UO.DressSpeed();
    return null;
}

3. DressSpeed – 3 – Szenarioklasse

Parameter und Ablauf:

  • ConfigureDressDelay übernimmt die Skripteinstellung. 15000 ist auf 10000 ms begrenzt; Der Assistent gibt die tatsächlich eingesparten Millisekunden zurück.
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()
    {
        return ConfigureDressDelay(15000);
        return null;
    }

    dynamic ConfigureDressDelay(dynamic requested)
    {
        UO.DressSpeed(requested);
        return UO.DressSpeed();
    }
}

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.DressSpeed(value) — UO.DressSpeed(Any)

Parameter: value (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.EnergyResist

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

C#-Signaturen

int UO.EnergyResist();

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.EnergyResist();
UO.Print("EnergyResist: " + 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.EnergyResist();
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.EnergyResist();
    await Delay(500);
    var after = UO.EnergyResist();
    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.EnergyResist();
        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.EnergyResist() — UO.EnergyResist()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "energyresist": return new InjectionValue(bridge.EnergyResistance);

UO.Equip

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

C#-Signaturen

int UO.Equip(object? layer, object? id);

Rüstet die angegebene Ebene deines Charakters mit dem ausgewählten Gegenstand aus.

Parameter

  • layer – Layer-Nummer, zum Beispiel 1 – rechts, 2 – links. Equip und Unequip akzeptieren auch einen Ebenennamen, wie zum Beispiel „Rhand“. WearItem verwendet eine Zahlenebene. Die Schicht muss zur tragbaren Schicht des Artikels passen; es ist nicht graphic und nicht ID.
  • id – ID des spezifischen geladenen Dings: Ganzzahl, Hex-String, „lasttarget“ oder Name AddObject. Das ist nicht type. Beispiel: 0x0F5E sucht zuerst nach dem Schwert von graphic und erhält es von ID.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – lokaler Vorgang akzeptiert, 0 (Bedingung nicht erfüllt) – Ablehnung. Dies ist keine Serverbestätigung, kein ID und keine Menge. Der Server kann später ausfallen. Überprüfen Sie nach der Beantwortung die tatsächliche Ausrüstung.

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

  • Benötigt geladene Elemente und freies Ziehen mit der Hand. Beim Entfernen ist der eigentliche Rucksack self erforderlich; der Ersatzrucksack GrabBag wird nicht verwendet. Unbekannte, zerstörte und ungeeignete Artikel werden zurückgewiesen. Gegenstände anderer Personen können nicht über UnequipItems entfernt werden. Ein Set ist keine atomare Transaktion.
  • EquipItems/UnequipItems gilt DressSpeed nach der akzeptierten Operation vor dem nächsten Element; Disarm/Undress - nach jeder belegten Ebene. Die Auszahlung respektiert zusätzlich DropDelay, wenn der Übertrag akzeptiert wird. Die gleichen Einstellungen anderer Laufzeiten ändern sich nicht; Die Beschleunigung setzt Servereinschränkungen nicht außer Kraft.
  • Ein falsches Aufrufformular, ein unbekannter Layername oder ein Wert, der nicht in eine Zahl konvertierbar ist, können zu einem Skriptfehler anstelle von 0 führen. Der Geräte-Snapshot enthält nur bereits geladene Daten. Im Assistenten ist ChangeAndConfirm Layer=1 die rechte Hand: Übergeben Sie zum anderen die eigentliche Ebene.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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.

int item = UO.LastTarget();
if (item != 0)
    UO.Print("Accepted flag: " + UO.Equip(1, item));

1. Equip – Ein ausgewähltes Element oder eine ausgewählte Ebene – direktes Skript

Parameter und Ablauf:

  • Wählen Sie zunächst den entsprechenden Gegenstand im Spiel aus: lasttarget – es ist ID. Im Beispiel Equip/WearItem erfordert die Ebene 1 eine Nebenhandwaffe. Unequip(1) entfernt die rechte Hand; Disarm/Undress arbeiten mit ihren eigenen festen Ebenen. Es gibt keine automatischen Wiederholungen nach einer Ablehnung.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.Equip(1, item);

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;

2. Equip – Zwei Elemente und gespeichert ID – Skriptfunktion

Parameter und Ablauf:

  • Zum Ausrüsten ist 0x0F5E ein Beispiel für ein Schwert, 0x1B76 ein Beispiel für einen Schild. FindType sucht sie unter den geladenen Gegenständen des Rucksacks, ASC wandelt das zurückgegebene Hex-ID um. Zum Entfernen werden die eigenen aktuellen Layer gelesen. Wenn das erforderliche Element nicht verfügbar ist, wird das Skript beendet. Das Array speichert zwei ID; Jeder Artikel wird vollständig übertragen.
return  RunScenario();
 object? RunScenario()
{
    var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
    var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    var firstOk = UO.Equip(1, first);
    var secondOk = UO.Equip(2, second);
    return firstOk != 0 && secondOk != 0;
    return null;
}

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. Equip – Volle Funktion mit begrenzter Wartezeit – Skriptklasse

Parameter und Ablauf:

  • ChangeAndConfirm führt den Befehl einmal aus. Anschließend wird der Ist-Zustand bis zu 20 Mal mit einer Pause von 100 ms überprüft. 1 – die Prüfung hat den erwarteten Zustand festgestellt, 0 – Fehler oder abgelaufene Wartezeit. Dies ist das Ergebnis unseres Helfers, kein neuer integrierter Befehl. Auch der Aufruf des Vorgangs selbst kann einige Zeit in Anspruch nehmen.
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 item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (!(Truth(UO.Equip(layer, item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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.Equip(layer, id) — UO.Equip(Any,Any)

Parameter: layer (Any/String), id (Any/Integer/String)

Ergebnis: int / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "equip":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Equip(Text(0), Arg(1)) : bridge.Equip(Arg(0), Arg(1)));

UO.Equip(layer, id) — UO.Equip(String,Integer)

Parameter: layer (Any/String), id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Equip(string layer, int id) => bridge.Equip(ConvertLayer(layer), id);

UO.Equip(layer, id) — UO.Equip(String,String)

Parameter: layer (Any/String), id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Equip(string layer, string id) => Equip(layer, GetObject(id));

UO.EquipDressSet

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

C#-Signaturen

dynamic UO.EquipDressSet();

Alternativer Name DressSavedSet: Stellt dasselbe unbenannte Kleidungsstück wieder her.

Parameter

Es gibt keine Parameter.

Rückgabewert

Tatsächlich ist das numerische Flag int: 1 (Bedingung erfüllt) – alle erforderlichen Anforderungen werden lokal akzeptiert oder die erforderlichen Schichten wurden bereits abgeglichen; 0 (Bedingung nicht erfüllt) – kein Wählen, keine Verbindung oder mindestens eine Anfrage wurde abgelehnt. Anmeldung object? ermöglicht dies int. Dabei handelt es sich nicht um ID, die Anzahl der getragenen Gegenstände oder eine Serverbestätigung.

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

  • Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
  • Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
  • Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
  • Eine exakte Übereinstimmung zwischen dem aktuellen und dem gespeicherten ID wird übersprungen, ohne erneut verwendet/erhöht zu werden. Ein fehlender Artikel wird nicht durch einen ähnlichen type ersetzt. Das Scheitern einer Operation macht erfolgreiche Operationen nicht zunichte und beeinträchtigt nicht die Versuche anderer; Es gibt kein automatisches Rollback. Benötige Verbindung und geladenes Zeug. Im abgenommenen Zustand kommt ein echter Rucksack zum Einsatz.
  • UO.Set("equipfordress", 0) wählt die Aufforderung zur Verwendung des Artikels aus (Anfangsmodus); Wert ungleich Null – Aufnehmen/Ausrüsten. In beiden Modi wird die gewünschte tragbare Schicht überprüft. Ein bereits getragener Artikel kann nicht durch wiederholtes Tragen ausgetauscht werden. DressSpeed ist nach der angenommenen Anfrage gültig, beim Widerruf gilt zusätzlich DropDelay.
  • Dress und Arm geben null zurück, auch bei einem Fehler. Die Meldung, dass Anfragen angenommen wurden, bedeutet keine Bestätigung durch den Server. Für eine vom Anziehen abhängige Fortsetzung überprüfen Sie die tatsächlichen Schichten mit begrenzter Erwartung.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Der erforderliche Satz muss zuvor im gleichen Laufzeitzustand gespeichert werden. Rufen Sie SetDress/SetArm nicht unmittelbar vor jeder Wiederherstellung auf: Dadurch wird das Ziel mit den aktuellen Elementen überschrieben.
return UO.EquipDressSet();

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Eine Ausrüstungsadresse ungleich Null wählt Abholung/Ausrüstung aus; 350 – Millisekunden DressSpeed. Diese Einstellungen bleiben auch nach dem Beispiel zur Laufzeit erhalten. Über das Aus- und Anziehen entscheidet der Server.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.EquipDressSet();
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • lasttarget – ID Dinge, die in einem zuvor gespeicherten Satz enthalten sein sollten. Die Kontrollschicht 3 bedeutet Schuhe, 1 bedeutet rechte Hand. AwaitSlot gleicht 20 mit einer Pause von 100 ms aus und wiederholt den Befehl nicht. Dadurch wird nur das ausgewählte Element bestätigt, nicht der gesamte Satz.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        if (!(Truth(UO.EquipDressSet())))
        {
            return 0;
        }

        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.EquipItems

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

C#-Signaturen

dynamic UO.EquipItems(object? items);

Rüste einen Gegenstand oder eine Reihe von Gegenständen aus. Die Schicht jedes Artikels wird durch seine tragbaren Daten bestimmt, sodass der Artikel aus einem Rucksack heraus angelegt werden kann.

Parameter

  • items – Erforderlich ID oder Array ID von Elementen. Array-Elemente sind Zahlen oder numerische Hex-Strings. Das einzelne Argument akzeptiert auch „lasttarget“/Name AddObject. Verwenden Sie für ein Array die Variablendeklaration items[1] für zwei Elemente an den Indizes 0 und 1. Es werden Dinge übertragen, keine Schichtnummern und nicht type.

Rückgabewert

Numerisches Flag int: 1 (Bedingung erfüllt) – lokaler Vorgang akzeptiert, 0 (Bedingung nicht erfüllt) – Ablehnung. Dies ist keine Serverbestätigung, kein ID und keine Menge. Der Server kann später ausfallen. Überprüfen Sie nach der Beantwortung die tatsächliche Ausrüstung.

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

  • Benötigt geladene Elemente und freies Ziehen mit der Hand. Beim Entfernen ist der eigentliche Rucksack self erforderlich; der Ersatzrucksack GrabBag wird nicht verwendet. Unbekannte, zerstörte und ungeeignete Artikel werden zurückgewiesen. Gegenstände anderer Personen können nicht über UnequipItems entfernt werden. Ein Set ist keine atomare Transaktion.
  • EquipItems/UnequipItems gilt DressSpeed nach der akzeptierten Operation vor dem nächsten Element; Disarm/Undress - nach jeder belegten Ebene. Die Auszahlung respektiert zusätzlich DropDelay, wenn der Übertrag akzeptiert wird. Die gleichen Einstellungen anderer Laufzeiten ändern sich nicht; Die Beschleunigung setzt Servereinschränkungen nicht außer Kraft.
  • Ein falsches Aufrufformular, ein unbekannter Layername oder ein Wert, der nicht in eine Zahl konvertierbar ist, können zu einem Skriptfehler anstelle von 0 führen. Der Geräte-Snapshot enthält nur bereits geladene Daten. Im Assistenten ist ChangeAndConfirm Layer=1 die rechte Hand: Übergeben Sie zum anderen die eigentliche Ebene.
  • Für ein Array bedeutet 1, dass alle aufgelisteten Operationen akzeptiert werden; im Falle einer Ablehnung wird 0 zurückgegeben. Die restlichen Elemente werden weiterhin verarbeitet, es erfolgt kein Rollback. Ein leeres Array erzeugt 1 ohne Aktion. Disarm/Undress geben 1 auch dann, wenn die erforderlichen Ebenen bereits leer sind; Teilausfall ergibt 0.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

1. EquipItems – Ein ausgewähltes Element oder eine ausgewählte Ebene – direktes Skript

Parameter und Ablauf:

  • Wählen Sie zunächst den entsprechenden Gegenstand im Spiel aus: lasttarget – es ist ID. Im Beispiel Equip/WearItem erfordert die Ebene 1 eine Nebenhandwaffe. Unequip(1) entfernt die rechte Hand; Disarm/Undress arbeiten mit ihren eigenen festen Ebenen. Es gibt keine automatischen Wiederholungen nach einer Ablehnung.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.EquipItems(item);

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;

2. EquipItems – Zwei Elemente und gespeichert ID – Skriptfunktion

Parameter und Ablauf:

  • Zum Ausrüsten ist 0x0F5E ein Beispiel für ein Schwert, 0x1B76 ein Beispiel für einen Schild. FindType sucht sie unter den geladenen Gegenständen des Rucksacks, ASC wandelt das zurückgegebene Hex-ID um. Zum Entfernen werden die eigenen aktuellen Layer gelesen. Wenn das erforderliche Element nicht verfügbar ist, wird das Skript beendet. Das Array speichert zwei ID; Jeder Artikel wird vollständig übertragen.
return  RunScenario();
 object? RunScenario()
{
    var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
    var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    dynamic[] items = new dynamic[checked((int)(1) + 1)];
    items[0] = first;
    items[1] = second;
    return UO.EquipItems(items);
    return null;
}

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. EquipItems – Volle Funktion mit begrenzter Wartezeit – Skriptklasse

Parameter und Ablauf:

  • ChangeAndConfirm führt den Befehl einmal aus. Anschließend wird der Ist-Zustand bis zu 20 Mal mit einer Pause von 100 ms überprüft. 1 – die Prüfung hat den erwarteten Zustand festgestellt, 0 – Fehler oder abgelaufene Wartezeit. Dies ist das Ergebnis unseres Helfers, kein neuer integrierter Befehl. Auch der Aufruf des Vorgangs selbst kann einige Zeit in Anspruch nehmen.
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 item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (!(Truth(UO.EquipItems(item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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.EquipItems(items) — UO.EquipItems(Any)

Parameter: items (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "equipitems":

                    return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), true));

UO.EquipLastWeapon

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

C#-Signaturen

void UO.EquipLastWeapon();

Fordert die Neuausrüstung der zuletzt gespeicherten Gegenstände für die rechte und linke Hand an.

Parameter

Es gibt keine Parameter.

Rückgabewert

void – kein Rückgabewert.

Verhalten

  • Bridge speichert _lastRightHand und _lastLeftHand. Ein rechts ungleich Null serial wird Equip(OneHanded) übertragen, ein ungleich Null links - Equip(TwoHanded). Leere Einträge werden übersprungen. Dabei handelt es sich um zwei mögliche Anfragen, nicht um eine atomar bestätigte Wiederherstellung durch den Server.

Eigenständige C#-Skripte

Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.

Einfaches Beispiel

Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.

Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.

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

1. Waffe wiederherstellen – direktes Skript

Parameter und Ablauf:

  • Es werden nur gespeicherte Bridge-serial-Zeiger verwendet.
UO.EquipLastWeapon();

2. Wenn eine Verbindung besteht - Skriptfunktion

Parameter und Ablauf:

  • Verbindungstests werden durchgeführt, bevor Anfragen gesendet werden.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.EquipLastWeapon();
    }

    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. Wiederherstellungsverfahren – Skriptklasse

Parameter und Ablauf:

  • Ein vollständig deklarierter Helfer führt dazu, dass ein Satz Hände wiederhergestellt wird.
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()
    {
        RestoreWeapons();
        return null;
    }

    void RestoreWeapons()
    {
        UO.EquipLastWeapon();
    }
}

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

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "equiplastweapon": bridge.EquipLastWeapon(); return InjectionValue.Unit;

UO.EquipT

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

C#-Signaturen

void UO.EquipT(object? layer, object? @type);

Parameter

  • layer – Ausrüstungsschicht. Die Zeile „Rhand“ ist die rechte Hand (1), „Lhand“ ist die linke Hand (2); eine numerische Zahl ist ebenfalls akzeptabel. Alle erkannten Namen werden in der Layertabelle aufgelistet. Die Zeichenfolge „1“ ersetzt nicht die Zahl 1: Ein unbekannter Zeichenfolgenname verursacht einen Fehler. Wählen Sie die tatsächliche Ebene des Dings selbst aus: Der Befehl ändert seinen gültigen Steckplatz nicht.
  • type – Ein graphic-Gegenstand, zum Beispiel 0x0F51 – ein Dolch. Es ist nicht serial einer bestimmten Sache und nicht graphic eines Körpers mobile. Eine Zahl oder eine numerische Hexadezimalzeichenfolge. Farbe ist nicht angegeben: Es wird nach jedem hue gesucht; Die Suche umfasst rekursiv die geladenen Unterbehälter des Rucksacks. -1/0xFFFF, da Wildcard-Suchen hier für die Waffenauswahl praktisch nutzlos sind: Das erste, was möglicherweise nicht mit der Ebene übereinstimmt, wird genommen.

Rückgabewert

void: Dieses C#-Formular gibt keinen Wert zurück. Weisen Sie den Aufruf keiner Variablen zu und verwenden Sie ihn nicht in if. Um die Annahme einer Anfrage mit zwei ganzzahligen Argumenten zu testen, verwenden Sie UO.Equipt. Überprüfen Sie in beiden Fällen die tatsächliche Ausstattung, nachdem der Server über ObjAtLayer und GetType antwortet.

Verhalten

  • Beide Argumente sind erforderlich. Zuerst sucht FindType nach einem Gegenstand im Rucksack, dann prüft Equip dessen Eignung. Die Suche aktualisiert die Gesamtergebnisse FindItem/FindCount/GetFoundItems. Bei mehreren Treffern wird das erste für die Suche geeignete Element ausgewählt; Es gibt keine separate Auswahl für Qualität, hue oder Namen.
  • Der Kunde überprüft die tragbare Flagge, die tatsächliche Schicht des Artikels (1..29) und die Fähigkeit, ihn anzuheben. Der Artikel muss geladen sein. Darüber hinaus entscheidet der Server, ob es getragen werden darf; Eine akzeptierte lokale Anfrage ist kein Erfolg.
  • Wenn ein Artikel fehlt, zeigt das void-Formular die Meldung „Kein Artikel gefunden“ an; Die numerische Form gibt 0 zurück. Wenn Sie einen bestimmten Artikel nach Farbe/serial auswählen müssen, verwenden Sie separate FindType und Equip. UO.Equip nimmt ID des gefundenen Gegenstands.
  • Während Sie auf eine Antwort warten, starten Sie nicht gleichzeitig eine weitere Artikelübertragung. Überprüfen Sie die Ebenenänderungen, anstatt die Aktion endlos zu wiederholen.

Eigenständige C#-Skripte

Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.

Einfaches Beispiel

Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.

Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.

UO.Print("Calling UO.EquipT");
UO.EquipT("Rhand", 0x0F51);

1. Dolch nach String-Layer-Namen ausrüsten – direktes Skript

Parameter und Ablauf:

  • Die Rhand-Linie wählt die rechte Ebene aus. Der Dolch muss in einem beladenen Rucksack erreichbar sein. Jede Farbe; die Anzahl der Argumente beträgt immer zwei.
if (Truth(UO.Connected()))
{
    UO.EquipT("Rhand", 0x0F51);
}

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

2. Fehler im Nummernformular behandeln – Skriptfunktion

Parameter und Ablauf:

  • 1 – Schicht, 0x0F51 – type. Die Zeichenfolge C# aus EquipT gibt void zurück; Die Annahme einer Anfrage kann nicht anhand des Ergebnisses überprüft werden. 300 ms – zum Beispiel kurze Wartezeit; Das Fehlen einer Sache danach ist kein Beweis für einen endgültigen Serverausfall.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.EquipT("Rhand", 0x0F51);
    await Delay(300);
    var worn = UO.ObjAtLayer(1);
    if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
    {
        UO.AddObject("equipped_dagger", worn);
    }

    return null;
}

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

3. Volle Funktion: Anlegen und auf die gewünschte type - Szenarioklasse warten

Parameter und Ablauf:

  • timeoutMs=2000 gibt die maximale Wartezeit in Millisekunden an. Die Überprüfung alle 50 ms sendet keine Neuausrüstung. Das true dieser benutzerdefinierten Funktion bedeutet, dass der Client bereits das gewünschte type auf der Ebene sieht; Dies ist eine stärkere Prüfung als die zurückgegebene Equipt-Anfrageannahme.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        if (Truth(UO.Connected()) && !(Truth(await EnsureDagger(2000))))
        {
            UO.Print("Dagger was not confirmed within the timeout");
        }

        return null;
    }

    async Task<dynamic> EnsureDagger(dynamic timeoutMs)
    {
        var worn = UO.ObjAtLayer(1);
        if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
        {
            return true;
        }

        UO.EquipT("Rhand", 0x0F51);
        var started = Now();
        while (Truth(Now() - started < timeoutMs))
        {
            await Delay(50);
            worn = UO.ObjAtLayer(1);
            if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
            {
                return true;
            }
        }

        return false;
    }

    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;
    private int Now() => global::ClassicUO.CSharp.CSharpScriptContext.Current.Now();
}

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.EquipT(layer, type) — UO.EquipT(Any,Any)

Parameter: layer (Any), type (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void EquipT(InjectionValue layer, InjectionValue type)

        {

            var obj = bridge.FindType(ResolveType(type), -1, bridge.Backpack, -1, true);

            if (obj == 0)

            {

                SystemMessage("No item found.");

                return;

            }



            if (layer.Kind == InjectionValueKind.String)

                Equip(layer.String, obj);

            else

                bridge.Equip(NumberConversions.ToInt(layer), obj);

        }

UO.Equipt

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

C#-Signaturen

int UO.Equipt(object? layer, object? @type);

Parameter

  • layer / Schicht – Ganzzahl der Ausrüstungsschicht. Rechte Hand – 1, linke Hand – 2. Wählen Sie einen echten Gegenstandsplatz.
  • type / type – ein ganzes graphic eines Gegenstands, zum Beispiel 0x0F51 für einen Dolch. Das ist nicht serial. Sucht nach hue im geladenen Inhalt des Rucksacks und in verschachtelten Containern.

Rückgabewert

Dieses C#-Formular gibt int zurück: 1, wenn der Kunde die Outfit-Anfrage akzeptiert hat, andernfalls 0. Übergeben Sie zwei ganze Zahlen (Schichtnummer und graphic); String-Werte wählen einen anderen Laufzeitvertrag aus und sind für diese Form nicht geeignet. Der Anruf wartet nicht auf die Bestätigung des Servers. Verwenden Sie für einen String-Layer-Namen UO.EquipT, was void zurückgibt.

Verhalten

  • Beide Argumente sind erforderlich. Zuerst sucht FindType nach einem Gegenstand im Rucksack, dann prüft Equip dessen Eignung. Die Suche aktualisiert die Gesamtergebnisse FindItem/FindCount/GetFoundItems. Bei mehreren Treffern wird das erste für die Suche geeignete Element ausgewählt; Es gibt keine separate Auswahl für Qualität, hue oder Namen.
  • Der Kunde überprüft die tragbare Flagge, die tatsächliche Schicht des Artikels (1..29) und die Fähigkeit, ihn anzuheben. Der Artikel muss geladen sein. Darüber hinaus entscheidet der Server, ob es getragen werden darf; Eine akzeptierte lokale Anfrage ist kein Erfolg.
  • Wenn ein Artikel fehlt, zeigt das null-Formular die Meldung „Kein Artikel gefunden“ an; Die numerische Form gibt 0 zurück. Wenn Sie einen bestimmten Artikel nach Farbe/serial auswählen müssen, verwenden Sie separate FindType und Equip. UO.Equip nimmt ID des gefundenen Gegenstands.
  • Während Sie auf eine Antwort warten, starten Sie nicht gleichzeitig eine weitere Artikelübertragung. Überprüfen Sie die Ebenenänderungen, anstatt die Aktion endlos zu wiederholen.

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.Equipt(1, 0x0F51);
UO.Print("Equipt: " + Convert.ToString(result));

1. Fordern Sie Dolchausrüstung per graphic an – direktes Skript

Parameter und Ablauf:

  • Beide Argumente sind ganze Zahlen: Schicht 1 und graphic des Dolches. Der Wert 1 bestätigt, dass die Anfrage vom Client und nicht vom Server angenommen wurde.
int accepted = UO.Equipt(1, 0x0F51);
UO.Print(accepted != 0 ? "Equip request accepted locally" : "Equip request not accepted");

2. Slot nach Anfrage prüfen – Script-Funktion

Parameter und Ablauf:

  • Warten ist kein Ersatz für die Überprüfung: Es wird das tatsächliche Ding auf der Ebene gelesen. Das Skript wiederholt die Übertragung nicht endlos.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    int accepted = UO.Equipt(1, 0x0F51);
    if (accepted == 0)
        return false;
    await WaitAsync(300);
    int worn = UO.ObjAtLayer(1);
    return worn != 0 && UO.GetType(worn) == 0x0F51;
    return null;
}

3. Nur tragen, wenn der benötigte Artikel nicht verfügbar ist – Szenarioklasse

Parameter und Ablauf:

  • Zunächst wird die aktuelle Ausrüstung überprüft; Nach einer Anfrage ist die Verifizierung auf zwanzig Versuche begrenzt.
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()
    {
        return await EnsureDagger();
        return null;
    }

    async Task<bool> EnsureDagger()
    {
        int current = UO.ObjAtLayer(1);
        if (current != 0 && UO.GetType(current) == 0x0F51)
            return true;
        if (UO.Equipt(1, 0x0F51) == 0)
            return false;
        for (int attempt = 0; attempt < 20; attempt++)
        {
            await WaitAsync(100);
            current = UO.ObjAtLayer(1);
            if (current != 0 && UO.GetType(current) == 0x0F51)
                return true;
        }

        return false;
    }
}

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.Equipt(layer, type) — UO.Equipt(Integer,Integer)

Parameter: layer (Integer), type (Integer)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Equipt(int layer, int type)

        {

            int item = bridge.FindType(type, -1, bridge.Backpack, -1, true);

            return item == 0 ? 0 : bridge.Equip(layer, item);

        }

UO.FireResist

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

C#-Signaturen

int UO.FireResist();

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.FireResist();
UO.Print("FireResist: " + 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.FireResist();
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.FireResist();
    await Delay(500);
    var after = UO.FireResist();
    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.FireResist();
        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.FireResist() — UO.FireResist()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "fireresist": return new InjectionValue(bridge.FireResistance);

UO.Flying

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

C#-Signaturen

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

Ü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

  • id – 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.Flying();
UO.Print("Flying: " + 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.Flying();
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.Flying(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.Flying()))
        {
            return true;
        }

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

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

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

        return UO.Flying();
    }

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

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.Flying(id) — UO.Flying(Any)

Parameter: id (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.Frozen

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

C#-Signaturen

int UO.Frozen();
int UO.Frozen(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.Frozen();
UO.Print("Frozen: " + 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.Frozen();
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.Frozen(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.Frozen()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.Frozen()) == 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.Frozen() — UO.Frozen()

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.Frozen(value) — UO.Frozen(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.GetARStatus

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

C#-Signaturen

dynamic UO.GetARStatus();

Liest das Flag für die automatische Wiederverbindung der aktuellen Managersitzung oder des globalen Clients.

Parameter

Es gibt keine Parameter.

Rückgabewert

int 1 – automatische Wiederverbindung ist aktiviert; 0 – deaktiviert.

Verhalten

  • SessionControl.AutoReconnect hat Vorrang. Wenn SessionControl fehlt, wird Settings.GlobalSettings.Reconnect verwendet. Dies ist eine Einstellung, nicht der Status der aktuellen Verbindung oder die Anzahl der Versuche.

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

1. Leseeinstellung – Direktskript

Parameter und Ablauf:

  • Beim Lesen wird keine Verbindung hergestellt.
var enabled = UO.GetARStatus();
UO.Print(Convert.ToString(enabled));

2. Zu Verbindung zuordnen – Skriptfunktion

Parameter und Ablauf:

  • Die AR-Einstellung und die tatsächliche Verbindung sind zwei separate Werte.
return  RunScenario();
 object? RunScenario()
{
    var enabled = UO.GetARStatus();
    var online = UO.Connected();
    UO.Print(Convert.ToString(enabled) + " " + Convert.ToString(online));
    return null;
}

3. Manuelle Verbindung, wenn AR ausgeschaltet ist – Szenarioklasse

Parameter und Ablauf:

  • Connect manuell zulässig, wenn die automatische Wiederverbindung deaktiviert ist.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(UO.GetARStatus() == 0) && !(Truth(UO.Connected())))
        {
            UO.Connect();
        }

        return null;
    }

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

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

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getarstatus": return new InjectionValue(bridge.GetAutoReconnect());

UO.GetAlive

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

C#-Signaturen

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

Überprüft das Vorhandensein eines Objekts ohne Todeszeichen.

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 – positiv serial existiert und ist nicht als tot markiert. Der berühmte Artikel gibt auch 1: Dies ist nicht der mobile-Filter. Ein totes/fehlendes Objekt gibt 0.

Das Ergebnis des Befehls ist ein numerisches Flag: 1 bedeutet eine erfüllte Bedingung, 0 bedeutet eine nicht erfüllte Bedingung. Nach var result = command(...) prüfen, ob (result != 0) oder if (result == 0). Speichern Sie das Ergebnis eines Aufrufs: Ein wiederholter Aufruf kann die Aktion erneut ausführen oder den Status lesen, der sich bereits geändert hat.

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.GetAlive();
UO.Print("GetAlive: " + 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.GetAlive();
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.GetAlive(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.GetAlive();
        await Delay(500);
        var after = UO.GetAlive();
        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.GetAlive() — UO.GetAlive()

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 => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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.GetAlive(value) — UO.GetAlive(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 => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

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

C#-Signaturen

int UO.GetArmor();

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.GetArmor();
UO.Print("GetArmor: " + 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.GetArmor();
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.GetArmor();
    await Delay(500);
    var after = UO.GetArmor();
    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.GetArmor();
        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.GetArmor() — UO.GetArmor()

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

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

C#-Signaturen

int UO.GetColdResist();

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.GetColdResist();
UO.Print("GetColdResist: " + 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.GetColdResist();
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.GetColdResist();
    await Delay(500);
    var after = UO.GetColdResist();
    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.GetColdResist();
        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.GetColdResist() — UO.GetColdResist()

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

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

C#-Signaturen

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

Überprüft den Tod eines 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 IsDead, 0 hat kein Vorzeichen oder mobile fehlt. HP=0 allein bedeutet nicht den Tod.

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.GetDead();
UO.Print("GetDead: " + 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.GetDead();
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.GetDead(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.GetDead();
        await Delay(500);
        var after = UO.GetDead();
        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.GetDead() — UO.GetDead()

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.

IsDeadState

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

IsDeadState

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

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

C#-Signaturen

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

Liest die aktuelle Beweglichkeit (Dexterity, DEX) 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.Dexterity, 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.Dex(), UO.Dexterity(), UO.GetDex(), UO.GetDexterity().
  • 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.GetDex();
UO.Print("GetDex: " + 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.GetDex();
UO.Print("Dexterity: " + 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.GetDex();
    await Delay(1000);
    var after = UO.GetDex();
    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.GetDex();
        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.GetDex(id);
    var byName = UO.GetDex("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.GetDex() — UO.GetDex()

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

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

UO.GetDex(objID) — UO.GetDex(Any)

Parameter: objID (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getdex": return new InjectionValue(arguments.Length > 0 ? bridge.GetDexterity(Arg(0)) : bridge.Dexterity);

UO.GetDexterity

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

C#-Signaturen

int UO.GetDexterity();

Liest die aktuelle Beweglichkeit (Dexterity, DEX) 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.Dexterity, 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.Dex(), UO.Dexterity(), UO.GetDex(), UO.GetDexterity().

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.GetDexterity();
UO.Print("GetDexterity: " + 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.GetDexterity();
UO.Print("Dexterity: " + 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.GetDexterity();
    await Delay(1000);
    var after = UO.GetDexterity();
    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.GetDexterity();
        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.GetDexterity() — UO.GetDexterity()

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

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


UO.GetEnergyResist

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

C#-Signaturen

int UO.GetEnergyResist();

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.GetEnergyResist();
UO.Print("GetEnergyResist: " + 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.GetEnergyResist();
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.GetEnergyResist();
    await Delay(500);
    var after = UO.GetEnergyResist();
    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.GetEnergyResist();
        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.GetEnergyResist() — UO.GetEnergyResist()

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.

Clone this wiki locally