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

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

Suchen — 2

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

Referenzteile

1 · 2

Vollständige Befehlsreferenz


UO.FindMan

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

C#-Signaturen

void UO.FindMan();
dynamic UO.FindMan(object? notoriety);
dynamic UO.FindMan(object? notoriety, object? distance);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color, object? includeSelf);

Findet einen serial nach Bekanntheit, Entfernung, Größe, Körper und hue. Wird zur Vorauswahl eines Ziels ohne automatischen Angriff verwendet.

Parameter

  • notoriety – Beziehungsstatus zum vom Server empfangenen Charakter: 0 – unbekannt, 1 – unschuldig, 2 – Verbündeter, 3 – grau, 4 – kriminell, 5 – Feind, 6 – Mörder, 7 – Unverwundbar. Die Zahl bedeutet einen Status; „5|6“ oder eine Reihe von Zahlen – eine der oben genannten. Es liegt nicht an der Farbe der Kleidung oder der Klasse. Eine negative Zahl (normalerweise -1), 0xFFFF, „beliebig“, eine leere Zeichenfolge oder ein leeres Array deaktiviert diesen Filter separat. Eine ungültige Zeichenfolge ohne gültige Zahlen findet niemanden. Die Reihenfolge der Status legt keine Priorität fest. Der 5-Filter wählt den Feind aus, anstatt automatisch ein beliebiges NPC/Monster auszuwählen. Die tatsächlichen Werte hängen vom Server ab.
  • distance – Horizontaler Radius in Zellen einschließlich: 5 ermöglicht den Abstand 0..5. Der Abstand beträgt max(abs(dx),abs(dy)), daher ist die angrenzende Diagonale ebenfalls 1. Standardmäßig oder wenn die Zahl negativ ist, wird UO.FindDistance() anstelle einer unbegrenzten Suche verwendet. 0 verlässt dieselbe X/Y-Zelle. Nicht die Länge der Strecke; Hindernisse und Böden werden von diesem Parameter nicht überprüft.
  • nearest – true/1 standardmäßig – der nächstgelegene, bei gleichem Abstand der kleinere serial; false/0 – der erste auf der Kundenliste, nicht der am weitesten entfernte.
  • maxZ – Maximale Bauchmuskeln (Z des Ziels – Z des eigenen Charakters), einschließlich, in Welt-Z-Einheiten. Dabei handelt es sich nicht um die Anzahl der Stockwerke oder X/Y-Zellen. maxZ=4 mit Z-Spieler 10 erlaubt Z-Ziel 6..14; 0 erfordert genau die gleiche Höhe. Standardmäßig/für eine negative Zahl wird UO.FindVertical() verwendet. Auf der Treppe kann ein gleiches Z das gewünschte Ziel eliminieren. Selbst ein kleiner Unterschied in Z beweist nicht die Zugänglichkeit des Bodens.
  • body – Grafik des Körpers des Charakters/NPC, nicht ID eines bestimmten Charakters und nicht type der getragenen Rüstung. Eine Zahl, eine Hex-Zeichenfolge, die Zeichenfolge „0x0190|0x0191“ oder ein Array von Zahlen. 0x0190 (400) – männlicher Mensch; 0x0191 (401) – weiblicher Mensch. Die Maske vereint beide Körper. Die Liste umfasst nicht automatisch andere Rassen, Geister oder Transformationen; Tabelle der Standard-Grafikkörpertypen. Eine negative Zahl (standardmäßig -1), 0xFFFF, „beliebig“, eine leere Zeichenfolge oder ein leeres Array allein – ein beliebiger Körper. Unbekannter Text ohne gültige Nummer führt zu einem leeren Ergebnis.
  • color – Farbton von mobile selbst: int oder numerische/hexadezimale Zeichenfolge. Negative Zahl (standardmäßig -1) und 0xFFFF – jedes hue; 0 ist genau hue 0 und kein beliebiger Wert. Nicht die Farbe des Berühmtheitsstreifens oder der Farbton der Kleidung. Dieser Parameter überprüft nicht die Farbe des getragenen Artikels.
  • includeSelf - true/1 ermöglicht self vorbehaltlich anderer Filter; false/0 schließt standardmäßig aus. Ignore gilt auch für self.

Rückgabewert

int serial oder 0 ohne Ergebnis. ID prüfen != 0; es ist nicht bool und keine Menge. Ändert FindItem/FindCount/GetFoundItems nicht und leitet keinen Angriff ein.

Verhalten

  • Lokale Suche: nur bereits heruntergeladene Handys. Ignore wird berücksichtigt; self ist ausgeschlossen, mit Ausnahme des expliziten includeSelf=true in den Befehlen, die es unterstützen. Behälter und Gegenstände sind keine Mobilgeräte.
  • Die Bedingungen gelten gemeinsam (AND). Gültige Alternativen innerhalb von body/bekanntheit werden durch OR kombiniert. Die Suche ändert FindItem, FindCount und GetFoundItems nicht.
  • In body/bekanntheit verwendet eine Maske mit gültigen Zahlen genau diese: „any|5“ begrenzt sie immer noch auf den Wert 5. Leere/ungültige Elemente neben gültigen Zahlen werden ignoriert. Für keine Einschränkung übergeben Sie -1 separat. Übertragen Sie diese Regel nicht auf classMask: Unbekannter Klassenname lehnt die gesamte Liste ab.
  • Die Teams öffnen keinen Bereich der Welt, laufen nicht zum Ziel und prüfen nicht die Passierbarkeit der Route. Zwischen der Auswahl und der Verarbeitung durch den Server kann sich der Zustand der Welt ändern.
  • Die Übertragung von true und 1 ist für die Flags false und 0 gleichwertig. Andere Zahlen ungleich Null werden ebenfalls in true umgewandelt, aber 8/9 sind keine separaten Modi; Verwenden Sie klar true/false.
  • Genaue Reihenfolge: Bekanntheit, Entfernung, Nähe, maxZ, body, Farbe, includeSelf. Anders als AttackNearest und GetMobiles.
  • Es gibt keine Parameter classMask, aliveOnly oder visibleOnly. Überprüfen Sie ggf. das gefundene ID separat; Um unter allen lebenden/sichtbaren auszuwählen, verwenden Sie GetMobiles, damit der nächstgelegene Tote die anderen nicht verdeckt.

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

1. Finden und speichern Sie den nächsten Verbündeten – direktes Skript

Parameter und Ablauf:

  • 2 – Verbündeter, 12 – Radius. Der Rest: next=true, maxZ=FindVertical(), alle body/hue, self ausgeschlossen. Das Team rettet nur das Ziel, greift nicht an.
var ally = UO.FindMan(2, 12);
if (Truth(ally == 0))
{
    return null;
}
UO.AddObject("ally_nearby", ally);

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

2. Geben Sie jede Bedingung vor der weiteren Aktion an – Skriptfunktion

Parameter und Ablauf:

  • Die IsDead-Prüfung wurde separat durchgeführt. body spezifiziert Körper; bodyHue=-1 beschränkt sie nicht auf hue. Dieses Team klassifiziert nicht nach Kleidung.
return  RunScenario();
 object? RunScenario()
{
    var status = 5;
    var radius = 8;
    dynamic nearest = true;
    var height = 4;
    var bodies = "0x0190|0x0191";
    var bodyHue = -1;
    dynamic includeMe = false;
    var enemy = UO.FindMan(status, radius, nearest, height, bodies, bodyHue, includeMe);
    if (Truth(enemy != 0))
    {
        if (Truth(UO.IsDead(enemy) == 0))
        {
            UO.Attack(enemy);
        }
    }

    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. Finden Sie zuerst mobile mit der spezifischen hue – Skriptklasse

Parameter und Ablauf:

  • Das erste -1 deaktiviert die Bekanntheit, das zweite -1 deaktiviert body. false in der dritten Position schaltet die Sortierung aus; das letzte false schließt self aus. Der Farbton der Kleidung wird nicht überprüft.
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 chosenHue = 0x0455;
        var mobile = UO.FindMan(-1, 10, false, 8, -1, chosenHue, false);
        if (Truth(mobile == 0))
        {
            return null;
        }

        UO.AddObject("body_hue_match", mobile);
        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.FindMan() — UO.FindMan()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findman":

                {

                    int mobile = bridge.GetMobiles().FirstOrDefault();

                    if (mobile != 0) state.Objects.Set(arguments.Length > 0 ? Text(0) : "findman", mobile);

                    break;

                }

UO.FindMan(notoriety) — UO.FindMan(Any)

Parameter: notoriety (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance) — UO.FindMan(Any,Any)

Parameter: notoriety (Any), distance (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest) — UO.FindMan(Any,Any,Any)

Parameter: notoriety (Any), distance (Any), nearest (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ) — UO.FindMan(Any,Any,Any,Any)

Parameter: notoriety (Any), distance (Any), nearest (Any), maxZ (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body) — UO.FindMan(Any,Any,Any,Any,Any)

Parameter: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body, color) — UO.FindMan(Any,Any,Any,Any,Any,Any)

Parameter: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any), color (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body, color, includeSelf) — UO.FindMan(Any,Any,Any,Any,Any,Any,Any)

Parameter: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any), color (Any), includeSelf (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindMan(values))

UO.FindMobile

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

C#-Signaturen

int UO.FindMobile();
int UO.FindMobile(object? stateFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionOrKind);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionFilter, object? kindFilter);

Findet mithilfe gemeinsamer Zeichenfolgenfilter den nächstgelegenen geladenen Charakter bzw. die geladene Kreatur. Der Spieler selbst ist ausgeschlossen.

Parameter

  • stateFilter – Normalerweise alle / lebendig / tot; optional. Alle Argumente in der Implementierung sind Filterzeichenfolgen, daher ist es akzeptabel, mehrere Wörter in einem Argument zu kombinieren.
  • rangeFilter – Typischerweise alle / nah (0..4) / mittel (5..9) / fern (von 10 bis Gesamtradius). Numerischer Radius wird an dieser Position nicht akzeptiert; die Gesamtgrenze ändert sich durch UO.FindDistance(value).
  • verticalFilter - alles / oben / unten. oben: Kandidat.Z > self.Z, unten: Kandidat.Z < self.Z. Hierbei handelt es sich nicht um eine Boden- oder Z-Zahlentoleranz.
  • directionOrKind – Die vierte Position des Formulars mit vier Argumenten: alle, Norden/Süden/Osten/Westen oder Mensch/NPC/Mob. Kann eine zusammengesetzte Zeichenfolge sein.
  • directionFilter – Die vierte Position des Formulars mit fünf Argumenten: alle oder der Vergleich X/Y Nord/Süd/Ost/West. Dies ist die Position relativ zu self, nicht die Blickrichtung.
  • kindFilter – Fünfte Position: alle / Mensch / NPC / Mob. Der Mensch umfasst männliche und weibliche Körper: 0x0190 – männlicher Mensch, 0x0191 – weiblicher Mensch, sowie die Standardkörper von Elfen/Wasserspeiern und Geistern. Vollständige Liste: Mensch. NPC – IsNpc und Mensch; Mob – IsNpc und NICHT menschlich. Die Wörter Monster und weiblich werden nicht akzeptiert.

Rückgabewert

int: serial von einem mobile oder 0, wenn es keine Übereinstimmungen gibt. Es ist keine Menge, kein Array, nicht type und nicht bool. Scheck gefunden != 0 bedeutet das Vorhandensein des Ergebnisses; Vergleich gefunden == true ist in C# nicht gültig: int ist nicht mit bool vergleichbar.

Verhalten

  • Gilt für UO.FindMobile: 0 bis 5 Argumente. Die fehlenden Endargumente sind alle. Jedes Argument kann ein oder mehrere Wörter enthalten, getrennt durch Leerzeichen, Tabulator, Komma, Semikolon, | oder +. Alle Bedingungen werden durch AND zusammengefasst; Symbol | bedeutet hier nicht OR.
  • Die Suche berücksichtigt nur heruntergeladene Mobiltelefone, schließt self aus und begrenzt die Entfernung auf max(1, UO.FindDistance()). Der Abstand wird nach der Regel max(abs(dx), abs(dy)); gemessen. ein diagonales Quadrat zählt als eins. Bei sich bewegenden Objekten kann die Entfernung die Schrittreihe berücksichtigen und die X/Y/Z-Vergleiche lesen die aktuellen Koordinaten aus.
  • Unter den Passenden wird derjenige ausgewählt, der am nächsten kommt; bei gleichem Abstand - kleiner serial. Gibt int serial oder 0 anstelle von true/false, Anzahl oder Array zurück.
  • UO.FindMobile ändert nicht FindItem/FindCount/GetFoundItems, wendet Ignore und UO.FindVertical nicht an und überprüft nicht die Sicht, Passierbarkeit oder Sichtlinie. Es werden keine entfernten Objekte verschoben, angezielt oder geladen.
  • Numerische Radien/Z/Richtungen, Wörter Monster, Nordosten, Nordwesten, Südosten, Südwesten sind keine Filter. Ein unbekanntes Wort verursacht einen Fehler bei der Prüfung eines Kandidaten; Wenn es keine Kandidaten gibt, kann dieser Abschnitt nicht ausgeführt werden. Kombinieren Sie für einen diagonalen Bereich Nordosten usw.; Verwenden Sie zur numerischen Überprüfung die Eigenschaften gefundener Objekte oder UO.GetMobiles().

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

