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

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

Charakter — 5

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

Referenzteile

1 · 2 · 3 · 4 · 5

Vollständige Befehlsreferenz


UO.Undress

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

C#-Signaturen

int UO.Undress();

Entfernt Kleidung und Rüstung aus den Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Hände, Haare, Bart, Rucksack, Reittier und Bank werden nicht beeinträchtigt.

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

1. Undress – 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.Undress();

2. Undress – 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(5, UO.Self());
    var second = UO.ObjAtLayerEx(4, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    return UO.Undress();
    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. Undress – 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.Undress())))
        {
            return 0;
        }

        dynamic[] layers = new dynamic[checked((int)(16) + 1)];
        layers[0] = 3;
        layers[1] = 4;
        layers[2] = 5;
        layers[3] = 6;
        layers[4] = 7;
        layers[5] = 8;
        layers[6] = 10;
        layers[7] = 12;
        layers[8] = 13;
        layers[9] = 14;
        layers[10] = 17;
        layers[11] = 18;
        layers[12] = 19;
        layers[13] = 20;
        layers[14] = 22;
        layers[15] = 23;
        layers[16] = 24;
        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.Undress() — UO.Undress()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Undress()

            => Unequip(dressLayers, "Clothing removed.");

UO.Unequip

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

C#-Signaturen

int UO.Unequip(object? layer);

Entfernt seinen Gegenstand aus der angegebenen Ebene in seinen eigenen Rucksack.

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.

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.

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

1. Unequip – 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.Unequip(1);

2. Unequip – 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);
    var firstOk = UO.Unequip(1);
    var secondOk = UO.Unequip(2);
    return firstOk != 0 && secondOk != 0;
    return null;
}

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

3. Unequip – 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 = UO.ObjAtLayerEx(1, UO.Self());
        return ChangeAndConfirm(1, item);
        return null;
    }

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

        if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

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

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

            UO.Wait(100);
        }

        return 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.Unequip(layer) — UO.Unequip(Any)

Parameter: layer (Any/String)

Ergebnis: int / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "unequip":

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

UO.Unequip(layer) — UO.Unequip(String)

Parameter: layer (Any/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));

UO.UnequipItems

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

C#-Signaturen

dynamic UO.UnequipItems(object? items);

Nimmt die aufgeführten persönlichen Gegenstände in den Rucksack auf. ID des Artikels einer anderen Person entfernt Ihren Artikel nicht aus derselben Ebene.

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

1. UnequipItems – 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.UnequipItems(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. UnequipItems – 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);
    dynamic[] items = new dynamic[checked((int)(1) + 1)];
    items[0] = first;
    items[1] = second;
    return UO.UnequipItems(items);
    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. UnequipItems – 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.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

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

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
            {
                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.UnequipItems(items) — UO.UnequipItems(Any)

Parameter: items (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "unequipitems":

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

UO.UnsetArm

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

C#-Signaturen

void UO.UnsetArm(object? name);

Entfernt einen Eintrag für ein benanntes Waffenset, ohne den Charakter zu entwaffnen.

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.
  • Die Löschung betrifft nur die Eingabe des ausgewählten Namens. Gegenstände bleiben auf dem Charakter, andere Namen und andere Arten von Sets sind davon nicht betroffen. Das erneute Löschen eines fehlenden Eintrags ist akzeptabel. Für UnsetDress und UnsetArm ist ein Name erforderlich.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.

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

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Nur der angegebene Eintrag wird gelöscht. Kleidung/Waffen können nicht entfernt werden.
UO.UnsetArm("battle");

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Die Namen Reisen und Kampf werden separat gelöscht. Der gleiche Name eines anderen Satztyps bleibt erhalten.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetArm("travel");
    UO.UnsetArm("battle");
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • CleanupSets ist eine vollständig deklarierte Prozedur zum Bereinigen zweier Eigennamen. Präfix generiert Eintragsnamen, keine Dateipfade.
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()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetArm(prefix + "travel");
        UO.UnsetArm(prefix + "battle");
    }
}

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

Parameter: name (String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void UnsetArm(string name)

        {

            armSets.Remove(name);

            SystemMessage("Arm set removed.");

        }

UO.UnsetDress

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

C#-Signaturen

void UO.UnsetDress(object? name);

Löscht einen Eintrag für ein benanntes Kleidungsstück, ohne die Artikel zu entfernen.

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.
  • Die Löschung betrifft nur die Eingabe des ausgewählten Namens. Gegenstände bleiben auf dem Charakter, andere Namen und andere Arten von Sets sind davon nicht betroffen. Das erneute Löschen eines fehlenden Eintrags ist akzeptabel. Für UnsetDress und UnsetArm ist ein Name erforderlich.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.

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

1. Direkte Nutzung – direktes Skript

Parameter und Ablauf:

  • Nur der angegebene Eintrag wird gelöscht. Kleidung/Waffen können nicht entfernt werden.
UO.UnsetDress("travel");

2. Namen und Abfragemodus – Skriptfunktion

Parameter und Ablauf:

  • Die Namen Reisen und Kampf werden separat gelöscht. Der gleiche Name eines anderen Satztyps bleibt erhalten.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetDress("travel");
    UO.UnsetDress("battle");
    return null;
}

3. Vollständiges Hilfsskript – Skriptklasse

