DE UO Topic multis houses - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Multis & Häuser

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

Zusammengesetzte Objekte der Welt: Häuser und andere Multis, ihre Teile und Position auf der Karte.

Abschnitte

Thema Befehle und Erklärungen
GetMultis UO.GetMultis
Multi Parts UO.GetMultiAllParts
Parts at Position UO.GetMultiPartsAtPosition
IsHouse UO.IsHouse

Alle Theme-Befehle

Multis / Häuser

UO.GetMultis · UO.GetMultiAllParts · UO.GetMultiPartsAtPosition · UO.IsHouse

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

Parameter, Ergebnis und alle Szenarien

var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));

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

UO.GetMultiAllParts

Parameter, Ergebnis und alle Szenarien

var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
    return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));

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;

Vollständige Befehlsreferenz


UO.GetMultiAllParts

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

C#-Signaturen

dynamic UO.GetMultiAllParts(object? multiID);

Liest Aufzeichnungen einer Komponente eines Hauses.

Parameter

  • multiID – Seriell/ID eines bestimmten Objekts: int, Dezimal-/Hex-Zeichenfolge oder Set-Alias ​​self, backpack, lasttarget, lastobject oder Name AddObject. Dies ist nicht graphic/type. Es sollte ID zu Hause in HouseManager geladen sein.

Rückgabewert

Array<Array>. Jede Zeile enthält 9 Felder: [0] graphic/type Komponenten, [1] hue, [2] Welt X, [3] Welt Y, [4] Welt Z, [5] multiOffsetX – Offset X von Multi, [6] multiOffsetY – Offset Y, [7] multiOffsetZ – Offset Z, [8] multiSerial - serial zu Hause. Keine Komponenten – leeres Array. Grafik ist nicht ID; Die einzelnen statischen Komponenten haben hier keine eigene serial.

Verhalten

  • Vom Client bereits heruntergeladene Daten werden gelesen. Der Befehl öffnet nicht den Container, verschiebt keine Elemente und lädt keine Objekte vom gesamten Server herunter.
  • Array – Array mit Indizes beginnend bei 0. Speichern Sie es in var, überprüfen Sie ArrayLength, bevor Sie darauf zugreifen. Nach der Aufnahme eines Schnappschusses können Elemente aus der Welt verschwinden: Überprüfen Sie „Exists(serial)“, bevor Sie Maßnahmen ergreifen.
  • Es werden die bekannten, nicht gelöschten Komponenten HouseManager zurückgegeben. Separate statische Karten und Grundstücke sind in dieser Liste nicht enthalten. Zeilen sind eine Momentaufnahme; Eine feste Reihenfolge oder Z-Sortierung wird nicht versprochen.

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.

var multis = (object?[])UO.GetMultis();
if (multis.Length > 0) {
    var parts = (object?[])UO.GetMultiAllParts(multis[0]);
    UO.Print("Parts: " + parts.Length);
}

1. Komponenten zählen – direktes Skript

Parameter und Ablauf:

  • Zunächst wird ein beladenes Haus ausgewählt.
  • Die Länge ist die Anzahl der Komponenten, nicht deren Höhe oder die Anzahl der Häuser.
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
    return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));

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;

2. Lesen Sie graphic und Position der ersten Komponente – Skriptfunktion

Parameter und Ablauf:

  • parts[0] ist die erste Zeile des Arrays. Ihr [0] – type, [2]/[3]/[4] – Welt X/Y/Z.
  • Die Indizes [5]/[6]/[7] enthalten stattdessen relative Offsets.
return  RunScenario();
 object? RunScenario()
{
    var houses = UO.GetMultis();
    if (Truth(ArrayLength(houses) == 0))
    {
        return null;
    }

    var parts = UO.GetMultiAllParts(houses[0]);
    if (Truth(ArrayLength(parts) > 0))
    {
        var part = parts[0];
        UO.Print("Type: 0x" + Hex(part[0]));
        UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
    }

    return null;
}

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

3. Traverse-Komponenten und Ausgabebesitzer – Skriptklasse

Parameter und Ablauf:

  • [8] ist serial zu Hause, [7] ist der Offset von Z Komponenten.
  • Übergeben Sie Teil[0] nicht an einen Befehl, der zu Hause serial erwartet: Das ist graphic einer separaten Komponente.
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 houses = UO.GetMultis();
        if (Truth(ArrayLength(houses) == 0))
        {
            return null;
        }

        var parts = UO.GetMultiAllParts(houses[0]);
        var i = 0;
        while (Truth(i < ArrayLength(parts)))
        {
            var part = parts[i];
            UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
            i = i + 1;
        }

        return null;
    }

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

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.GetMultiAllParts(multiID) — UO.GetMultiAllParts(Any)