1. Suchen und überprüfen Sie das Ergebnis – direktes Skript

Parameter und Ablauf:

  • Alles, alles, oben bestanden: Die Höhe des Objekts ist unbedingt größer als das Z des Zeichens. Gleiches Z ist nicht geeignet.
  • 0 wird verarbeitet, bevor Eigenschaften gelesen werden. Print zeigt ID, Namen und Höhen; Es wird keine Spielaktion ausgelöst.
var found = UO.FindMobile("all", "all", "above");
if (Truth(found == 0))
{
    UO.Print("No matching mobile");
    return null;
}
UO.Print("ID: " + Convert.ToString(found) + " | Name: " + UO.GetName(found));
UO.Print("Z: " + Convert.ToString(UO.GetZ(found)) + " | Self Z: " + Convert.ToString(UO.GetZ("self")));

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

2. Kombination von Bedingungen mit Zeitradius – Skriptfunktion

Parameter und Ablauf:

  • 18 – externer Grenzwert; lebendig, nah, alle, alle, Mob legt kooperative Bedingungen fest. nah bleibt der Bereich bis 4, mittel - 5..9, fern - von 10.
  • Gibt bei normalem Abschluss oder einem behandelten Fehler schließlich den vorherigen Radius zurück. Das Skript erweitert das Laden der Welt nicht.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindDistance();
    try
    {
        UO.FindDistance(18);
        var found = UO.FindMobile("alive", "near", "all", "all", "mob");
        if (Truth(found != 0))
        {
            UO.Print("Match: " + Convert.ToString(found));
            UO.Print("Distance: " + Convert.ToString(UO.GetDistance(found)));
        }
        else
        {
            UO.Print("No match in the loaded area");
        }
    }
    finally
    {
        UO.FindDistance(previous);
    }

    return null;
}

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

3. Vollständige Funktion für zusammengesetzten Filter – Skriptklasse

Parameter und Ablauf:

  • Die Zeichenfolge „Nordosten“ wird an den Helfer übergeben. Dabei handelt es sich um mehrere Bedingungen einer Anfrage und nicht um eine sequentielle Suche nach unterschiedlichen Zielen.
  • FindAndDescribe wird vollständig deklariert. Es gibt ID/0 zurück, ohne das Ziel oder den Charakter zu ändern.
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 id = FindAndDescribe("north east");
        UO.Print("Returned ID: " + Convert.ToString(id));
        return null;
    }

    dynamic FindAndDescribe(dynamic filters)
    {
        var id = UO.FindMobile(filters);
        if (Truth(id == 0))
        {
            UO.Print("Nothing matched: " + filters);
            return 0;
        }

        UO.Print(UO.GetName(id) + " | " + Convert.ToString(id));
        return id;
    }

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

4. Finden Sie die Kreatur und überprüfen Sie separat die genaue Entfernung – direktes Skript

Parameter und Ablauf:

  • alive/all/all/all/mob – fünf unterstützte Positionen. Der Abstand 2 wird überprüft, nachdem das nächstgelegene Ergebnis erhalten wurde.
  • Ein solches Skript überprüft nicht den Weg zur Kreatur und setzt sich nicht in Bewegung.
var found = UO.FindMobile("alive", "all", "all", "all", "mob");
if (Truth(found == 0))
{
    UO.Print("No loaded creature");
    return null;
}
if (Truth(UO.GetDistance(found) <= 2))
{
    UO.Print("Creature within two tiles: " + Convert.ToString(found));
}
else
{
    UO.Print("Nearest creature is farther away");
}

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

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int FindMobile() => FindMobile(new InjectionValue("all"), new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter) — UO.FindMobile(Any)

Parameter: stateFilter (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int FindMobile(InjectionValue stateFilter) => FindMobile(stateFilter, new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter) — UO.FindMobile(Any,Any)

Parameter: stateFilter (Any), rangeFilter (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter) => FindMobile(stateFilter,

            rangeFilter, new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter) — UO.FindMobile(Any,Any,Any)

Parameter: stateFilter (Any), rangeFilter (Any), verticalFilter (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter, InjectionValue verticalFilter) =>

            FindMobile(stateFilter, rangeFilter, verticalFilter, new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionOrKind) — UO.FindMobile(Any,Any,Any,Any)

Parameter: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionOrKind (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.

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3]))

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionFilter, kindFilter) — UO.FindMobile(Any,Any,Any,Any,Any)

Parameter: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionFilter (Any), kindFilter (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.

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3], values[4]))

UO.FindNotoriety

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

C#-Signaturen

dynamic UO.FindNotoriety(object? @type, object? notoriety);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color, object? container);

Sucht nacheinander nach einem anderen mobile body/type und erlaubt Bekanntheit. Geeignet, wenn Sie einen bestimmten Charakter mit der richtigen Einstellung benötigen; Mit erweiterten Formen können Sie Radius, Höhe und hue einschränken. Hierbei handelt es sich lediglich um eine Objektauswahl, nicht um einen Angriff.

Parameter

  • type – Ein numerischer Textkörper graphic oder eine Hexadezimalzeichenfolge; nicht serial, nicht type des getragenen Artikels und nicht des Arrays. 0x0190 (400) – männlicher Mensch, 0x0191 (401) – weiblicher Mensch; Dabei handelt es sich um unterschiedliche Präzisionsfilter. Die beiden body erfordern separate Aufrufe oder GetMobiles mit einer Maske. -1 oder 0xFFFF – jeder Körper.
  • notoriety – Beziehungsstatus zum vom Server empfangenen Charakter: 0 – unbekannt, 1 – unschuldig, 2 – Verbündeter, 3 – grau, 4 – kriminell, 5 – Feind, 6 – Mörder, 7 – Unverwundbar. Die Zahl bedeutet einen Status; „5|6“ oder eine Reihe von Zahlen – eine der oben genannten. Es liegt nicht an der Farbe der Kleidung oder der Klasse. Eine negative Zahl (normalerweise -1), 0xFFFF, „beliebig“, eine leere Zeichenfolge oder ein leeres Array deaktiviert diesen Filter separat. Eine ungültige Zeichenfolge ohne gültige Zahlen findet niemanden. Die Reihenfolge der Status legt keine Priorität fest. Der 5-Filter wählt den Feind aus, anstatt automatisch ein beliebiges NPC/Monster auszuwählen. Die tatsächlichen Werte hängen vom Server ab. Mehrere Werte werden als OR kombiniert: die Zahl 5, die Zeichenfolge „5|6“ oder ein flaches Array aus Zahlen/numerischen Zeichenfolgen. Sie können flache Arrays und einzelne Argumente mischen. Die Reihenfolge der Werte legt keine Priorität fest. Nicht numerische Token sind ausgeschlossen; Eine völlig fehlerhafte Maske findet nichts. Verschachtelte Arrays sind keine Zahlen und werden als ungültige Elemente ignoriert; Mehrdimensionale Masken werden nicht unterstützt. Merkmal der numerischen Form mit zwei Argumenten: Nur ein negativer Code deaktiviert den Filter, der numerische 0xFFFF gilt als wörtlicher Code und findet normalerweise niemanden.
  • distance – Horizontaler Radius in Zellen einschließlich: 5 ermöglicht den Abstand 0..5. Der Abstand beträgt max(abs(dx),abs(dy)), daher ist die angrenzende Diagonale ebenfalls 1. Standardmäßig oder wenn die Zahl negativ ist, wird UO.FindDistance() anstelle einer unbegrenzten Suche verwendet. 0 verlässt dieselbe X/Y-Zelle. Nicht die Länge der Strecke; Hindernisse und Böden werden von diesem Parameter nicht überprüft.
  • nearest - false/0 Standard: erster Treffer in der weltweiten Aufzählungsreihenfolge, keine Garantie für den nächsten oder kleineren ID. true/1: am nächsten, wenn gleich, kleiner serial.
  • maxZ – Maximale Bauchmuskeln (Z des Ziels – Z des eigenen Charakters), einschließlich, in Welt-Z-Einheiten. Dabei handelt es sich nicht um die Anzahl der Stockwerke oder X/Y-Zellen. maxZ=4 mit Z-Spieler 10 erlaubt Z-Ziel 6..14; 0 erfordert genau die gleiche Höhe. Standardmäßig/für eine negative Zahl wird UO.FindVertical() verwendet. Auf der Treppe kann ein gleiches Z das gewünschte Ziel eliminieren. Selbst ein kleiner Unterschied in Z beweist nicht die Zugänglichkeit des Bodens.
  • color – Farbton von mobile selbst: int oder numerische/hexadezimale Zeichenfolge. Negative Zahl (standardmäßig -1) und 0xFFFF – jedes hue; 0 ist genau hue 0 und kein beliebiger Wert. Nicht die Farbe des Berühmtheitsstreifens oder der Farbton der Kleidung. Dieser Parameter überprüft nicht die Farbe des getragenen Artikels.
  • container – Standardmäßig nicht vorhanden: Welt. Wenn angegeben, sind ground/"ground"/UO.Ground(), die Zahlen 0/1 und -1/"my" als kompatible Weltbezeichnungen in diesem bestimmten Befehl akzeptabel. Ein expliziter serial-Container oder „backpack“ gibt 0 zurück: Es befinden sich keine Mobiltelefone im Container. Fügt keine Suche nach Dingen hinzu.

Rückgabewert

int - serial des ausgewählten mobile oder 0, wenn es kein passendes gibt. Dies ist ID, nicht graphic/type, die Anzahl der gefundenen Objekte oder true/false: verwenden Sie if (found != 0) { ... }, not found == true. Ein gefundenes ID kann an UO.AddObject, UO.Attack oder UO.Follow übergeben werden, allerdings wird jede Spielaktion separat aufgerufen.

Verhalten

  • Die Suche liest nur Mobiltelefone, die bereits vom Client heruntergeladen wurden; Vernichtete Datensätze und Ignore sind ausgeschlossen. Der Aufruf selbst öffnet kein Ziel, greift nicht an, geht nicht zum Ziel und fordert keine Remote-Objekte vom Server an.
  • Die Entfernung ist geometrisch max(abs(dx),abs(dy)), nicht die Routenlänge. Die Nähe garantiert nicht das Fehlen einer Wand oder die Zugänglichkeit einer anderen Etage. Der Zustand kann sich bei der Rückgabe ändern.
  • Leben, Tarnung und Sichtlinie werden nicht automatisch überprüft. Wenn sie wichtig sind, verwenden Sie GetMobiles mit aliveOnly/visibleOnly oder Ihre eigenen Schecks. Wenn ein Server den Status „Feind“ hat, ist kein NPC berechtigt.
  • Von 2 bis 7 Argumenten. Um maxZ zu übertragen, müssen Sie die vorherige Entfernung und den nächsten Abstand angeben. Für mehrfache Bekanntheit in diesem Befehl verwenden Sie eine einzelne Maske „5|6“ oder ein flaches Array im zweiten Argument; Das dritte Argument ist die Distanz, nicht der zweite Status.
  • Ein wichtiger Unterschied in der Form: zwei Argumente mit NUMERIC Notoriety Call Bridge.FindNotoriety, wobei das alte FindItem/FindCount/GetFoundItems verworfen und alle Übereinstimmungen aufgezeichnet werden. Zwei STRING/ARARY-Argumente sowie alle Formen mit 3..7-Argumenten geben nur ID zurück und behalten die gleichen Find*-Felder bei. Lesen Sie FindCount nicht als Ergebnis einer erweiterten Abfrage.
  • Alle Formen schließen self und Ignore aus, verwenden Sie die Grenze Z; Live-/sichtbare Filter und keine Sichtlinie. Keine Übereinstimmungen geben 0 zurück. Unlesbares type/distance/maxZ/color führt zu einem Konvertierungsfehler.

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

1. Zählen Sie Männer und Frauen mit dem Ruf eines Feindes – direktes Drehbuch