Parameter und Ablauf:

  • CleanupSets ist eine vollständig deklarierte Prozedur zum Bereinigen zweier Eigennamen. Präfix generiert Eintragsnamen, keine Dateipfade.
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()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetDress(prefix + "travel");
        UO.UnsetDress(prefix + "battle");
    }
}

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

Parameter: name (String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void UnsetDress(string name)

        {

            dressSets.Remove(name);

            SystemMessage("Dress set removed.");

        }

UO.UseOtherPaperdollScroll

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

C#-Signaturen

void UO.UseOtherPaperdollScroll(object? objID);

Verwendet das angegebene serial via Bridge.UseObject und öffnet normalerweise die Paperdoll des Charakters.

Parameter

  • objID – Serielles/ID-Objekt: int, numerische/Hex-Zeichenfolge oder etablierter Alias, zum Beispiel „lasttarget“. Dies ist nicht graphic/type. Überprüfen Sie das geladene Objekt, bevor Sie Maßnahmen ergreifen.

Rückgabewert

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

Verhalten

  • ObjID bezieht sich auf das Zeichen, nicht auf die Scroll-Schaltfläche ID. Der Aufruf liest die Paperdoll-Struktur nicht und wartet nicht darauf, dass sie geöffnet wird.
  • Bridge sendet die Anfrage im Game-Stream. Es gelten die Serverregeln; Es gibt kein eingebautes Warten auf Bestätigung.

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.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Verwendet das angegebene serial via Bridge.UseObject und öffnet normalerweise die Paperdoll des Charakters.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseOtherPaperdollScroll(id);
}

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

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • ObjID bezieht sich auf das Zeichen, nicht auf die Scroll-Schaltfläche ID. Der Aufruf liest die Paperdoll-Struktur nicht und wartet nicht darauf, dass sie geöffnet wird.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseOtherPaperdollScroll(id);
    }

    return null;
}

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

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Bridge sendet die Anfrage im Game-Stream. Es gelten die Serverregeln; Es gibt kein eingebautes Warten auf Bestätigung.
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()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.UseOtherPaperdollScroll(id);
        }
    }

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

Parameter: objID (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseSelfPaperdollScroll

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

C#-Signaturen

void UO.UseSelfPaperdollScroll();

Verwendet den aktuellen Charakter und öffnet normalerweise eine Paperdoll.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • ExecuteClientApiCompatibility ruft Brücke.UseObject(Brücke.Self) auf. Es gibt kein separates Lesen oder Klicken des Paperdoll-Elements; Dies ist die normale Anfrage UseObject für self.
  • In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Verwendet den aktuellen Charakter und öffnet normalerweise eine Paperdoll.
UO.UseSelfPaperdollScroll();

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • ExecuteClientApiCompatibility ruft Brücke.UseObject(Brücke.Self) auf. Es gibt kein separates Lesen oder Klicken des Paperdoll-Elements; Dies ist die normale Anfrage UseObject für self.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Self() != 0))
    {
        UO.UseSelfPaperdollScroll();
    }

    return null;
}

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

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UseSelfPaperdollScroll();
        UO.Wait(500);
        UO.Print(UO.Name());
        return null;
    }
}

Implementierung des Befehls

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

UO.UseSelfPaperdollScroll() — UO.UseSelfPaperdollScroll()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;

UO.WearItem

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

C#-Signaturen

dynamic UO.WearItem(object? layer, object? objID);

Rüstet den ausgewählten Gegenstand auf der Zahlenebene deines Charakters 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.
  • objID – 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: " + Convert.ToString(UO.WearItem(1, item)));

1. WearItem – 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.WearItem(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. WearItem – 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.WearItem(1, first);
    var secondOk = UO.WearItem(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. WearItem – 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.WearItem(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.WearItem(layer, objID) — UO.WearItem(Any,Any)

Parameter: layer (Any), objID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));

UO.Weight

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

C#-Signaturen

int UO.Weight();

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

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Weight, 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.
  • Weight liest das vom Server gemeldete Gesamtgewicht in Steinen. Welche Gewichte von Körper, Ausrüstung und beiliegenden Taschen in der Menge enthalten sind, ergibt sich aus den Regeln der Scherbe. Das Team geht nicht durch die Behälter, addiert die Gewichte der Artikel nicht und aktualisiert auch nicht die geschlossenen Beutel. Dies ist weder die Weight-Eigenschaft eines einzelnen Artikels noch die Anzahl der Artikel.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.

var result = UO.Weight();
UO.Print("Weight: " + Convert.ToString(result));

1. Gespeicherten Zähler anzeigen – direktes Skript

Parameter und Ablauf:

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

2. Änderung beobachten – Skriptfunktion

Parameter und Ablauf:

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

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

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • CanCarry(extra) erhält zusätzliches Gewicht in Steinen; 10 ist ein Beispiel, nicht die Anzahl der Stapel. Lehnt negatives Extra, kein Spieler oder Maximum <= 0 ab, liest das aktuelle Gewicht und Limit und gibt dann bool zurück: true oder false durch Extra <= Maximum – aktuell. Durch Subtraktion wird ein aktueller + zusätzlicher Überlauf vermieden. Bei Überladung ist das Ergebnis false, auch für extra=0. Dies ist eine lokale Bewertung, keine Serverlösung; Lesevorgänge sind nicht atomar und die Nullgewichtung ist möglicherweise unbekannt.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

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

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

        return extra <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.Weight() — UO.Weight()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "weight": return new InjectionValue(bridge.Weight);
⚠️ **GitHub.com Fallback** ⚠️