Parameter: multiID (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmultiallparts":

                    return new InjectionValue((bridge.GetMultiAllParts(Arg(0)) ?? Array.Empty<int[]>())

                        .Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());

UO.GetMultiPartsAtPosition

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

C#-Signaturen

dynamic UO.GetMultiPartsAtPosition(object? x, object? y);

Liest die Komponenten von Häusern in der angegebenen Weltzelle.

Parameter

  • x – Welt-X-Koordinate der aktuellen Kartenzelle, nicht der Versatz innerhalb des Hauses.
  • y — Weltkoordinate Y der Zelle. Die Komponenten aller beladenen Häuser in dieser Zelle werden auf allen Z-Höhen zurückgegeben.

Rückgabewert

Array<Array>. Jede Zeile enthält 9 Felder: [0] graphic/type Komponenten, [1] hue, [2] Welt X, [3] Welt Y, [4] Welt Z, [5] multiOffsetX – Offset X von Multi, [6] multiOffsetY – Offset Y, [7] multiOffsetZ – Offset Z, [8] multiSerial - serial zu Hause. Keine Komponenten – leeres Array. Grafik ist nicht ID; Die einzelnen statischen Komponenten haben hier keine eigene serial.

Verhalten

  • Vom Client bereits heruntergeladene Daten werden gelesen. Der Befehl öffnet nicht den Container, verschiebt keine Elemente und lädt keine Objekte vom gesamten Server herunter.
  • Array – Array mit Indizes beginnend bei 0. Speichern Sie es in var, überprüfen Sie ArrayLength, bevor Sie darauf zugreifen. Nach der Aufnahme eines Schnappschusses können Elemente aus der Welt verschwinden: Überprüfen Sie „Exists(serial)“, bevor Sie Maßnahmen ergreifen.
  • Es werden die bekannten, nicht gelöschten Komponenten HouseManager zurückgegeben. Separate statische Karten und Grundstücke sind in dieser Liste nicht enthalten. Zeilen sind eine Momentaufnahme; Eine feste Reihenfolge oder Z-Sortierung wird nicht versprochen.

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

1. Komponenten zählen – direktes Skript

Parameter und Ablauf:

  • X/Y – die aktuelle Position des Charakters.
  • Die Länge ist die Anzahl der Komponenten, nicht deren Höhe oder die Anzahl der Häuser.
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(Convert.ToString(ArrayLength(parts)));

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

2. Lesen Sie graphic und Position der ersten Komponente – Skriptfunktion

Parameter und Ablauf:

  • parts[0] ist die erste Zeile des Arrays. Ihr [0] – type, [2]/[3]/[4] – Welt X/Y/Z.
  • Die Indizes [5]/[6]/[7] enthalten stattdessen relative Offsets.
return  RunScenario();
 object? RunScenario()
{
    var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(parts) > 0))
    {
        var part = parts[0];
        UO.Print("Type: 0x" + Hex(part[0]));
        UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
    }

    return null;
}

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

3. Traverse-Komponenten und Ausgabebesitzer – Skriptklasse

Parameter und Ablauf:

  • [8] ist serial zu Hause, [7] ist der Offset von Z Komponenten.
  • Übergeben Sie Teil[0] nicht an einen Befehl, der zu Hause serial erwartet: Das ist graphic einer separaten Komponente.
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 parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(parts)))
        {
            var part = parts[i];
            UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
            i = i + 1;
        }

        return null;
    }

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

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.GetMultiPartsAtPosition(x, y) — UO.GetMultiPartsAtPosition(Any,Any)

Parameter: x (Any), y (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmultipartsatposition":

                    return new InjectionValue((bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)) ?? Array.Empty<int[]>())

                        .Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());

UO.GetMultis

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

C#-Signaturen

dynamic UO.GetMultis();

Liste der geladenen Objekte, die vom Client als Home/Multi erkannt wurden.

Parameter

Es gibt keine Parameter.

Rückgabewert

Array ist serial von Weltelementen, für die IsHouse 1 zurückgibt. Ein leeres Array, wenn keine solchen Objekte vorhanden sind. Dies sind ID Häuser, keine Liste von Grafikkomponenten, keine Koordinaten und keine Liste aller Häuser auf dem Server.