Parameter und Ablauf:

  • 0x0190 (400) ist ein männlicher menschlicher Körper, 0x0191 (401) ist ein weiblicher menschlicher Körper. 5 – Feind. Jeder Anruf erhält EIN body; Die Zeichenfolge 0x0190|0x0191 wird an dieser Position nicht unterstützt. Es werden die aktuellen FindDistance/FindVertical verwendet.
  • Nach dem zweiten Aufruf beziehen sich FindItem/FindCount/GetFoundItems nur auf weibliche Körper; die erste Menge wird in menCount gespeichert. Der zurückgegebene Mann/die zurückgegebene Frau ist der erste serial oder 0, nicht die Nummer. NPC mit solchen Körpern können ebenfalls in das Ergebnis einbezogen werden; Geister und andere Rassen sind in diesen beiden body nicht enthalten.
var man = UO.FindNotoriety(0x0190, 5);
var menCount = UO.FindCount();
var woman = UO.FindNotoriety(0x0191, 5);
var womenCount = UO.FindCount();
UO.Print("Male humans: " + Convert.ToString(menCount));
UO.Print("Female humans: " + Convert.ToString(womenCount));
UO.Print("Total humans: " + Convert.ToString(menCount + womenCount));

2. Der nächstgelegene von zwei höhenbegrenzten Status – Skriptfunktion

Parameter und Ablauf:

  • -1 im ersten Parameter – beliebiger Körper; -1 im sechsten - beliebiges hue. ground – Frieden. FindCount wurde seit diesem Formular nicht aktualisiert; Verwendung gefunden.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindNotoriety(-1, "5|6", 12, true, 4, -1, "ground");
    if (Truth(found != 0))
    {
        UO.AddObject("near_enemy", found);
    }

    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. Array von Status im zweiten Parameter – Szenarioklasse

Parameter und Ablauf:

  • Das Array enthält zwei Codes. Fehlende Endargumente bedeuten den aktuellen Radius/Z, den nächsten=false und jeden hue. Dies ist nicht der Eintrag UO.FindNotoriety(type,5,6): dort wäre 6 der Radius.
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()
    {
        dynamic[] allowed = new dynamic[checked((int)(1) + 1)];
        allowed[0] = 5;
        allowed[1] = 6;
        var found = UO.FindNotoriety(0x0191, allowed);
        if (Truth(found != 0))
        {
            UO.AddObject("allowed_mobile", found);
            UO.Print("Selected ID: " + Convert.ToString(found));
        }

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

Parameter: type (Any), notoriety (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance) — UO.FindNotoriety(Any,Any,Any)

Parameter: type (Any), notoriety (Any), distance (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest) — UO.FindNotoriety(Any,Any,Any,Any)

Parameter: type (Any), notoriety (Any), distance (Any), nearest (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ) — UO.FindNotoriety(Any,Any,Any,Any,Any)

Parameter: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color) — UO.FindNotoriety(Any,Any,Any,Any,Any,Any)

Parameter: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any), color (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color, container) — UO.FindNotoriety(Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any), color (Any), container (Any)

Ergebnis: dynamic / Any.

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.

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindQuantity

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

C#-Signaturen

dynamic UO.FindQuantity();

Liest die aktuelle Menge im ersten Suchergebnis.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – aktuelle Menge des Artikels mit serial FindItem, 1 für ein vorhandenes Zeichen, 0 für ein fehlendes/gelöschtes Objekt. Andere gefundene Stapel sind nicht kumulativ. Im Gegensatz zu FindFullQuantity wird beim Aufruf die Menge aus dem aktuellen Objekt gelesen.

Verhalten

  • Die Daten gehören zur letzten normalen Suche dieses Skripts. FindType mit 1–5-Argumenten, FindTypeEx, Count/CountEx/CountGround ersetzen die Ergebnisse. Zum Ändern dieses Snapshots sind keine erweiterten gefilterten Zeichenbefehle erforderlich.
  • Eine neue Suche ohne Übereinstimmungen löscht FindItem, FindCount und FindFullQuantity sowie GetFoundItems. Das alleinige Lesen eines Ergebnisses löst keine neue Suche aus.

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.

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.FindQuantity();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Gold-Suchergebnisse messen – direktes Skript

Parameter und Ablauf:

  • type=0x0EED – Gold; color=-1 – beliebig hue; backpack – nur der direkte Inhalt des Rucksacks in dieser Form FindType.
  • int – aktuelle Menge des Artikels mit serial FindItem, 1 für ein vorhandenes Zeichen, 0 für ein fehlendes/gelöschtes Objekt. Andere gefundene Stapel sind nicht kumulativ. Im Gegensatz zu FindFullQuantity wird beim Aufruf die Menge aus dem aktuellen Objekt gelesen.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindQuantity();
UO.Print(Convert.ToString(value));

2. Artikel und Einheiten vergleichen – Skriptfunktion

Parameter und Ablauf:

  • Alle vier Lesevorgänge gehören zu einer Suche, bis dazwischen eine weitere Suche aufgerufen wird.
  • Zum Beispiel zwei Stapel von 50: Artikel=2, Erster Stapel=50, Alle Einheiten=100; Zuerst enthält ID das eindeutige ID eines Stapels.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    UO.Print("Items: " + Convert.ToString(UO.FindCount()));
    UO.Print("First stack: " + Convert.ToString(UO.FindQuantity()));
    UO.Print("All units: " + Convert.ToString(UO.FindFullQuantity()));
    UO.Print("First ID: 0x" + Hex(UO.FindItem()));
    return null;
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

3. Ergebnis bis zur nächsten Suche speichern – Skriptklasse

Parameter und Ablauf:

  • Das erste type ist Gold, das zweite 0x0F7A ist ein separater Reagenztyp. Das neue Team verändert die Gesamtaufnahme.
  • Gespeichert bleibt die Nummer aus der ersten Suche. Der zweite Messwert gilt für das Reagenz, auch wenn keine Übereinstimmung vorliegt.
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 found = UO.FindType(0x0EED, -1, "backpack");
        var saved = UO.FindQuantity();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindQuantity()));
        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.FindQuantity() — UO.FindQuantity()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findquantity": return new InjectionValue(bridge.FindQuantity());

UO.FindType

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

C#-Signaturen

string UO.FindType(object? @type);
string UO.FindType(object? @type, object? color);
string UO.FindType(object? @type, object? color, object? container);
string UO.FindType(object? @type, object? color, object? container, object? range);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? recursive);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly, object? nameMask);

Sucht nach Elementen und Charakteren, die bereits vom Client heruntergeladen wurden. Sie können nach Typ, Farbe, Behälter, Entfernung und zusätzlichen Filtern suchen. Das Ergebnis ist der Hex-String serial des ausgewählten Objekts; Eine leere Zeichenfolge bedeutet keine Übereinstimmung. Das Team selbst öffnet keine Container, hebt keinen Gegenstand auf und greift das gefundene Ziel nicht an.

Parameter

  • type – Ein graphic-Element oder body-Zeichen: Ganzzahl oder Zahlenzeichenfolge. 0x0EED - Gold; 0x0190 (400) – männlicher Mensch; 0x0191 (401) – weiblicher Mensch. Ein type 0x0190 beinhaltet nicht 0x0191. Um Charaktere beider Geschlechter aufzulisten, verwenden Sie GetMobiles mit body="0x0190|0x0191"; die Maske wird nicht an dieses einzelne Argument FindType übergeben. Ein negativer Wert oder 0xFFFF löscht den Typfilter.
  • color – Farbton/Farbe: Ganzzahl oder Zahlenfolge. -1 oder 0xFFFF bedeutet jede Farbe; 0 – speziell hue 0. Merkmal des Formulars mit zwei Argumenten: Die Zeilen „ground“, „backpack“, „my“ an zweiter Stelle wählen den Suchbereich anstelle der Farbe aus. „my“ ermöglicht die Umgehung beladener Untercontainer.
  • container – Suchbereich: „ground“ – die Welt, „backpack“ – die oberste Ebene Ihres Rucksacks, „my“ – ein Rucksack mit beladenen Unterbehältern in Kurzform; Sie können auch serial des Containers oder den gespeicherten Namen des Objekts übergeben. Container öffnen sich nicht automatisch. Die erweiterten Formen 7–14 der Argumente iterieren über den direkten Inhalt des angegebenen Containers und haben kein rekursives Flag.
  • range – Das vierte Argument der Vier-Argument-Form: Abstand in Zellen. Ein negativer Wert verwendet die allgemeine Einstellung FindDistance; 0 hinterlässt nur Übereinstimmungen in derselben Zelle. Für einen Artikel in einem Container wird die Position des Containers in der Welt berücksichtigt.
  • distance – Abstand in Zellen an Position 4 in Form von fünf Argumenten. -1 verwendet FindDistance; Die Zahl 0 und höher legt einen expliziten Grenzwert fest. Dies ist der Suchradius, nicht die Länge der Route.
  • recursive – NUR das fünfte Argument der Form von fünf Argumenten: 1/true – sucht auch in geladenen Untercontainern, 0/false – nur die oberste Ebene. Das ist keine Berühmtheit. Durch den Wechsel zur Form mit sechs Argumenten ändert sich die Bedeutung der Position 5.
  • notoriety – Position von 5 in den Argumentformen 6–14. Ruf des Charakters: 0 unbekannt, 1 unschuldig, 2 Verbündeter, 3 angreifbar, 4 kriminell, 5 Feind, 6 Mörder, 7 unverwundbar. Sie können eine Zahl, die Zeichenfolge „3|6“ oder ein Array von Werten übergeben. -1, 0xFFFF oder „any“ deaktiviert den Filter. Wenn der Filter aktiv ist, werden Elemente ausgeschlossen: Sie haben keinen Bekanntheitsgrad.
  • nearest – Position 6: 1/true – wählen Sie das am nächsten geeignete Zeichen aus und in der erweiterten Form 7–14 – den am nächsten liegenden Kandidaten eines beliebigen zulässigen Typs; wenn der Abstand gleich ist, wird serial verwendet. 0/false behält die Suchreihenfolge bei. Im Formular mit sechs Argumenten wird bei der Suche nach Artikeln die normale Artikelsuchreihenfolge verwendet.
  • maxZ - Position 7: maximale absolute Z-Höhendifferenz mit eigenem Zeichen. 0 – gleiche Höhe; -1 benötigt FindVertical. Bei Gegenständen innerhalb eines Containers wird die Höhe des Containers überprüft. Dies ist keine Etagennummer.
  • mobileOnly – Position 8: 1/true – nur Charaktere und Mobs belassen; 0/false – auch Elemente zulassen. Wenn es kein Argument gibt, false.
  • itemOnly – Position 9: 1/true – nur Objekte belassen; 0/false – auch Zeichen zulassen. Falls fehlend, false. Gleichzeitiges mobileOnly=true und itemOnly=true ergibt ein leeres Ergebnis.
  • includeIgnored – Position 10: 1/true – Objekte von IgnoreList zulassen; 0/false – schließen Sie sie aus. Der Standardwert ist false. Der Befehl IgnoreList selbst ändert sich nicht.
  • includeSelf – Position 11: 1/true – erlauben Sie Ihren eigenen Charakter unter den Kandidaten mobile; 0/false – ausschließen. Der Standardwert ist false. Betrifft keine Gegenstände.
  • aliveOnly – Position 12: 1/true – tote Zeichen ausschließen; 0/false – beide Zustände zulassen. Der Standardwert ist false. Dieser Filter prüft nicht den Zustand des Artikels.
  • visibleOnly – Position 13: 1/true – positive Prüfung erforderlich IsVisible; 0/false – nicht verwenden. Der Standardwert ist false. Der Befehl funktioniert weiterhin nur mit Objekten, die dem Client bekannt sind.
  • nameMask – Position 14: Textteil des Namens, Groß- und Kleinschreibung wird nicht beachtet. Die Zeichenfolge „orc|troll“ ermöglicht eine der beiden Übereinstimmungen; Trennzeichen können auch Kommas und Semikolons sein. Eine leere Zeichenfolge, „any“ oder „-1“, entfernt den Filter. Dies ist eine Teilzeichenfolgensuche, kein regulärer Ausdruck oder eine Maske mit *. Fehlt das Argument, ist der Filter deaktiviert.

Rückgabewert

string: Zum Beispiel „0x40001234“. Wenn nichts gefunden wird - „“. Überprüfen Sie das Ergebnis, indem Sie es mit einer leeren Zeichenfolge vergleichen. Verwechseln Sie es nicht mit der Anzahl der gefundenen Objekte oder der Anzahl der Schritte zu ihnen.