Verhalten

  • Vom Client bereits heruntergeladene Daten werden gelesen. Der Befehl öffnet nicht den Container, verschiebt keine Elemente und lädt keine Objekte vom gesamten Server herunter.
  • Array – Array mit Indizes beginnend bei 0. Speichern Sie es in var, überprüfen Sie ArrayLength, bevor Sie darauf zugreifen. Nach der Aufnahme eines Schnappschusses können Elemente aus der Welt verschwinden: Überprüfen Sie „Exists(serial)“, bevor Sie Maßnahmen ergreifen.
  • Daten werden von geladenen Weltelementen gelesen. Für Komponenten eines Hauses verwenden Sie GetMultiAllParts(serial).

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

1. Listengröße abrufen – direktes Skript

Parameter und Ablauf:

  • Es gibt keine Parameter; Beladene Haus-/Mehrfachartikel sind ausgewählt.
  • Länge – Anzahl der Datensätze/ID. Dies ist nicht die Anzahl der Stapel. Die leere Liste ergibt 0.
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));

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

2. Alle gefundenen ID durchlaufen – Skriptfunktion

Parameter und Ablauf:

  • Es gibt keine Parameter; Beladene Haus-/Mehrfachartikel sind ausgewählt.
  • items[i] – numerisch serial. Hex wird nur für die Ausgabe verwendet. Die Schleife greift nicht auf den letzten Index zu.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetMultis();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

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

Parameter und Ablauf:

  • Es gibt keine Parameter; Beladene Haus-/Mehrfachartikel sind ausgewählt.
  • Es werden zwei verschiedene Dinge überprüft: der Datensatz im Snapshot und die aktuelle Existenz des Objekts. Ordnung ohne explizite Sortierung bedeutet nicht Nähe.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = UO.GetMultis();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

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

Implementierung des Befehls

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

UO.GetMultis() — UO.GetMultis()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmultis":

                    return new InjectionValue(bridge.GetWorldItems().Where(id => bridge.IsHouse(id) != 0).Select(id => new InjectionValue(id)).ToArray());

UO.IsHouse

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

C#-Signaturen

int UO.IsHouse(object? objID);

Überprüft das Multi-Flag für ein geladenes Objekt: ein Haus, ein Schiff oder eine andere Struktur mit mehreren Kacheln.

Parameter

  • objID – Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse oder Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel.

Rückgabewert

int 1 – ein Artikel mit dem Attribut IsMulti. int 0 – ein gewöhnliches Objekt, mobile, ein unbekanntes oder entferntes Objekt. Der Name beschränkt das Ergebnis nicht auf Häuser: Ein Schiff kann auch 1 geben. Das Team gibt keinen Hausbesitzer, keine Region oder kein Gebiet zurück.

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

  • Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
  • Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.

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

1. Überprüfen Sie das ausgewählte Design – direktes Skript

Parameter und Ablauf:

  • Das Ziel sollte den serial des Mehrfachobjekts enthalten, nicht den graphic der einzelnen Wand.
  • 1 bedeutet Klasse Multi; Dies ist kein Beweis dafür, dass es sich bei dem Bauwerk um ein Wohngebäude handelt.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsHouse(target)))
{
    UO.Print("Loaded multi structure");
}

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

2. Trennen Sie Multi von regulären Elementen – Skriptfunktion

Parameter und Ablauf:

  • Zuerst wird die Anwesenheit geprüft, dann wird mobile eliminiert.
  • „Zero without Exists“ könnte das Fehlen eines Objekts und nicht eines gewöhnlichen Objekts bedeuten.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        if (Truth(UO.IsNPC(target) == 0))
        {
            if (Truth(UO.IsHouse(target)))
            {
                UO.Print("Multi");
            }
            else
            {
                UO.Print("Ordinary item");
            }
        }
    }

    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. Verwechseln Sie die Position des Charakters nicht mit der Hausobjekt-Szenarioklasse

Parameter und Ablauf:

  • self ist mobile, also ist das erste Ergebnis 0, sogar innerhalb des Hauses.
  • Um ein Konstrukt zu testen, übergeben Sie sein eigenes serial; Das Team sucht nicht nach einem Haus rund um den Charakter.
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 selfIsMulti = UO.IsHouse("self");
        var selectedIsMulti = UO.IsHouse("lasttarget");
        UO.Print("Self: " + Convert.ToString(selfIsMulti));
        UO.Print("Selected object: " + Convert.ToString(selectedIsMulti));
        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.IsHouse(objID) — UO.IsHouse(Any)

Parameter: objID (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "ishouse": return new InjectionValue(bridge.IsHouse(Arg(0)));
⚠️ **GitHub.com Fallback** ⚠️