Verhalten

  • Es gibt Formen mit den Argumenten 1–14, aber dies ist keine lange Signatur mit willkürlich weggelassenen Parametern. Wählen Sie die genaue Syntaxzeile aus. Argumente werden positionell übergeben.
  • Die Formulare 1–5 verwenden die normale Suche und aktualisieren FindItem/FindCount/ die Ergebnisliste. Verwenden Sie für die Formen 6–14 die zurückgegebene Zeichenfolge direkt: Die Zeichenfilterung erfolgt auf separate Weise und verspricht nicht, diese gemeinsamen Werte zu aktualisieren.
  • Bei Kurzformen erfolgt die Suche standardmäßig in der Welt, beliebiger Farbe, Abstand FindDistance, ohne Rekursion. Die Zeichenfolge „my“ ist eine spezielle Kurzform für einen Rucksack mit Untercontainern.
  • Das Formular mit sechs Argumenten sucht zunächst nach einem passenden Zeichen; In Ermangelung eines Bekanntheitsfilters und eines geeigneten Charakters ist die Suche nach Objekten möglich. Die Formen 7–14 kombinieren aufgelöste Kandidaten und wenden zusätzliche Filter an.
  • Besonders wichtig ist die Änderung der Anzahl der Argumente von fünf auf sechs: Rekursiv wird durch Notorietät ersetzt und am nächsten wird das sechste Argument. Der Wert 1 an Position 5 bedeutet dann unschuldige, nicht rekursive Durchquerung.

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

1. Finden Sie Gold in der obersten Ebene des Rucksacks und verarbeiten Sie das fehlende Ergebnis – direktes Skript

Parameter und Ablauf:

  • 1: type=0x0EED – auf der Suche nach Gold.
  • 2: Farbe=-1 – jedes hue.
  • 3: container="backpack" – nur der direkte Inhalt Ihres Rucksacks.
  • Gold erhält die Zeichenfolge serial. Der Gold=""-Check trennt den fehlenden Artikel vom gefundenen Artikel. Info(Gold) zeigt Informationen an; Das Gold bewegt sich nicht.
var gold = UO.FindType(0x0EED, -1, "backpack");
if (Truth(gold == ""))
{
    UO.Print("Gold was not found in the loaded backpack");
}
else
{
    UO.Print("Gold serial: " + gold);
    UO.Info(gold);
}

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

2. Rekursive Suche nach einem Artikel in beladenen Rucksacktaschen – Skriptfunktion

Parameter und Ablauf:

  • 1: wantedType enthält graphic 0x0EED.
  • 2: -1 entfernt den Farbfilter.
  • 3: „backpack“ wählt den Root-Container aus.
  • 4: -1 verwendet den aktuellen FindDistance.
  • 5: rekursiv=1 ermöglicht das Durchqueren von Untercontainern; Dies ist eine Form mit fünf Argumenten. Der Inhalt einer geschlossenen Tasche, die der Server noch nicht gesendet hat, wird auf diese Weise nicht geladen.
  • AddObject speichert das gefundene serial erst nach Überprüfung des Ergebnisses unter dem Namenfound_gold.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var recursive = 1;
    var found = UO.FindType(wantedType, -1, "backpack", -1, recursive);
    if (Truth(found != ""))
    {
        UO.AddObject("found_gold", found);
        UO.Print("Saved object: " + found);
    }
    else
    {
        UO.Print("No matching item in loaded containers");
    }

    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. Finden Sie den nächstgelegenen Charakter mit einem von zwei Rufen – Szenarioklasse

Parameter und Ablauf:

  • 1: body=-1 erlaubt jedes body.
  • 2: color=-1 erlaubt jede Farbe.
  • 3: „ground“ bedeutet geladene Weltobjekte.
  • 4: radius=10 begrenzt den Abstand auf zehn Zellen.
  • 5: Ruf="3|6" – angreifbar oder Mörder. Es ist bekannt, nicht rekursiv.
  • 6: nächstgelegene=1 fordert Sie auf, das nächstgelegene auszuwählen. Der Reputationsfilter schließt Elemente aus. Das Beispiel zeigt nur Informationen an und greift das Ziel nicht an.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var body = -1;
        var radius = 10;
        var reputation = "3|6";
        var nearest = 1;
        var found = UO.FindType(body, -1, "ground", radius, reputation, nearest);
        if (Truth(found != ""))
        {
            UO.Print("Matching mobile: " + found);
            UO.Info(found);
        }
        else
        {
            UO.Print("No matching mobile within the radius");
        }

        return null;
    }

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

4. Alle vierzehn Parameter: ein live sichtbarer Mob mit passendem Namen – direktes Skript

Parameter und Ablauf:

  • 1 body=-1 und 2 hue=-1 schränken Typ und Farbe nicht ein.
  • 3 Scope="ground" – Suche in der Welt; 4 Radius=5 – nicht weiter als fünf Zellen.
  • 5 Ruf=-1 erlaubt jede Berühmtheit; 6 near=1 wählt den nächstgelegenen aus.
  • 7 maxZ=16 ermöglicht absolute Höhenunterschiede von bis zu 16 Einheiten.
  • 8 mobileOnly=1 schließt Elemente aus; 9 itemOnly=0 verbietet keine Mobs.
  • 10 includeIgnored=0 behält die Wirkung von IgnoreList.
  • 11 includeSelf=0 schließt deinen Charakter aus.
  • 12 aliveOnly=1 und 13 visibleOnly=1 lassen sichtbare Kandidaten am Leben.
  • 14 name="orc|troll" erfordert die Teilzeichenfolge orc oder troll in einem Namen, der dem Client bereits bekannt ist. Alle Filter müssen gleichzeitig ausgeführt werden.
var body = -1;
var hue = -1;
var scope = "ground";
var radius = 5;
var reputation = -1;
var nearest = 1;
var maxZ = 16;
var mobileOnly = 1;
var itemOnly = 0;
var includeIgnored = 0;
var includeSelf = 0;
var aliveOnly = 1;
var visibleOnly = 1;
var names = "orc|troll";
var found = UO.FindType(body, hue, scope, radius, reputation, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, names);
if (Truth(found == ""))
{
    UO.Print("No loaded mobile satisfies every filter");
}
else
{
    UO.Print("Selected serial: " + found);
}

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

5. Kurzform der Rucksacksuche – Skriptfunktion

Parameter und Ablauf:

  • 1 wantedType=0x0EED ist Gold.
  • 2 „my“ ist eine spezielle Zeichenfolge mit zwei Argumenten: Wählt einen Rucksack aus, enthält Rekursion und eine beliebige Farbe. Hier ist das zweite Argument nicht hue.
  • Für die oberste Ebene übergeben Sie statt „my“ „backpack“; für die Welt - „ground“. Die Zahl an zweiter Stelle hingegen ist ein Farbfilter.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var found = UO.FindType(wantedType, "my");
    if (Truth(found != ""))
    {
        UO.Print("Found in backpack or a loaded subcontainer: " + found);
    }
    else
    {
        UO.Print("Nothing found");
    }

    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.FindType(type) — UO.FindType(Any)

Parameter: type (Any)

Ergebnis: string / String.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public string FindType(InjectionValue type)

            => FindType(ResolveType(type));

UO.FindType(type, color) — UO.FindType(Any,Any)

Parameter: type (Any), color (Any)

Ergebnis: string / String.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public string FindType(InjectionValue type, InjectionValue color)

        {

            if (color.Kind == InjectionValueKind.String

                && (color.String.Equals("ground", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("backpack", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("my", StringComparison.OrdinalIgnoreCase)))

            {

                return FindType(ResolveType(type), -1, ConvertContainer(color), -1, color.String.Equals("my", StringComparison.OrdinalIgnoreCase));

            }



            return FindType(ResolveType(type), NumberConversions.ToInt(color), -1, -1, false);

        }

UO.FindType(type, color, container) — UO.FindType(Any,Any,Any)

Parameter: type (Any), color (Any), container (Any)

Ergebnis: string / String.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container)

            => FindType(type, color, container, new InjectionValue(-1));

UO.FindType(type, color, container, range) — UO.FindType(Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), range (Any)

Ergebnis: string / String.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container, InjectionValue range)

        {

            if (container.Kind == InjectionValueKind.String && container.String.Equals("my", StringComparison.OrdinalIgnoreCase))

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), true);

            else

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), false);

        }

UO.FindType(type, color, container, distance, recursive) — UO.FindType(Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), recursive (Any)

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.

values =>

                new InjectionValue(FindType(values[0], values[1], values[2], values[3], values[4]))

UO.FindType(type, color, container, distance, notoriety, nearest) — UO.FindType(Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any)

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.

values =>

                CompactFindType(values[0], values[1], values[2], values[3], values[4], values[5])

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ) — UO.FindType(Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, nameMask) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any), nameMask (Any)

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.

values => CompactFindTypeExtended(values)

UO.FindTypeEx

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

C#-Signaturen

int UO.FindTypeEx(object? objType, object? color, object? container, object? inSub);

Sucht nach einer Grafik und Farbe in einem Behälter oder auf dem Boden und gibt eine gefundene Grafik zurück ID.

Parameter

  • objType – Grafik/body, nicht serial Element. 0..65534 – spezifische Grafiken; -1 oder 0xFFFF – beliebig. Andere negative int in diesem Client entfernen ebenfalls den Filter.
  • color – Farbton, nicht die Anzahl der Elemente. 0 – unbemaltes Objekt; -1 oder 0xFFFF – jedes hue. Andere negative int entfernen Sie auch den Farbfilter.
  • container - Masse: UO.Ground(), 0, -1, 0xFFFFFFFF oder String ground. Rucksack: Zeichenfolge backpack oder serial. Dezimal/Hex serial und Name AddObject werden akzeptiert. my wählt das gesamte Inventar seines Charakters aus, einschließlich der Ausrüstung und der dazugehörigen Taschen. Ein unbekannter Name verursacht einen Skriptfehler. Überprüfen Sie das resultierende serial: Das explizite 0 wählt den Boden aus. Die Namen ground/backpack sind klarer als die numerischen Bezeichnungen, die sich je nach Befehlsfamilie unterscheiden.
  • inSub – Obligatorisch true/false (1/0). false – direkter Inhalt eines bestimmten Behälters; true – auch verschachtelte Säcke geladen. Für die Erde ändert die Rekursion nichts. my wählt bereits die gesamte Ausrüstung des Charakters aus.

Rückgabewert

int: serial erste Übereinstimmung in der lokalen Durchlaufreihenfolge; 0, wenn es keine Übereinstimmungen gibt. Nicht graphic, count, array oder bool. Überprüfen Sie das Ergebnis != 0, nicht das Ergebnis == true oder das Ergebnis == 1. Ein Stapel wird als ein Objekt betrachtet; Mobil – ein Objekt und eine Einheit. Die Reihenfolge bedeutet keine Nähe und kann zwischen den Suchvorgängen nicht garantiert werden.

Verhalten

  • Alle vier Positionsargumente werden benötigt. Es gibt keine optionalen Argumente.
  • Earth verwendet die FindDistance und FindVertical dieses Skripts, schließt self aus und schließt das entsprechende Item und Mobile ein. Bei der Suche innerhalb eines bestimmten Containers gelten diese Entfernungs-/Höhenbeschränkungen nicht. In beiden Fällen sind Ignore und zerstörte Objekte ausgeschlossen.
  • Vor dem Bypass werden FindItem, FindCount, FindFullQuantity und GetFoundItems gelöscht. Sie beziehen sich dann auf diese Suche; Eine leere Suche hinterlässt Nullen und ein leeres Array. FindFullQuantity fasst die maximale Anzahl (1, Menge) der Artikel und 1 für Mobilgeräte zusammen. FindQuantity liest die aktuelle Menge FindItem. Speichern Sie GetFoundItems, wenn nach einer erneuten Suche die vorherige Liste noch benötigt wird.
  • Die Brücke überquert geladene Gegenstände einmal und ist dann mobil, wenn Land ausgewählt ist. Art, Farbe und mindestens ein Behälter müssen übereinstimmen. Ein Objekt wird einmal gezählt, auch wenn es mehrere Bedingungen erfüllt. Es gibt keine wiederholte vollständige Durchquerung der Welt für jede Kombination.
  • Es werden nur die vom Client empfangenen Daten gelesen. Container werden nicht geöffnet, Kartenzellen werden nicht geladen, es findet keine Übertragung statt. Ein leeres Ergebnis beweist nicht, dass die Truhe auf dem Server leer ist. Wenn ein aktiver Link benötigt wird, aktivieren Sie Connected: Die Suche selbst liest den lokalen Status.
  • Die erste lokale Übereinstimmung wird hier gespeichert; Ein unbekannter Name schaltet die Suche nicht auf den Rucksack um. Ground akzeptiert auch 0; Ihr FindDistance Standard 18, maximal 255. Dies sind die Merkmale dieses Kunden.

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.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print("FindTypeEx: " + Convert.ToString(result));

1. Direkter Rucksackinhalt – direktes Drehbuch

Parameter und Ablauf:

  • 0x0EED – Gold, -1 – beliebig hue; backpack/false schließt verschachtelte Beutel aus. Die drei Zeilen geben das erste ID in Hex ohne 0x, die Anzahl der Objekte und die Summe der Einsen aus. Zwei Stapel von 20 und 50: Objekte 2, Einheiten 70.
var item = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print(Hex(item));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Vollzeit-Bodensuchfunktion – Skriptfunktion

Parameter und Ablauf:

  • Radius=5 und Höhe=10 arbeiten innerhalb von FindGoldNearSelf. Stellt schließlich beide Grenzwerte wieder her, auch bei Rückgabe oder Fehler. Die Funktion gibt serial Gold oder 0 zurück; Hauptprüfungen != 0 vor der Ausgabe.
return  RunScenario();
 object? RunScenario()
{
    var item = FindGoldNearSelf(5, 10);
    if (Truth(item != 0))
    {
        UO.Print(Hex(item));
    }
    else
    {
        UO.Print("Empty");
    }

    return null;
}

dynamic FindGoldNearSelf(dynamic radius, dynamic height)
{
    var oldDistance = UO.FindDistance();
    var oldVertical = UO.FindVertical();
    try
    {
        UO.FindDistance(radius);
        UO.FindVertical(height);
        return UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
    }
    finally
    {
        UO.FindDistance(oldDistance);
        UO.FindVertical(oldVertical);
    }
}

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. Containername und verschachtelte Beutel – Skriptklasse

Parameter und Ablauf:

  • GetSerial ermöglicht backpack; Die Prüfung auf Null verhindert eine zufällige Bodenauswahl. AddObject speichert ID als search_bag. true umfasst verschachtelte Beutel. GetFoundItems speichert ein separates Array; IsObjectExists prüft alle ID erneut.
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 bag = UO.GetSerial("backpack");
        if (Truth(bag != "0x00000000"))
        {
            UO.AddObject("search_bag", bag);
            UO.FindTypeEx(0x0EED, -1, "search_bag", true);
            var items = UO.GetFoundItems();
            foreach (var item in items)
            {
                if (Truth(UO.IsObjectExists(item)))
                {
                    UO.Print(Hex(item));
                }
            }
        }

        return null;
    }

    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.FindTypeEx(objType, color, container, inSub) — UO.FindTypeEx(Any,Any,Any,Any)

Parameter: objType (Any), color (Any), container (Any), inSub (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findtypeex": return new InjectionValue(bridge.FindType(ResolveType(arguments[0]), Arg(1), StealthContainer(2), -1, Arg(3) != 0));

UO.FindTypesArrayEx

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

C#-Signaturen

int UO.FindTypesArrayEx(object? objTypes, object? colors, object? containers, object? inSub);

In einem Durchlauf wird nach verschiedenen Grafiken, Farben und Containern gesucht und das gefundene ID zurückgegeben. Die vollständige Liste wird über GetFoundItems gelesen.

Parameter

  • objTypes – Grafik/body, nicht serial Element. 0..65534 – spezifische Grafiken; -1 oder 0xFFFF – beliebig. Andere negative int in diesem Client entfernen ebenfalls den Filter.
  • colors – Farbton, nicht die Anzahl der Elemente. 0 – unbemaltes Objekt; -1 oder 0xFFFF – jedes hue. Andere negative int entfernen Sie auch den Farbfilter.
  • containers - Masse: UO.Ground(), 0, -1, 0xFFFFFFFF oder String ground. Rucksack: Zeichenfolge backpack oder serial. Dezimal/Hex serial und Name AddObject werden akzeptiert. my wählt das gesamte Inventar seines Charakters aus, einschließlich der Ausrüstung und der dazugehörigen Taschen. Ein unbekannter Name verursacht einen Skriptfehler. Überprüfen Sie das resultierende serial: Das explizite 0 wählt den Boden aus. Die Namen ground/backpack sind klarer als die numerischen Bezeichnungen, die sich je nach Befehlsfamilie unterscheiden.
  • inSub – Obligatorisch true/false (1/0). false – direkter Inhalt eines bestimmten Behälters; true – auch verschachtelte Säcke geladen. Für die Erde ändert die Rekursion nichts. my wählt bereits die gesamte Ausrüstung des Charakters aus.

Rückgabewert

int: serial erste Übereinstimmung in der lokalen Durchlaufreihenfolge; 0, wenn es keine Übereinstimmungen gibt. Nicht graphic, count, array oder bool. Überprüfen Sie das Ergebnis != 0, nicht das Ergebnis == true oder das Ergebnis == 1. Ein Stapel wird als ein Objekt betrachtet; Mobil – ein Objekt und eine Einheit. Die Reihenfolge bedeutet keine Nähe und kann zwischen den Suchvorgängen nicht garantiert werden.

Verhalten

  • Array wird übergeben; Ein einzelner Wert wird auch als Array aus einem Element behandelt. Durch die Deklaration der Variablenwerte[1] werden die Indizes 0 und 1 erstellt: jeweils ausgefüllt. Typen und Farben sind unabhängige Optionen, keine Paare nach Index. Eine „beliebige“ Maske an einer beliebigen Position oder ein leeres Array von Typen/Farben entfernt diesen Filter. Eine leere Reihe von Behältern wählt das Inventar des Charakters aus. Wiederholungen und Überschneidungen von Containern duplizieren ID nicht.
  • Alle vier Positionsargumente werden benötigt. Es gibt keine optionalen Argumente.
  • Earth verwendet die FindDistance und FindVertical dieses Skripts, schließt self aus und schließt das entsprechende Item und Mobile ein. Bei der Suche innerhalb eines bestimmten Containers gelten diese Entfernungs-/Höhenbeschränkungen nicht. In beiden Fällen sind Ignore und zerstörte Objekte ausgeschlossen.
  • Vor dem Bypass werden FindItem, FindCount, FindFullQuantity und GetFoundItems gelöscht. Sie beziehen sich dann auf diese Suche; Eine leere Suche hinterlässt Nullen und ein leeres Array. FindFullQuantity fasst die maximale Anzahl (1, Menge) der Artikel und 1 für Mobilgeräte zusammen. FindQuantity liest die aktuelle Menge FindItem. Speichern Sie GetFoundItems, wenn nach einer erneuten Suche die vorherige Liste noch benötigt wird.
  • Die Brücke überquert geladene Gegenstände einmal und ist dann mobil, wenn Land ausgewählt ist. Art, Farbe und mindestens ein Behälter müssen übereinstimmen. Ein Objekt wird einmal gezählt, auch wenn es mehrere Bedingungen erfüllt. Es gibt keine wiederholte vollständige Durchquerung der Welt für jede Kombination.
  • Es werden nur die vom Client empfangenen Daten gelesen. Container werden nicht geöffnet, Kartenzellen werden nicht geladen, es findet keine Übertragung statt. Ein leeres Ergebnis beweist nicht, dass die Truhe auf dem Server leer ist. Wenn ein aktiver Link benötigt wird, aktivieren Sie Connected: Die Suche selbst liest den lokalen Status.
  • Die erste lokale Übereinstimmung wird hier gespeichert; Ein unbekannter Name schaltet die Suche nicht auf den Rucksack um. Ground akzeptiert auch 0; Ihr FindDistance Standard 18, maximal 255. Dies sind die Merkmale dieses Kunden.

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.FindTypesArrayEx(new[] { 0x0EED }, new[] { -1 }, new[] { "backpack" }, false);
UO.Print("FindTypesArrayEx: " + Convert.ToString(result));

1. Zwei Graphen am Boden – direktes Drehbuch

Parameter und Ablauf:

  • Typen enthalten Gold 0x0EED und schwarze Perle 0x0F7A; eine Farbe=-1 – beliebig hue, eine Ground – Erde. false ändert nichts auf der Erde. Es gelten die aktuellen Suchbeschränkungen. ID, die Anzahl der Objekte und die Summe der Einheiten werden ausgegeben.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0EED;
types[1] = 0x0F7A;
dynamic[] colors = new dynamic[checked((int)(0) + 1)];
colors[0] = -1;
dynamic[] containers = new dynamic[checked((int)(0) + 1)];
containers[0] = UO.Ground();
var first = UO.FindTypesArrayEx(types, colors, containers, false);
UO.Print(Hex(first));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Gold im Rucksack und am Boden – Skriptfunktion

Parameter und Ablauf:

  • Typen - nur Gold; Farben - beliebig hue. Container – backpack und Land; true umfasst verschachtelte Beutel. Es werden Objekte/Stapel und Einheiten aus beiden Bereichen ausgegeben, wobei jedes Objekt einmal gezählt wird.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(0) + 1)];
    types[0] = 0x0EED;
    dynamic[] colors = new dynamic[checked((int)(0) + 1)];
    colors[0] = -1;
    dynamic[] containers = new dynamic[checked((int)(1) + 1)];
    containers[0] = "backpack";
    containers[1] = UO.Ground();
    UO.FindTypesArrayEx(types, colors, containers, true);
    UO.Print(Convert.ToString(UO.FindCount()));
    UO.Print(Convert.ToString(UO.FindFullQuantity()));
    return null;
}

3. Vollständige Funktion mit Ergebnisliste – Skriptklasse

Parameter und Ablauf:

  • SearchTypesIn(Container,firstType,secondType) gibt ein Array zurück, während der integrierte Befehl ein einzelnes int ID zurückgibt. Die vollständige Funktion oben füllt die Arrays, sucht rekursiv und kopiert sofort GetFoundItems. Main prüft jedes gespeicherte ID und gibt es aus.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = SearchTypesIn("backpack", 0x0EED, 0x0F7A);
        foreach (var item in items)
        {
            if (Truth(UO.IsObjectExists(item)))
            {
                UO.Print(Hex(item));
            }
        }

        return null;
    }

    dynamic SearchTypesIn(dynamic container, dynamic firstType, dynamic secondType)
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = firstType;
        types[1] = secondType;
        dynamic[] colors = new dynamic[checked((int)(0) + 1)];
        colors[0] = -1;
        dynamic[] containers = new dynamic[checked((int)(0) + 1)];
        containers[0] = container;
        UO.FindTypesArrayEx(types, colors, containers, true);
        return UO.GetFoundItems();
    }

    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.FindTypesArrayEx(objTypes, colors, containers, inSub) — UO.FindTypesArrayEx(Any,Any,Any,Any)

Parameter: objTypes (Any), colors (Any), containers (Any), inSub (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findtypesarrayex":

                    InjectionValue[] searchContainers = arguments[2].Kind == InjectionValueKind.Array

                        ? arguments[2].Array : new[] { arguments[2] };

                    return new InjectionValue(bridge.FindTypes(arguments[0].Kind == InjectionValueKind.Array

                        ? arguments[0].Array.Select(ResolveType).ToArray() : new[] { ResolveType(arguments[0]) }, ArrayArg(1),

                        searchContainers.Select(ConvertClientSearchContainer).ToArray(), Arg(3) != 0));

UO.FindVertical

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

C#-Signaturen

int UO.FindVertical();
void UO.FindVertical(object? value);

Liest oder ändert den zulässigen Höhenunterschied in der Standardsuche.

Parameter

  • value – Optional int. Ohne Argument - Lesen; Wert – Einstellung. Der Wert ist auf den Bereich 0..120 begrenzt; das Negative wird zu 0 und nicht zu „No-Limit“. In der neuen Laufzeit: 2; Der wiederhergestellte Zustand kann einen anderen Wert enthalten. Die Bruchzahl wird auf Null gekürzt; Numerische Zeichenfolgen double/0x sind ebenfalls akzeptabel. Verwenden Sie int, um eine implizite Konvertierung zu vermeiden.

Rückgabewert

Ohne Argumente: int - aktuelle Grenze (Differenz in Welteinheiten Z), nicht gefunden ID, Anzahl der Objekte oder bool. 0 bedeutet Nullgrenze, nicht Ausfall. Mit Wert: void – kein Wert; Dies ist nicht true/false oder die alte Einstellung. Lesen Sie nach der Installation FindVertical(), um den gespeicherten Wert herauszufinden.

Verhalten

  • Höhe: abs(object.Z – player.Z), in beide Richtungen, einschließlich Rand. Für 0 ist nur das gleiche Z geeignet. Dabei handelt es sich nicht um die Stockwerksnummer oder die Anzahl der horizontalen Zellen.
  • Die Einstellung wird in der Laufzeit des aktuellen Skripts gespeichert; Seine Prozeduren verwenden einen einzelnen Wert. Unabhängige Laufzeiten haben separate Einstellungen. Lesen und Schreiben lösen keine Suche aus, löschen FindItem/FindCount/GetFoundItems, senden kein Paket, verschieben kein Zeichen und laden keine entfernten Objekte.
  • FindTypeEx und FindTypesArrayEx verwenden diese Grenzen bei der Suche am Boden, jedoch nicht im Container. Die restlichen Filter sind type, hue, Ignore und das Vorhandensein eines geladenen Objekts. FindAtCoord ignoriert beide Grenzwerte. In erweiterten Befehlen kann expliziter Abstand/maxZ Einstellungen überschreiben; -1 bedeutet in solchen Parametern, die Einstellung zu übernehmen, im Gegensatz dazu, die Einstellung selbst auf -1 zu setzen. FindList filtert auch Z bei der Suche nach Containern; Die angegebene Containerausnahme gilt nicht für ihn.
  • Speichern Sie den Wert vor der vorübergehenden Suche und stellen Sie ihn auf „Endgültig“ wieder her. Die Installation wird nicht automatisch abgebrochen. Funktioniert schließlich bei normaler Fertigstellung und einem abgefangenen Skriptfehler; Der Not-Aus-Schalter kann nicht als Reinigungsmechanismus verwendet werden.

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

1. Lesen, Festlegen und Bereichsbegrenzung – Direktes Skript

Parameter und Ablauf:

  • previous speichert die aktuelle Einstellung. value:=10 legt den normalen Grenzwert fest; 1000 zeigt die Grenze zu 120. Print liest das Ergebnis als separaten Aufruf ohne Argument. Stellt endlich das vorherige wieder her.
var previous = UO.FindVertical();
try
{
    UO.FindVertical(10);
    UO.Print(Convert.ToString(UO.FindVertical()));
    UO.FindVertical(1000);
    UO.Print(Convert.ToString(UO.FindVertical()));
}
finally
{
    UO.FindVertical(previous);
}

2. Temporäre Bodensuche – Skriptfunktion

Parameter und Ablauf:

  • previous speichert die Einstellung des aufrufenden Codes. 10 ändert nur FindVertical; die zweite Grenze bleibt gleich. 0x0EED – goldene Grafiken, -1 – jedes hue, Container=-1 – Welt, false – ohne Containerrekursion. id - eins serial; != 0 prüft die Verfügbarkeit. FindCount zählt ganze Objekte/Stapel. Stellt schließlich die Einstellung wieder her, nicht die Ergebnisliste.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindVertical();
    try
    {
        UO.FindVertical(10);
        var id = UO.FindTypeEx(0x0EED, -1, -1, false);
        if (Truth(id != 0))
        {
            UO.Print(Hex(id) + ":" + Convert.ToString(UO.FindCount()));
        }
        else
        {
            UO.Print("0");
        }
    }
    finally
    {
        UO.FindVertical(previous);
    }

    return null;
}

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. Vollständige Funktion CountGroundInRange – Skriptklasse

Parameter und Ablauf:

  • CountGroundInRange(graphic, Radius, Höhe) speichert beide Grenzen, setzt Radius=5 und Höhe=10, sucht nach graphic=0x0EED und gibt FindCount() zurück. Ein Stapel wird als ein Objekt betrachtet. Die vollständige Funktion ist nach Main angegeben. Stellt endlich beide Limits wieder her, auch wenn das Verlassen per Return erfolgt; Das Suchergebnis bleibt verfügbar.
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 count = CountGroundInRange(0x0EED, 5, 10);
        UO.Print(Convert.ToString(count));
        return null;
    }

    dynamic CountGroundInRange(dynamic graphic, dynamic radius, dynamic height)
    {
        var oldDistance = UO.FindDistance();
        var oldVertical = UO.FindVertical();
        try
        {
            UO.FindDistance(radius);
            UO.FindVertical(height);
            UO.FindTypeEx(graphic, -1, -1, false);
            return UO.FindCount();
        }
        finally
        {
            UO.FindDistance(oldDistance);
            UO.FindVertical(oldVertical);
        }
    }
}

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

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.FindVertical(value) — UO.FindVertical(Any)

Parameter: value (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.GetFindedList

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

C#-Signaturen

dynamic UO.GetFindedList(object? userList);

Erstellt eine Kopie der Liste ID der letzten normalen Suche.

Parameter

  • userList – Erforderliches Kompatibilitätsargument. In der aktuellen Implementierung wird sie nicht aufgefüllt oder geändert: Die Liste wird als Ergebnis des Befehls zurückgegeben. Sie können 0 bestehen. Für ein Formular ohne Argumente verwenden Sie GetFoundItems.

Rückgabewert

Array ist ein separates Array serial/ID in der letzten Suchreihenfolge. Ein leeres Array, wenn es keine Übereinstimmungen gab. Enthält nicht graphic, hue oder Betrag. Durch das Ändern des zurückgegebenen Arrays wird die gespeicherte Suchliste nicht bearbeitet.

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.
  • Die Daten gehören zur letzten normalen Suche dieses Skripts. FindType mit 1–5-Argumenten, FindTypeEx, Count/CountEx/CountGround ersetzen die Ergebnisse. Zum Ändern dieses Snapshots sind keine erweiterten gefilterten Zeichenbefehle erforderlich.
  • Eine neue Suche ohne Übereinstimmungen löscht FindItem, FindCount und FindFullQuantity sowie GetFoundItems. Das alleinige Lesen eines Ergebnisses löst keine neue Suche aus.

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.

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFindedList(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Listengröße abrufen – direktes Skript

Parameter und Ablauf:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. UserList=0 ist kein Ausgabeparameter.
  • Länge – Anzahl der Datensätze/ID. Dies ist nicht die Anzahl der Stapel. Die leere Liste ergibt 0.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFindedList(0);
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:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. UserList=0 ist kein Ausgabeparameter.
  • 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 found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFindedList(0);
    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:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. UserList=0 ist kein Ausgabeparameter.
  • 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 found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFindedList(0);
        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.GetFindedList(userList) — UO.GetFindedList(Any)

Parameter: userList (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getfindedlist":

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

UO.GetFoundItems

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

C#-Signaturen

dynamic UO.GetFoundItems();

Erstellt eine Kopie der Liste ID der letzten normalen Suche.

Parameter

Es gibt keine Parameter.

Rückgabewert

Array ist ein separates Array serial/ID in der letzten Suchreihenfolge. Ein leeres Array, wenn es keine Übereinstimmungen gab. Enthält nicht graphic, hue oder Betrag. Durch das Ändern des zurückgegebenen Arrays wird die gespeicherte Suchliste nicht bearbeitet.

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.
  • Die Daten gehören zur letzten normalen Suche dieses Skripts. FindType mit 1–5-Argumenten, FindTypeEx, Count/CountEx/CountGround ersetzen die Ergebnisse. Zum Ändern dieses Snapshots sind keine erweiterten gefilterten Zeichenbefehle erforderlich.
  • Eine neue Suche ohne Übereinstimmungen löscht FindItem, FindCount und FindFullQuantity sowie GetFoundItems. Das alleinige Lesen eines Ergebnisses löst keine neue Suche aus.

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.

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFoundItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Listengröße abrufen – direktes Skript

Parameter und Ablauf:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. Es gibt keine Parameter.
  • Länge – Anzahl der Datensätze/ID. Dies ist nicht die Anzahl der Stapel. Die leere Liste ergibt 0.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFoundItems();
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:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. Es gibt keine Parameter.
  • 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 found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFoundItems();
    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:

  • Der übliche FindType für Gold im Rucksack ist vorgefertigt. Es gibt keine Parameter.
  • 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 found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFoundItems();
        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.GetFoundItems() — UO.GetFoundItems()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getfounditems":

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

UO.GetIgnoreList

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

C#-Signaturen

dynamic UO.GetIgnoreList();

Zeigt bestimmte ID an, die dem serial-Filter bis Ignore hinzugefügt wurden. Hilft zu überprüfen, welche Artikel bereits bearbeitet wurden und von der erneuten Suche ausgeschlossen werden. Die benannten Regeln type/hue von AddIgnoreList sind in diesem Array nicht enthalten.

Parameter

Es gibt keine Parameter.

Rückgabewert

Array - serial aus der Ignore-Liste in aufsteigender Reihenfolge der numerischen ID. Leeres Array, wenn die Liste leer ist. ID existiert möglicherweise nicht mehr auf der Welt; Dabei handelt es sich um Suchregeln, nicht um eine Liste sichtbarer Elemente.

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.
  • Im Client gehört der Satz zum allgemeinen Zustand der Profilskripte. Das Array ist eine Kopie: IgnoreOff(serial) löscht eine Ausnahme, IgnoreReset löscht alle serial. Sie deaktivieren die ausgewählten Regeln type/hue nicht; sie erfordern SelectIgnoreList, DeleteIgnoreList oder ClearIgnoreList. GetContent/GetEquipment und GetWorldItems ohne Argumente wenden diesen Filter selbst nicht an.

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.GetIgnoreList();
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; Es wird eine Momentaufnahme offensichtlicher serial-Ausnahmen gelesen. Ein leeres Array bedeutet nicht, dass die benannten Regeln type/hue fehlen.
  • Länge – Anzahl der Datensätze/ID. Dies ist nicht die Anzahl der Stapel. Die leere Liste ergibt 0.
var items = UO.GetIgnoreList();
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; Es wird eine Momentaufnahme offensichtlicher serial-Ausnahmen gelesen. Ein leeres Array bedeutet nicht, dass die benannten Regeln type/hue fehlen.
  • 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.GetIgnoreList();
    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; Es wird eine Momentaufnahme offensichtlicher serial-Ausnahmen gelesen. Ein leeres Array bedeutet nicht, dass die benannten Regeln type/hue fehlen.
  • 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.GetIgnoreList();
        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.GetIgnoreList() — UO.GetIgnoreList()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getignorelist":

                    return new InjectionValue(bridge.GetIgnoreList().Select(value => new InjectionValue(value)).ToArray());

UO.GetWorldItems

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

C#-Signaturen

dynamic UO.GetWorldItems();
dynamic UO.GetWorldItems(object? @type);
dynamic UO.GetWorldItems(object? @type, object? color);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest, object? maxZ);

Gibt ein Array ID von Weltelementen oder dem ausgewählten Container zurück.

Parameter

  • type – Erstes Argument der gefilterten Form: graphic/type, -1 oder 0xFFFF – beliebig. Das ist nicht serial. Ohne alle Argumente wird ein separates Formular ohne Filterung verwendet.
  • color – Farbton; Standard: 1, jede Farbe. 0xFFFF akzeptiert auch jedes hue.
  • distance – Radius in Zellen entlang X/Y. Negativer Wert oder Abwesenheit verwenden FindDistance; 0 bedeutet dieselbe Zelle. Bei einem Container wird der Abstand zum Container überprüft, nicht sein internes X/Y.
  • container – Standardmäßig auf Masse. ground, numerische 0/1 und ihre Zeichenfolgen sind gemahlen. backpack, my und numerisch -1 sind die direkten Inhalte des Rucksacks. Seriennummer/Hex-String/Alias ​​des Containers – sein direkter Inhalt; self wählt Elemente aus, deren übergeordnetes Element ein Charakter ist. Ein unbekannter Name und ein fehlender Rucksack ergeben ein leeres Array, kein Land.
  • nearest – Standard false. true sortiert nach Entfernung, dann nach numerischem serial. Für einen Container ist der Abstand für alle Ergebnisse gleich.
  • maxZ – Zulässiger Höhenunterschied relativ zu self. Negativer Wert oder Abwesenheit verwenden FindVertical; 0 erfordert die gleiche Höhe. Bei einem Container wird die Höhe des Containers selbst gemessen.

Rückgabewert

Array – serial/ID Elemente, nicht type, Koordinaten oder Menge. Ein leeres Array ohne Übereinstimmungen. GetWorldItems() gibt alle geladenen Artikel außerhalb von Containern ohne Ignore/range/height zurück; GetWorldItems(type,...) verwendet die aufgeführten Filter und Ignore. NPC/Spieler sind in keiner Form enthalten.

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.
  • Das Foto FindItem/FindCount/GetFoundItems ändert sich nicht. Das Team öffnet den Container nicht und geht nicht durch die beiliegenden Beutel.
  • Um Einschränkungen zu deaktivieren, reicht -1 nicht aus: Dies ist die Auswahl der aktuellen Einstellung, nicht des unendlichen Radius. Geben Sie den gewünschten nicht negativen Abstand/maxZ an oder verwenden Sie das Formular ohne Argumente für alle geladenen Landelemente.

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

1. Alle geladenen Landgegenstände zählen – direktes Skript

Parameter und Ablauf:

  • Keine Parameter: Sonderform ohne Filter.
  • Das Ergebnis betrifft nicht alle Karten- oder Serverelemente. Ignore gilt hier nicht.
var items = UO.GetWorldItems();
UO.Print(Convert.ToString(ArrayLength(items)));

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

2. Finden Sie den nächstgelegenen Stapel des gewünschten Typs und der gewünschten Farbe – Skriptfunktion

Parameter und Ablauf:

  • type=0x0EED — Gold, Farbe=-1 — beliebig; Abstand=5, Container=ground, Nächster=true, maxZ=3.
  • Der erste Eintrag ist das am besten passende, nicht ignorierbare Element. Der Abstand überprüft weder Wände noch die Zugänglichkeit.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetWorldItems(0x0EED, -1, 5, "ground", true, 3);
    if (Truth(ArrayLength(items) > 0))
    {
        var item = items[0];
        if (Truth(UO.Exists(item)))
        {
            UO.Print("Nearest ID: 0x" + Hex(item));
        }
    }

    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. Zählen Sie den direkten Inhalt des Rucksacks – Skriptklasse

Parameter und Ablauf:

  • Beliebige type/Farbe; my wählt einen Rucksack aus. Der Abstand 20 und die Differenz Z 255 beziehen sich auf den Behälter. false behält die ursprüngliche Reihenfolge bei.
  • Gezählt werden gerade Artikel, nicht gestapelte Einheiten und nicht der Inhalt ineinander verschachtelter Beutel. Ohne Rucksack wird ein leeres Array zurückgegeben.
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.GetWorldItems(-1, -1, 20, "my", false, 255);
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

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

Implementierung des Befehls

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

UO.GetWorldItems() — UO.GetWorldItems()

Parameter: Keine Parameter.

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getworlditems":

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

UO.GetWorldItems(type) — UO.GetWorldItems(Any)

Parameter: type (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color) — UO.GetWorldItems(Any,Any)

Parameter: type (Any), color (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance) — UO.GetWorldItems(Any,Any,Any)

Parameter: type (Any), color (Any), distance (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container) — UO.GetWorldItems(Any,Any,Any,Any)

Parameter: type (Any), color (Any), distance (Any), container (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest) — UO.GetWorldItems(Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), distance (Any), container (Any), nearest (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest, maxZ) — UO.GetWorldItems(Any,Any,Any,Any,Any,Any)

Parameter: type (Any), color (Any), distance (Any), container (Any), nearest (Any), maxZ (Any)

Ergebnis: dynamic / Any.

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.

values => CompactGetWorldItems(values)

UO.Ignore

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

C#-Signaturen

void UO.Ignore(object? objID);
void UO.Ignore(object? id, object? stateValue);

Fügt serial zur normalen Such-Ignorierungsliste hinzu oder entfernt sie daraus.

Parameter

  • id – 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.
  • 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.
  • stateValue – Optionaler Modus. Die Zahl 0 schaltet aus, eine Zahl ungleich Null schaltet ein. Die Zeilen „off“, „false“ (Groß- und Kleinschreibung wird nicht beachtet) und genau „0“ sind ausgeschaltet; Jede andere Zeile enthält. Ohne Modusargument - hinzufügen.

Rückgabewert

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

Verhalten

  • Ignore(id) ruft Bridge.Ignore(serial) auf, wodurch serial zu State.IgnoredSerials hinzugefügt wird. Ignore(id,stateValue) wählt Ignore oder Unignore aus. Jede nicht leere Zeichenfolge kann nicht als wahr betrachtet werden: Die aufgelisteten Escape-Wörter werden separat verarbeitet.
  • Dies ist ein Suchfilter, der kein Objekt ausblendet oder löscht. Benannte Filter vom Typ AddIgnoreList werden separat gespeichert.
  • 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.Ignore");
UO.Ignore("lasttarget");

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Fügt serial zur normalen Such-Ignorierungsliste hinzu oder entfernt sie daraus.
UO.Ignore("lasttarget");

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • Ignore(id) ruft Bridge.Ignore(serial) auf, wodurch serial zu State.IgnoredSerials hinzugefügt wird. Ignore(id,stateValue) wählt Ignore oder Unignore aus. Jede nicht leere Zeichenfolge kann nicht als wahr betrachtet werden: Die aufgelisteten Escape-Wörter werden separat verarbeitet.
return  RunScenario();
 object? RunScenario()
{
    UO.Ignore("lasttarget", "off");
    return null;
}

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Dies ist ein Suchfilter, der kein Objekt ausblendet oder löscht. Benannte Filter vom Typ AddIgnoreList werden separat gespeichert.
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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Ignore(id, 1);
            UO.Print(UO.GetIgnoreList());
            UO.Ignore(id, 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;
}

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

Parameter: objID (Any/Integer/String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "ignore": bridge.Ignore(Arg(0)); return InjectionValue.Unit;

UO.Ignore(objID) — UO.Ignore(Integer)

Parameter: objID (Any/Integer/String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void Ignore(int id) => bridge.Ignore(id);

UO.Ignore(objID) — UO.Ignore(String)

Parameter: objID (Any/Integer/String)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void Ignore(string id) => Ignore(GetObject(id));

UO.Ignore(id, stateValue) — UO.Ignore(Any,Any)

Parameter: id (Any), stateValue (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void Ignore(InjectionValue id, InjectionValue stateValue)

        {

            int serial = GetObject(id);

            bool enabled = stateValue.Kind != InjectionValueKind.String

                ? NumberConversions.ToInt(stateValue) != 0

                : !stateValue.String.Equals("off", StringComparison.OrdinalIgnoreCase)

                    && !stateValue.String.Equals("false", StringComparison.OrdinalIgnoreCase)

                    && stateValue.String != "0";



            if (enabled)

                bridge.Ignore(serial);

            else

                bridge.Unignore(serial);

        }

UO.IgnoreOff

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

C#-Signaturen

void UO.IgnoreOff(object? objID);

Entfernt einen serial aus der normalen Ignorierliste.

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

  • Bridge.Unignore entfernt ID aus State.IgnoredSerials. Andere serial- und benannte AddIgnoreList-Filter werden nicht gelöscht; Gegenstände werden nicht aus der Welt entfernt.
  • Lokale Änderung des Suchfilters; Pakete werden nicht gesendet.
  • 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.IgnoreOff");
UO.IgnoreOff(UO.GetSerial("lasttarget"));

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Entfernt einen serial aus der normalen Ignorierliste.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.IgnoreOff(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:

  • Bridge.Unignore entfernt ID aus State.IgnoredSerials. Andere serial- und benannte AddIgnoreList-Filter werden nicht gelöscht; Gegenstände werden nicht aus der Welt entfernt.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.IgnoreOff(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:

  • Lokale Änderung des Suchfilters; Pakete werden nicht gesendet.
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.IgnoreOff(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.IgnoreOff(objID) — UO.IgnoreOff(Any)

Parameter: objID (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "ignoreoff": bridge.Unignore(Arg(0)); return InjectionValue.Unit;

UO.IgnoreReset

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

C#-Signaturen

void UO.IgnoreReset();

Löscht die normale Liste der ignorierten serial.

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

  • Bridge.IgnoreReset ruft State.IgnoredSerials.Clear auf. Entfernt alle serial aus diesem Filter, einschließlich derjenigen, die durch eine andere Suche in der gesamten Bridge-Sitzung hinzugefügt wurden.
  • Löscht nicht den Namen AddIgnoreList, löscht keine Objekte und setzt die Ergebnisse von FindType nicht zurück.
  • 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.IgnoreReset");
UO.IgnoreReset();

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Löscht die normale Liste der ignorierten serial.
UO.IgnoreReset();

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • Bridge.IgnoreReset ruft State.IgnoredSerials.Clear auf. Entfernt alle serial aus diesem Filter, einschließlich derjenigen, die durch eine andere Suche in der gesamten Bridge-Sitzung hinzugefügt wurden.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetIgnoreList());
    UO.IgnoreReset();
    return null;
}

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Löscht nicht den Namen AddIgnoreList, löscht keine Objekte und setzt die Ergebnisse von FindType nicht 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()
    {
        UO.Ignore("lasttarget");
        UO.IgnoreReset();
        UO.Print(UO.GetIgnoreList());
        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.IgnoreReset() — UO.IgnoreReset()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

public void IgnoreReset() => bridge.IgnoreReset();

UO.InfoFindList

C#-Signaturen

string UO.InfoFindList();

Verhalten und Ergebnis

Der Aufruf bestimmt die Anzeige: Befehle im grafischen Chat öffnen eine Tabelle mit Feldern, Werten, Ctrl+C und Scrollen. Normale C#-Skripte erhalten Berichtstext ohne Fenster oder Zielcursor, auch bei offenem Spielfenster. Verfügbar sind nur dem Client bekannte Daten.

Info und InfoTile ohne Argumente starten im grafischen Chat eine Zielauswahl. Im Skript liest Info() das letzte Objektziel oder den Spieler; InfoTile() den Boden unter dem Spieler. serial, type und Koordinaten wählen gezielt aus. Das dritte Argument von InfoTile(x,y,map) ist die Karte.

Parameter

Keine Parameter.

Das Präfix wird in C# Scripts IDE festgelegt; # ist hier ein Beispiel. Parameter werden durch Leerzeichen getrennt, Text durch Anführungszeichen zusammengefasst. id bedeutet serial, type bedeutet graphic. xy x y [z] wählt das erste geladene Objekt am Ort; type allein den ersten passenden Treffer. Bei InfoTile(x,y,map) ist das dritte Argument die Karte, nicht Z.

Chatbefehle

#infofindlist

Vollständige C#-Beispiele

Jeder Block ist eine vollständige .csx-Datei. Ersetzen Sie Beispiel-serials, Typen und Koordinaten. Parameterreihenfolge und benannte C#-Argumente folgen der Signatur.

1

UO.Print(UO.InfoFindList());

2

string ReadDefinitions() => UO.InfoFindList();
UO.Print(ReadDefinitions());

3

string report = UO.InfoFindList();
foreach (string line in report.Split('\n'))
    UO.Print(line);

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoFindList());
    }
}

Interne Aufrufe

CSharpGameApi.InfoFindList
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoFindList
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.MFGI

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

C#-Signaturen

void UO.MFGI();

Druckt die aktuelle Liste der Suchergebnisse.

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

  • ExecuteLegacyManualAlias liest GetFoundItems, formatiert jedes serial als 0xXXXXXXXX und verkettet die Zeilen mit einem „|“ Trennzeichen. Es wird keine neue Suche durchgeführt; Eine leere Liste ergibt eine leere Zeichenfolge.
  • Ändert oder zeigt nur die angegebenen lokalen Daten an. Für diesen Befehl gibt es keine Serverbestä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.MFGI");
UO.MFGI();

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Druckt die aktuelle Liste der Suchergebnisse.
UO.MFGI();

2. Explizite Option – Skriptfunktion

Parameter und Ablauf:

  • ExecuteLegacyManualAlias liest GetFoundItems, formatiert jedes serial als 0xXXXXXXXX und verkettet die Zeilen mit einem „|“ Trennzeichen. Es wird keine neue Suche durchgeführt; Eine leere Liste ergibt eine leere Zeichenfolge.
return  RunScenario();
 object? RunScenario()
{
    UO.FindType("0x0E21");
    UO.MFGI();
    return null;
}

3. Vollständige Hilfsfunktion – Skriptklasse

Parameter und Ablauf:

  • Ändert oder zeigt nur die angegebenen lokalen Daten an. Für diesen Befehl gibt es keine Serverbestä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()
    {
        UO.MFGI();
        UO.Print(UO.GetArrayLength(UO.GetFoundItems()));
        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.MFGI() — UO.MFGI()

Parameter: Keine Parameter.

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "mfgi":

                    SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}")));

                    break;

UO.SelectIgnoreList

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

C#-Signaturen

void UO.SelectIgnoreList(object? list);

Schaltet den aktiven benannten Suchfilter um. Es ist sinnvoll, die Ausnahmen zwischen Mining, Sortierung und Targeting zu ändern, ohne die gespeicherten Regeln zu löschen. Dieser Befehl führt nicht die Suche selbst durch.

Parameter

  • list – Beliebiger, nicht leerer Name, zum Beispiel „loot_skip“. Beim Namen wird die Groß-/Kleinschreibung nicht beachtet. Dies ist nicht der Name des Elements, nicht des serial-Containers und nicht der Name von FindList. Auch die leere Zeichenfolge „“ ist hier akzeptabel: benannte Regeln deaktivieren.

Rückgabewert

void – kein Wert. Verwendung in einer separaten Zeile ohne var Ergebnis = und ohne Ankreuzen von =true. Der Befehl ändert den lokalen Filter; gibt die Anzahl der Elemente nicht zurück und sendet nichts an den Server.

Verhalten

  • Ein nicht vorhandener Name wählt einen leeren Filter aus. Der späte AddIgnoreList mit diesem Namen wird bei den nächsten Suchvorgängen aktiv. Normal Ignore(serial) funktioniert unabhängig von der Auswahl weiterhin.
  • Die benannte Liste enthält die Regeln graphic/type + hue, und die reguläre Ignore enthält die spezifischen serial. Dabei handelt es sich um verschiedene Filter: Sie werden kombiniert, wenn die Suche sie unterstützt. Objekte bleiben sichtbar und für direkte UseObject/MoveItem zugänglich; Dies ist kein Hide oder Handlungsverbot.
  • Beim Listennamen wird die Groß-/Kleinschreibung nicht beachtet. Randräume werden entfernt. Eine benannte Liste ist aktiv, zunächst standardmäßig. AddIgnoreList wählt es nicht automatisch aus. SelectIgnoreList("") deaktiviert nur den benannten Filter.
  • Die Regeln gelten für neue Suchanfragen, einschließlich der hochgeladenen Elemente, NACHDEM sie hinzugefügt wurden. Das bereits empfangene Array und das vorherige Ergebnis FindCount werden erst bei einer erneuten Suche neu berechnet. Wählen Sie keine Liste mit der Regel -1,-1 aus, es sei denn, Sie möchten alles ausschließen.
  • Der Filter berücksichtigt FindType/FindTypeEx/FindTypesArrayEx, FindList, FindAtCoord, FindNotoriety, Count/CountEx und erweiterte Auswahlen GetMobiles, GetWorldItems, UseType, WaitTarget, Attack/AttackNearest/FindMan. includeIgnored=true, sofern vorhanden, umgeht sowohl serial als auch type/hue. Die vollständige Aufzählung GetContent/GetEquipment, GetWorldItems() ohne Argumente und die verbale Aufzählung FindMobile(human,near,...) verwenden diese Regeln nicht.
  • GetIgnoreList gibt nur explizit hinzugefügtes serial zurück; Die Zeilen der benannten Liste sind in diesem Array nicht enthalten. IgnoreReset löscht den gesamten serial-Filter, IgnoreOff(serial) entfernt eine serial-Ausnahme; Die genannten Regeln bleiben erhalten. ClearIgnoreList() ohne Argumente löscht beide Ansichten.
  • Der Status gehört zum allgemeinen Status der Client-Profilskripte. Die Änderung wirkt sich auf andere Skripte mit diesem Status aus. Die Einstellungen sind im gespeicherten Snapshot enthalten. Nach der Änderung der Regeln kann ein anderes Skript bereits eine Suche mit dem zuvor erstellten Snapshot durchführen – bei der nächsten Suche wird das Update angezeigt.
  • 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.SelectIgnoreList");
UO.SelectIgnoreList("SORT");

1. Sortiermodus wechseln – Direktskript

Parameter und Ablauf:

  • SORT und sort sind eine Liste. Die Suche wählt das erste zulässige Rucksackobjekt aus; Durch das Speichern des Namens wird dieser nicht übertragen.
UO.AddIgnoreList("sort", 0x0EED);
UO.SelectIgnoreList("SORT");
var item = UO.FindType(-1, -1, "backpack");
if (Truth(item != ""))
{
    UO.AddObject("sort_candidate", item);
}

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

2. Regeln deaktivieren type, Speichern der Sätze selbst – Skriptfunktion

Parameter und Ablauf:

  • Eine leere Zeile deaktiviert nur den benannten Filter. Um es später wiederherzustellen, übergeben Sie den eingestellten Namen erneut.
return  RunScenario();
 object? RunScenario()
{
    UO.SelectIgnoreList("");
    var gold = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(gold != ""))
    {
        UO.AddObject("gold_candidate", gold);
    }

    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. Bereiten Sie einen Filter vor, nachdem Sie einen Namen ausgewählt haben – Skriptklasse

Parameter und Ablauf:

  • Bevor die Regel später hinzugefügt wird, ist sie leer. Einmal hinzugefügt, besteht kein Goldstapel die nächste Suche, auch wenn er gerade erst aufgetaucht 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()
    {
        UO.SelectIgnoreList("later");
        UO.AddIgnoreList("later", 0x0EED);
        var item = UO.FindType(0x0EED, -1, "ground");
        if (Truth(item == ""))
        {
            UO.Print("Gold is excluded by the selected rule");
        }

        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.SelectIgnoreList(list) — UO.SelectIgnoreList(Any)

Parameter: list (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "selectignorelist": state.SelectedIgnoreList = Text(0).Trim(); break;

UO.SetBadLocation

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

C#-Signaturen

void UO.SetBadLocation(object? x, object? y);

Fügt X/Y zur Liste der verbotenen Zellen für die folgenden Routen MoveXY, NewMoveXY, MoveXYZ, PMove hinzu und fordert GetPathArray/GetPathArray3D an.

Parameter

  • x – Welt X der ausgeschlossenen Zelle.
  • y – Welt Y der ausgeschlossenen Zelle.

Rückgabewert

void – kein Rückgabewert. Rufen Sie eine separate Leitung an; es ist nicht true/false oder die Anzahl der Schritte.

Verhalten

  • Der Schlüssel besteht aus X/Y, keiner Karte und Z. Die Koordinaten müssen Ganzzahlen innerhalb von 0..65535 sein; Das Verlassen des Bereichs führt zu einem Skriptfehler.
  • Verbote gelten für die Laufzeit des aufrufenden Skripts. Die neue Route oder Anfrage erhält einen Snapshot davon. Eine bereits laufende Route speichert ihren Snapshot inklusive interner Neuberechnung. Starten Sie nach dem Ändern der Liste eine neue Route.
  • Dies ist keine Kartenänderung: Normale manuelle Bewegungen und andere Laufzeitrouten erhalten dieses Verbot nicht. Sie können den ursprünglichen Platz verlassen, auch wenn dieser als verboten markiert ist.
  • 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.SetBadLocation");
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());

1. Benachbarte Zelle von der Berechnung ausschließen – direktes Skript

Parameter und Ablauf:

  • X/Y – Zelle östlich des Zeichens.
  • Wenn eine Durchquerung möglich ist, wird ein anderer vollständiger Pfad zurückgegeben. Der Charakter bewegt sich nicht.
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());
var path = UO.GetPathArray(UO.GetX() + 3, UO.GetY(), true, 0);
UO.Print(Convert.ToString(ArrayLength(path)));

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

2. Zwei Zellen hinzufügen – Skriptfunktion

Parameter und Ablauf:

  • Jeder Aufruf fügt ein X/Y-Paar hinzu.
  • Die Wiederholung eines Paares führt nicht zu einem zweiten separaten Verbot; Z ist kein Parameter.
return  RunScenario();
 object? RunScenario()
{
    UO.SetBadLocation(1445, 1690);
    UO.SetBadLocation(1445, 1691);
    return null;
}

3. Setzen Sie ein bekanntes Hindernis in eine angrenzende Zelle – Szenarioklasse

Parameter und Ablauf:

  • Ersetzen Sie die Koordinaten durch eine wirklich unpassierbare Zelle. Der Befehl richtet lokale Routendaten ein und erstellt kein Objekt in der Welt.
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()
    {
        int x = UO.GetX() + 1;
        int y = UO.GetY();
        UO.SetBadLocation(x, y);
        UO.Print($"Marked known blocked location: {x},{y}");
        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.SetBadLocation(x, y) — UO.SetBadLocation(Any,Any)

Parameter: x (Any), y (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "setbadlocation":

                {

                    int x = Arg(0), y = Arg(1);

                    if (x < 0 || x > ushort.MaxValue || y < 0 || y > ushort.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadLocation requires world X/Y in 0..65535.");

                    state.BadLocations.Add(x + "," + y);

                    return InjectionValue.Unit;

                }

UO.SetBadObject

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

C#-Signaturen

void UO.SetBadObject(object? objType, object? color, object? radius);

Schließt die folgenden Routen aus und fragt die Pfade von Zellen um geladene Weltobjekte ab, die von graphic und hue ausgewählt wurden.

Parameter

  • objType – Grafik/type des Artikels, 0..65535. 0xFFFF oder -1 erlaubt jeden Typ. Dies ist keine serial-spezifische Instanz.
  • color – Farbton des Artikels, 0..65535. 0xFFFF oder -1 erlaubt jede Farbe; 0 bedeutet genau hue 0.
  • radius – Radius in Zellen, 0..255 einschließlich. 0 schließt eine Elementzelle aus. R schließt das Quadrat max(abs(dx),abs(dy)) <= R um es herum aus, einschließlich der diagonalen Zellen.

Rückgabewert

void – kein Rückgabewert. Rufen Sie eine separate Leitung an; es ist nicht true/false oder die Anzahl der Schritte.

Verhalten

  • Parameter sind erforderlich. Ein ungeeigneter Bereich führt eher zu einem Skriptfehler als zu einer stillen Abschneidung der Zahl.
  • Die Regeln werden in der aktuellen Laufzeit akkumuliert. Matching-Regeln werden kombiniert: Der größte Radius wird auf ein Element angewendet. ClearBadObjectList entfernt alle diese Regeln.
  • Geladene dynamische Elemente mit Container=0 werden berücksichtigt, einschließlich für den Kunden zugänglicher Türen. Elemente in Containern, NPC und Kartenstatik werden von diesem Filter nicht ausgewählt. Für Zeichen verwenden Sie avoidMobiles, für einzelne Zellen verwenden Sie SetBadLocation.
  • Wenn Sie MoveXY/NewMoveXY/MoveXYZ/PMove oder GetPathArray/GetPathArray3D starten, wird eine Momentaufnahme der Regeln und Positionen der Elemente erstellt. Weitere Änderungen an der Welt und der Liste ändern diesen Schnappschuss nicht; Ein neuer Start erhält neue Daten.
  • Der Filter sendet nichts an den Server, zwingt den geschlossenen Container nicht zum Laden von Inhalten und verändert die manuelle Bewegung nicht. Für X/Y-Regeln gibt es keine separate Z-Grenze.
  • 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.SetBadObject");
UO.SetBadObject(0x398C, 0xFFFF, 1);

1. Objekte eines bestimmten Typs umgehen – direktes Skript

Parameter und Ablauf:

  • ObjType=0x398C – Beispiel graphic: Ersetzen Sie es durch die Art des Hindernisses auf Ihrem Server. Color=0xFFFF wählt eine beliebige Farbe aus; Radius=1 eliminiert ein 3×3-Quadrat um jedes passende Element.
  • NewMoveXY geht fünf Zellen nach Osten, mit exaktem X/Y, zu Fuß, ohne Rückruf und mit Timeout=5000 ms. ok=1 bedeutet das Erreichen des Ziels; 0 bestätigt den Bypass nicht.
UO.SetBadObject(0x398C, 0xFFFF, 1);
var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, 0, 5000);
UO.Print(Convert.ToString(ok));

2. Pfad mit exakter Farbe ohne Bewegung prüfen – Script-Funktion

Parameter und Ablauf:

  • Color=0x0044 wählt nur hue aus und Radius=0 schließt nur die Zelle aus, die vom Element belegt ist. ClearBadObjectList entfernt die vorherigen Typ- und Farbregeln.
  • GetPathArray gibt die Einträge [x,y,z] zurück, einschließlich des Ursprungs. Ein leeres Array bedeutet, dass angesichts der aktuellen Einschränkungen kein vollständiger Pfad vorhanden ist. Der Charakter bleibt an Ort und Stelle.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadObjectList();
    UO.SetBadObject(0x398C, 0x0044, 0);
    var path = UO.GetPathArray(UO.GetX() + 4, UO.GetY(), true, 0);
    UO.Print("Path records: " + Convert.ToString(ArrayLength(path)));
    return null;
}

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

3. Zellen aller Objekte in der Welt-Skriptklasse vorübergehend ausschließen

Parameter und Ablauf:

  • ObjType=-1 und Color=-1 sind beide Platzhalter. Radius=0 schließt die Zellen aller geladenen Weltgegenstände aus, nicht jedoch NPC oder den Inhalt der Taschen.
  • Die Bereinigung gilt für zukünftige Anfragen. Der bereits empfangene Pfad wird gespeichert; Dies ist ein Array von Koordinaten, keine aktive Route.
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.SetBadObject(-1, -1, 0);
        var path = UO.GetPathArray(UO.GetX() + 2, UO.GetY(), true, 0);
        UO.ClearBadObjectList();
        UO.Print(Convert.ToString(ArrayLength(path)));
        return null;
    }

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

Implementierung des Befehls

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

UO.SetBadObject(objType, color, radius) — UO.SetBadObject(Any,Any,Any)

Parameter: objType (Any), color (Any), radius (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "setbadobject":

                {

                    int type = ResolveType(arguments[0]), hue = Arg(1), radius = Arg(2);

                    if (type < -1 || type > ushort.MaxValue || hue < -1 || hue > ushort.MaxValue || radius < 0 || radius > byte.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadObject requires type/color 0..65535 (or -1) and radius 0..255.");

                    state.BadObjects.Add(type + "," + hue + "," + radius);

                    return InjectionValue.Unit;

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