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

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

Charaktere und Kreaturen

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

Charaktere, NPC, Monster und Haustiere, die dem Kunden bereits bekannt sind. Serial definiert eine bestimmte Kreatur, body/type ihre Grafiken; das sind unterschiedliche Bedeutungen.

Abschnitte

Thema Befehle und Erklärungen
Players UO.GetMobiles · UO.FindMobile
NPC UO.IsNpc · UO.FindMobile
Monsters UO.FindType · UO.FindMobile
Pets UO.GetPetsCurrent · UO.GetPetsMax
Followers UO.GetFollowers · UO.GetFollowersMax
Name / Serial / Body UO.GetName · UO.GetSerial · UO.GetType
Koordinaten UO.GetX · UO.GetY · UO.GetZ
Distance UO.GetDistance
Notoriety UO.Notoriety
Status UO.GetStatus · UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Paralyzed
Rename UO.Rename

Alle Theme-Befehle

Spieler / NPC / Monster

UO.GetMobile · UO.GetMobiles · UO.IsNpc

Haustiere / Followers

UO.Followers · UO.GetFollowers · UO.FollowersMax · UO.GetFollowersMax · UO.PetsCurrent · UO.GetPetsCurrent · UO.PetsMax · UO.GetPetsMax

Notoriety

UO.Notoriety · UO.GetNotoriety

Rename

UO.CanChangeName · UO.MobileCanBeRenamed · UO.Rename · UO.RenameMobile

Beispiele zum Thema

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

UO.GetMobiles

Parameter, Ergebnis und alle Szenarien

var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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;

UO.GetNotoriety

Parameter, Ergebnis und alle Szenarien

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

Vollständige Befehlsreferenz


UO.CanChangeName

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

C#-Signaturen

int UO.CanChangeName(object? id);

Überprüft das bekannte Zeichen des Clients für die Fähigkeit, mobile umzubenennen.

Parameter

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

Rückgabewert

int 1 - geladen mobile hat das Attribut IsRenamable. int 0 – das Attribut fehlt, das Objekt ist nicht mobile, unbekannt oder gelöscht. Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.

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

Verhalten

  • Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
  • Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
  • Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.

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

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

Parameter und Ablauf:

  • Das Argument self wählt explizit seinen Charakter aus. Zustand – nur 1/0.
  • Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.
var state = UO.CanChangeName("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • IsNpc schließt Subjekt und unbekanntes Objekt aus. Das Ziel speichert ein einzelnes serial und keinen Live-Verweis auf ein sich änderndes lasttarget.
  • Das Ergebnis bezieht sich auf das Feld IsRenamable. Die Daten werden erst aktualisiert, nachdem der Client den entsprechenden Status erhält.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.CanChangeName(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Vergleichen Sie den Zustand vor und nach der Pause – Skriptklasse

Parameter und Ablauf:

  • UO.Wait(500) – Pause in Millisekunden. Anschließend wird separat geprüft, ob mobile noch vorhanden ist.
  • Zwei Fotos werden verglichen. Zwischenänderungen können unter Umständen übersehen werden und es handelt sich hierbei nicht um ein fortlaufendes Abonnement von Serverereignissen.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.CanChangeName(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.CanChangeName(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

Implementierung des Befehls

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

UO.CanChangeName(id) — UO.CanChangeName(Any)

Parameter: id (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.Followers

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

C#-Signaturen

int UO.Followers();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: belegte Haustierkontrollplätze.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Followers, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsCurrent/Followers meldet belegte Steuerplätze aus seinem Status type >= 3. Ein Haustier kann mehrere Plätze belegen; Die Regeln für beschworene und gezähmte Kreaturen werden vom Server festgelegt. Dies ist nicht die Anzahl der sichtbaren mobile, nicht die Liste der ID Haustiere und nicht die Anzahl der Tiere in der Nähe.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.Followers() — UO.Followers()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.Followers

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


UO.FollowersMax

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

C#-Signaturen

int UO.FollowersMax();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: maximale Anzahl an Haustierkontrollslots.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FollowersMax, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsMax/FollowersMax meldet das gesamte Slot-Limit, das der Server ab dem Status type >= 3 zulässt, nicht freie Slots. Möglicherweise sind mehr Slots als das Limit belegt. Betrachten Sie die freie Kapazität als Maximum – Strom, und ersetzen Sie das negative Ergebnis durch 0. Das Team gibt nichts frei, zähmt nichts und ruft nichts auf.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.FollowersMax() — UO.FollowersMax()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.FollowersMax

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


UO.GetFollowers

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

C#-Signaturen

int UO.GetFollowers();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: belegte Haustierkontrollplätze.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Followers, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsCurrent/Followers meldet belegte Steuerplätze aus seinem Status type >= 3. Ein Haustier kann mehrere Plätze belegen; Die Regeln für beschworene und gezähmte Kreaturen werden vom Server festgelegt. Dies ist nicht die Anzahl der sichtbaren mobile, nicht die Liste der ID Haustiere und nicht die Anzahl der Tiere in der Nähe.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetFollowers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.GetFollowers() — UO.GetFollowers()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.Followers

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


UO.GetFollowersMax

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

C#-Signaturen

int UO.GetFollowersMax();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: maximale Anzahl an Haustierkontrollslots.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FollowersMax, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsMax/FollowersMax meldet das gesamte Slot-Limit, das der Server ab dem Status type >= 3 zulässt, nicht freie Slots. Möglicherweise sind mehr Slots als das Limit belegt. Betrachten Sie die freie Kapazität als Maximum – Strom, und ersetzen Sie das negative Ergebnis durch 0. Das Team gibt nichts frei, zähmt nichts und ruft nichts auf.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetFollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.GetFollowersMax() — UO.GetFollowersMax()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.FollowersMax

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


UO.GetMobile

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

C#-Signaturen

dynamic UO.GetMobile(object? id);

Erfasst nacheinander einen kompakten Datensatz der Eigenschaften ID.

Parameter

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

Rückgabewert

Array von 9-Feldern: [0] int serial, [1] string Name, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int Bekanntheit, [8] int Richtung 0..7. Für das unbekannte ID verfügt das Array auch über 9-Felder: Das übergebene ID wird gespeichert, der Name ist leer, die nicht verfügbaren numerischen Eigenschaften sind 0. Dies ist kein vollständiger Pascal-Datensatz von TMobile.

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 Vorhandensein von neun Feldern bestätigt nicht die Existenz des Charakters; Verwenden Sie Exists. Der Befehl selbst prüft nicht, ob ID zu Mobile gehört. Der Name/die Koordinaten und die Nullzeicheneigenschaften des Elements können zurückgegeben werden.
  • HP/MaxHP eines anderen Charakters hängt von der vom Server gesendeten Skala ab. Z ist die Höhe, nicht die Ausrüstungsebene.

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

1. Lesen Sie den Namen und die Gesundheit Ihres Charakters – direktes Skript

Parameter und Ablauf:

  • ID=self. [1] ist der Name, [5]/[6] sind der aktuelle und maximale HP, nicht Mana.
  • Das Array verfügt über feste neun Felder. Leerer Name und 0/0 sind vor Eintritt in die Welt möglich.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));

2. Lesen Sie die Koordinaten des ausgewählten Zeichens – Skriptfunktion

Parameter und Ablauf:

  • lasttarget sollte auf den Charakter zeigen. [2]/[3]/[4] – X/Y/Z der Welt.
  • Zunächst wird die Anwesenheit des Objekts überprüft. Wenn es sich bei dem Ziel um einen Gegenstand im Beutel handelt, beziehen sich die Koordinaten auf dessen Zahnfleisch.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        var mobile = UO.GetMobile(target);
        UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
    }

    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. Überprüfen Sie den Status der ausgewählten Mobile – Skriptklasse

Parameter und Ablauf:

  • [7] – Bedeutung von Bekanntheit, [8] – Richtung 0..7. Kein Feld ist type.
  • Der Befehl liest bekannte Daten, steuert den Charakter nicht und wechselt nicht den Kampfmodus.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(target)))
        {
            var mobile = UO.GetMobile(target);
            UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
            UO.Print("Direction: " + Convert.ToString(mobile[8]));
        }

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

Parameter: id (Any)

Ergebnis: dynamic / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getmobile":

                {

                    int id = Arg(0);

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),

                        new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),

                        new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))

                    });

                }

UO.GetMobiles

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

C#-Signaturen

dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);

Ruft ein Array ID passender geladener Zeichen/NPC ab. Dies wird benötigt, wenn das Skript vor einer Aktion mehrere Ziele prüfen, ein eigenes Ziel auswählen, die Umgebung berechnen oder eine eigene Bedingung hinzufügen muss.

Parameter

  • 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.
  • 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.
  • 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.
  • 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.
  • nearest - true/1 sortiert das Array von nah nach fern, dann nach serial, wenn gleich. false/0 behält standardmäßig die Client-Reihenfolge bei. Dabei handelt es sich nicht um einen zusätzlichen Radius oder die Auswahl eines Objekts.
  • includeSelf - true/1 ermöglicht Ihnen die Aktivierung von self, wenn alle anderen Filter und Ignore dies zulassen. false/0 schließt self standardmäßig aus. Die Einbeziehung garantiert nicht das Vorhandensein von self im Ergebnis.
  • aliveOnly – true/1 schließt Mobiltelefone mit IsDead != 0 aus; false/0 fügt diese Bedingung standardmäßig nicht hinzu. Kein Vergleich von HP mit Null, keine Suche nach Leichengegenständen und keine Garantie, dass das Ziel nach der Beschwörung am Leben bleibt.
  • visibleOnly - true/1 erfordert IsVisible=1 entsprechend dem aktuellen Stand ClassicUO; false/0 fügt standardmäßig keine Bedingung hinzu. Hierbei handelt es sich um die Sichtbarkeit des geladenen Objekts für den Kunden, nicht um eine Wand-/Sichtlinienprüfung. Zur geometrischen Prüfung gibt es ein eigenes UO.CheckLOS mit Koordinaten; Der Server kann die Aktion dennoch ablehnen.

Rückgabewert

Array - serial Mobilgeräte. Ein leeres Array bedeutet, dass es keine Übereinstimmungen gibt; Überprüfen Sie ArrayLength vor Zielen[0]. Nicht body/type, nicht insgesamt HP, nicht 1/0. Die Form ohne Argumente gilt weiterhin für FindDistance/FindVertical/Ignore und schließt self aus.

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.
  • 0..8 Positionsargumente werden unterstützt. classMask und Farbe sind in diesem Befehl nicht vorhanden; Übernehmen Sie hier nicht die Reihenfolge der Argumente AttackNearest.
  • Array – Schnappschuss ID. Das Ziel kann später verschwinden; Überprüfen Sie Exists erneut, wenn zwischen der Suche und der Aktion eine Wartezeit verstrichen ist. Nichts greift von alleine 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.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Wählen Sie den nächstgelegenen Verbündeten aus und aktivieren Sie Folgendes – direktes Skript

Parameter und Ablauf:

  • nearestFirst=true macht Verbündete[0] zum engsten Verbündeten. Follow beinhaltet das Gehen im Hintergrund; stoppt UO.Follow(0). Der Name/die Klasse des Verbündeten wird durch diesen Befehl nicht bestimmt.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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

2. Zählen Sie gefährliche Ziele und wählen Sie eine Aktion basierend auf ihrer Anzahl aus – Skriptfunktion

Parameter und Ablauf:

  • Hier ist near=false angebracht: Der Zähler ist wichtig. ArrayLength ist die Anzahl der Mobiles, nicht die Anzahl der Gegenstände im Stapel. Alarm druckt eine Benachrichtigung im Protokoll.
return  RunScenario();
 object? RunScenario()
{
    var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
    var count = ArrayLength(enemies);
    if (Truth(count == 1))
    {
        UO.Attack(enemies[0]);
    }
    else if (Truth(count > 1))
    {
        UO.Alarm();
    }

    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;

3. Liste auf derselben Zelle und Höhe, einschließlich sich selbst – Skriptklasse

Parameter und Ablauf:

  • Abstand=0 - identisch X/Y, maxZ=0 - identisch Z. body ist auf zwei graphic beschränkt. includeSelf=true erlaubt self, muss aber dennoch mit body und aliveOnly übereinstimmen. Das Beispiel meldet andere Zeichen auf demselben Feld.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
        var i = 0;
        var others = 0;
        while (Truth(i < ArrayLength(sameCell)))
        {
            if (Truth(sameCell[i] != UO.GetSerial("self")))
            {
                others += 1;
            }

            i += 1;
        }

        if (Truth(others > 0))
        {
            UO.Alarm();
        }

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

Parameter: Keine Parameter.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance) — UO.GetMobiles(Any)

Parameter: 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 => CompactGetMobiles(values)

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

Parameter: distance (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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body) — UO.GetMobiles(Any,Any,Any)

Parameter: distance (Any), notoriety (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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ) — UO.GetMobiles(Any,Any,Any,Any)

Parameter: distance (Any), notoriety (Any), body (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 => CompactGetMobiles(values)

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

Parameter: distance (Any), notoriety (Any), body (Any), maxZ (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 => CompactGetMobiles(values)

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

Parameter: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)

Parameter: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)

Parameter: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (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 => CompactGetMobiles(values)

UO.GetNotoriety

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

C#-Signaturen

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

Liest den Ruf des Charakters aus dem Clientmodell.

Parameter

  • id – Optionales Objekt nur in den angegebenen Einzelparameterformen: serial Zahl/Hex-Zeichenfolge, „self“, „lasttarget“ oder Name AddObject. Dies ist nicht graphic/type. Ohne Argumente wird der eigene Charakter gelesen. Bevor Sie ein anderes Objekt lesen, überprüfen Sie UO.Exists; Ein unbekannter Name öffnet den Bereich nicht.

Rückgabewert

int – 0=unbekannt, 1=unschuldig, 2=Verbündeter, 3=grau, 4=kriminell, 5=Feind, 6=Mörder, 7=unverwundbar. Dies ist ein Statuscode, nicht hue, Karma oder Ruhm. Unbekannt mobile ergibt 0.

Verhalten

  • Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
  • C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

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

Parameter und Ablauf:

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

2. Wert in der Anwendungsvalidierung verwenden – Skriptfunktion

Parameter und Ablauf:

  • Der Wert wird einmal ohne Argumente gelesen. Der Ruf des Charakters wird in der Berechnung oder der angezeigten Bedingung verwendet.
  • Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetNotoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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. Eigenschaft des ausgewählten Objekts lesen – Skriptklasse

Parameter und Ablauf:

  • Das einzelne Argument wählt das Objekt lasttarget; sein serial muss dem Client bekannt sein. Grafik/type wird hier nicht übertragen.
  • Die Daten eines anderen Objekts können auch bei positiven Exists unbekannt sein. Für die Koordinaten eines Gegenstands in einer Tasche wird die Position des Behälters ermittelt, nicht der Weltpunkt.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetNotoriety("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

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

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.GetNotoriety(bridge.Self)

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

UO.GetNotoriety(id) — UO.GetNotoriety(Any)

Parameter: id (Any/Integer/String)

Ergebnis: int / Any.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));

UO.GetNotoriety(id) — UO.GetNotoriety(Integer)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetNotoriety(id) — UO.GetNotoriety(String)

Parameter: id (Any/Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.GetPetsCurrent

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

C#-Signaturen

int UO.GetPetsCurrent();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: belegte Haustierkontrollplätze.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Followers, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsCurrent/Followers meldet belegte Steuerplätze aus seinem Status type >= 3. Ein Haustier kann mehrere Plätze belegen; Die Regeln für beschworene und gezähmte Kreaturen werden vom Server festgelegt. Dies ist nicht die Anzahl der sichtbaren mobile, nicht die Liste der ID Haustiere und nicht die Anzahl der Tiere in der Nähe.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetPetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.GetPetsCurrent() — UO.GetPetsCurrent()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.Followers

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


UO.GetPetsMax

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

C#-Signaturen

int UO.GetPetsMax();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: maximale Anzahl an Haustierkontrollslots.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FollowersMax, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsMax/FollowersMax meldet das gesamte Slot-Limit, das der Server ab dem Status type >= 3 zulässt, nicht freie Slots. Möglicherweise sind mehr Slots als das Limit belegt. Betrachten Sie die freie Kapazität als Maximum – Strom, und ersetzen Sie das negative Ergebnis durch 0. Das Team gibt nichts frei, zähmt nichts und ruft nichts auf.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetPetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.GetPetsMax() — UO.GetPetsMax()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.FollowersMax

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


UO.IsNPC

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

C#-Signaturen

int UO.IsNPC(object? objID);

Prüft den geladenen mobile gegen den explizit übergebenen serial.

Parameter

  • objID – Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, Laststatus, Finditem, Lastcorpse oder Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel. Nur bei IsNpc ist auch eine Form ohne Argumente registriert: self wird verwendet.

Rückgabewert

int 1 - geladen, nicht gelöscht mobile. int 0 – ein unbekanntes Objekt serial oder ein entferntes Objekt. Der Name IsNPC bedeutet nicht „nur Nicht-Spieler-Charakter“: Auch der eigene Charakter und andere Spieler geben 1.

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

Verhalten

  • Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
  • Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
  • Der Spielmanager behandelt IsNpc und IsNPC als gleichnamige Varianten; Verwenden Sie im C#-Quellcode die genaue Schreibweise der öffentlichen Form. Dieses Ergebnis kann den Spieler nicht zuverlässig von NPC unterscheiden; Die Regeln für diese Unterscheidung hängen vom Server ab.

In C# wird bei den Zeichen des Namens die Groß-/Kleinschreibung beachtet: UO.IsNPC erfordert ein Argument; die Form UO.IsNpc() ohne Argumente wählt self aus. Beide Namen suchen nach mobile, einschließlich Spielern, und nicht ausschließlich nach NPC.

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

1. Überprüfen Sie serial Ihres eigenen Charakters – direktes Skript

Parameter und Ablauf:

  • Diese C#-Form erfordert ein Argument. Eigener Charakter gibt auch 1; Dies ist ein Test von mobile und nicht ausschließlich von NPC.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");

2. Vor dem Auslesen der Koordinaten das geladene Ziel auswählen – Skriptfunktion

Parameter und Ablauf:

  • Die Seriennummer wird von lasttarget übernommen. Koordinaten werden nur gelesen, wenn dem Client mobile bekannt ist.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.IsNPC(target) == 0)
        return false;
    UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
    return true;
    return null;
}

3. Vergleichen Sie Charakter und Rucksack – Szenarioklasse

Parameter und Ablauf:

  • Der Charakter, der die Welt betritt, ist mobile und der Rucksack ist ein Gegenstand. Das Ergebnis bezieht sich auf den Moment der lokalen Lektüre.
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 character = UO.IsNPC(UO.Self());
        int bag = UO.IsNPC(UO.Backpack());
        UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
        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.IsNPC(objID) — UO.IsNPC(Any)

Parameter: objID (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));

UO.IsNpc

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

C#-Signaturen

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

Parameter

  • id – Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, Laststatus, Finditem, Lastcorpse oder Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel. Nur bei IsNpc ist auch eine Form ohne Argumente registriert: self wird verwendet.

Rückgabewert

int 1 - geladen, nicht gelöscht mobile. int 0 – ein unbekanntes Objekt serial oder ein entferntes Objekt. Der Name IsNPC bedeutet nicht „nur Nicht-Spieler-Charakter“: Auch der eigene Charakter und andere Spieler geben 1.

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

Verhalten

  • Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
  • Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
  • Der Spielmanager behandelt IsNpc und IsNPC als gleichnamige Varianten; Verwenden Sie im C#-Quellcode die genaue Schreibweise der öffentlichen Form. Dieses Ergebnis kann den Spieler nicht zuverlässig von NPC unterscheiden; Die Regeln für diese Unterscheidung hängen vom Server ab.

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

1. Testen Sie Ihren eigenen Charakter – direktes Drehbuch

Parameter und Ablauf:

  • Die Form ohne Argumente wählt self aus. Das Ergebnis 1/0 ist nicht serial und unterscheidet NPC nicht vom Spieler.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");

2. Die Unterscheidung zwischen mobile, Objekt und unbekanntem Ziel ist eine Funktion des Skripts

Parameter und Ablauf:

  • lasttarget vorwählen. Zunächst wird die Beladung des Objekts überprüft; Die mobile-Klassifizierung definiert nicht seine Feindseligkeit.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.Exists(target) == 0)
        UO.Print("Target is not loaded");
    else
        UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
    return null;
}

3. Lesetreffer, die dem Client nur aus der Skriptklasse mobile bekannt sind

Parameter und Ablauf:

  • Die Treffer anderer Personen können vom Server normalisiert werden. Bei der Prüfung wird nicht nach dem vollständigen Status gefragt.
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()
    {
        string target = UO.GetSerial("lasttarget");
        if (UO.IsNpc(target) != 0)
            UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
        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.IsNpc() — UO.IsNpc()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.IsNpc(id) — UO.IsNpc(Integer)

Parameter: id (Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.IsNpc(id) — UO.IsNpc(String)

Parameter: id (Integer/String)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

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

UO.MobileCanBeRenamed

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

C#-Signaturen

int UO.MobileCanBeRenamed(object? mobID);

Überprüft das bekannte Zeichen des Clients für die Fähigkeit, mobile umzubenennen.

Parameter

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

Rückgabewert

int 1 - geladen mobile hat das Attribut IsRenamable. int 0 – das Attribut fehlt, das Objekt ist nicht mobile, unbekannt oder gelöscht. Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.

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

Verhalten

  • Das lokale Clientmodell wird gelesen; Es gibt keine Anfragen an den Server, kein Warten oder Verschieben.
  • Das Ergebnis bezieht sich auf den Moment des Lesens. Nach UO.Wait oder einer anderen Aktion können sich das Objekt und seine Flags ändern.
  • Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.

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

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

Parameter und Ablauf:

  • Das Argument self wählt explizit seinen Charakter aus. Zustand – nur 1/0.
  • Dies ist die letzte Serverberechtigung, beispielsweise für ein Haustier. Der Befehl benennt das Objekt nicht um und garantiert nicht, dass eine nachfolgende Anfrage vom Server akzeptiert wird.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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

2. Ausgewählte mobile - Skriptfunktion prüfen

Parameter und Ablauf:

  • IsNpc schließt Subjekt und unbekanntes Objekt aus. Das Ziel speichert ein einzelnes serial und keinen Live-Verweis auf ein sich änderndes lasttarget.
  • Das Ergebnis bezieht sich auf das Feld IsRenamable. Die Daten werden erst aktualisiert, nachdem der Client den entsprechenden Status erhält.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.MobileCanBeRenamed(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. Vergleichen Sie den Zustand vor und nach der Pause – Skriptklasse

Parameter und Ablauf:

  • UO.Wait(500) – Pause in Millisekunden. Anschließend wird separat geprüft, ob mobile noch vorhanden ist.
  • Zwei Fotos werden verglichen. Zwischenänderungen können unter Umständen übersehen werden und es handelt sich hierbei nicht um ein fortlaufendes Abonnement von Serverereignissen.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.MobileCanBeRenamed(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.MobileCanBeRenamed(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

Implementierung des Befehls

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

UO.MobileCanBeRenamed(mobID) — UO.MobileCanBeRenamed(Any)

Parameter: mobID (Any)

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));

UO.Notoriety

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

C#-Signaturen

int UO.Notoriety();

Liest den Ruf des Charakters aus dem Clientmodell.

Parameter

Es gibt keine Parameter.

Rückgabewert

int – 0=unbekannt, 1=unschuldig, 2=Verbündeter, 3=grau, 4=kriminell, 5=Feind, 6=Mörder, 7=unverwundbar. Dies ist ein Statuscode, nicht hue, Karma oder Ruhm. Unbekannt mobile ergibt 0.

Verhalten

  • Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
  • C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

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

Parameter und Ablauf:

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

2. Wert in der Anwendungsvalidierung verwenden – Skriptfunktion

Parameter und Ablauf:

  • Der Wert wird einmal ohne Argumente gelesen. Der Ruf des Charakters wird in der Berechnung oder der angezeigten Bedingung verwendet.
  • Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Notoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    return null;
}

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

3. Sehen Sie sich die Veränderung in einer Sekunde an – Skriptunterricht

Parameter und Ablauf:

  • Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
  • Die verglichene Änderung ist der Ruf des Charakters. Ein Beispiel ändert nichts auf der Welt und wartet nicht endlos. Ereignisse innerhalb dieser Sekunde können übersehen werden.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Notoriety();
        await Delay(1000);
        var after = UO.Notoriety();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

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

Implementierung des Befehls

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

UO.Notoriety() — UO.Notoriety()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.

Interner Implementierungscode; kein eigenständiges Skript.

() => bridge.GetNotoriety(bridge.Self)

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


UO.PetsCurrent

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

C#-Signaturen

int UO.PetsCurrent();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: belegte Haustierkontrollplätze.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.Followers, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsCurrent/Followers meldet belegte Steuerplätze aus seinem Status type >= 3. Ein Haustier kann mehrere Plätze belegen; Die Regeln für beschworene und gezähmte Kreaturen werden vom Server festgelegt. Dies ist nicht die Anzahl der sichtbaren mobile, nicht die Liste der ID Haustiere und nicht die Anzahl der Tiere in der Nähe.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.PetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.PetsCurrent() — UO.PetsCurrent()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "petscurrent": return new InjectionValue(bridge.Followers);

UO.PetsMax

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

C#-Signaturen

int UO.PetsMax();

Hilft im Voraus zu entscheiden, ob der Charakter genug Platz für die nächste gezähmte oder beschworene Kreatur hat. Followers zeigt die belegten Kontrollplätze, FollowersMax ist deren Gesamtlimit. Hierbei handelt es sich nicht um die Anzahl der Tiere in der Nähe oder um den Bewegungsbefehl Follow. Liest den Statuszähler deines Charakters: maximale Anzahl an Haustierkontrollslots.

Parameter

Es gibt keine Parameter.

Rückgabewert

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

Verhalten

  • Beispielsweise ist 3 von 5 belegt – Steckplatz 2 ist frei. Der Wert 4 kann vier Kreaturen für einen Slot, eine für vier oder eine andere Kombination bedeuten. Für eine Kreatur bei 2 reicht der Check-Slot „Beschäftigt < Maximum“ nicht aus: Sie benötigen Maximum – Aktuell >= 2. Die Kosten einer bestimmten Kreatur und das Limit werden vom Server bestimmt; Ersetzen Sie FollowersMax nicht durch die Konstante 5.
  • 0 beweist nicht, dass das Haustier verloren gegangen ist, gestorben ist oder freigelassen wurde: Es kann leer sein oder der Status wurde noch nicht aktualisiert. Ein Anstieg des Zählers ist nur ein zusätzliches Zeichen für einen Kontrollwechsel; Es bestimmt nicht, welche Kreatur gezähmt wird. Überprüfen Sie auch die Nachrichten vom Server und vom Haustier selbst. Diese Plätze sind nicht gleichbedeutend mit Plätzen im Stall.
  • Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
  • Das Lesen im Spielthread erfordert Player.FollowersMax, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
  • PetsMax/FollowersMax meldet das gesamte Slot-Limit, das der Server ab dem Status type >= 3 zulässt, nicht freie Slots. Möglicherweise sind mehr Slots als das Limit belegt. Betrachten Sie die freie Kapazität als Maximum – Strom, und ersetzen Sie das negative Ergebnis durch 0. Das Team gibt nichts frei, zähmt nichts und ruft nichts auf.
  • CharacterStatus prüft vor der Aktualisierung den erforderlichen Text. Weight ist in seinem eigenen erweiterten Status verfügbar, Slots – ab type 3, Luck – ab type 4, Server WeightMax – ab type 5. Ein kompaktes/altes Paket ohne optionalen Zähler verlässt seinen vorherigen Cache. Der neue Spieler beginnt bei Null; Der Anruf beweist nicht den Erhalt eines neuen Status.
  • Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
  • Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.

Eigenständige C#-Skripte

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

Einfaches Beispiel

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

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

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

1. Berechnen Sie die verfügbaren Slots vor dem Beenden – direktes Skript

Parameter und Ablauf:

  • Strom – Besetzt, Maximum – Grenze, freeSlots – Differenz. Bei einem unbekannten/Null-Limit oder inkonsistenten Daten wird das Beispiel beendet, ohne zu bestätigen, dass der Speicherplatz frei ist. Der Befehl liest nur den neuesten Status, fordert kein neues Update an.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Überprüfen Sie die Kapazität vor der Tierzähmung – Skriptfunktion

Parameter und Ablauf:

  • Wählen Sie zunächst das gewünschte Tier aus, sodass dessen ID in lasttarget liegt. requiredSlots=2 – Beispieleinstellung, ersetzen Sie sie durch die tatsächlichen Kosten dieser Kreatur auf Ihrem Server. Wenn nicht genügend Platz vorhanden ist, wird das Ziel nicht festgelegt und die Fertigkeit nicht aufgerufen. Andernfalls wird die Warteschlange des Ziels VOR dem einzelnen Argument UseSkill(„Animal Taming“) vorbereitet. Das Starten eines Versuchs garantiert keinen Erfolg: Geschicklichkeit, Reichweite, Zähmbarkeit und Serverreaktion sind wichtig.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.PetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Wiederverwendungsprüfung für Kreaturen mit unterschiedlichen Kosten – Szenarioklasse

Parameter und Ablauf:

  • CanAddFollower ist ein vollständig deklarierter Benutzerhelfer, kein neuer UO-Befehl. Es gibt 1/true zurück, wenn ein ausreichendes Cache-Limit vorhanden ist, andernfalls 0/false. Der extraSlots-Parameter sind die Kosten der Kreatur, die HINZUGEFÜGT wird, nicht ihr type/ID. 2 – Beispiel; Die Funktion zähmt oder beschwört nicht. Die Prüfung sollte unmittelbar vor der Maßnahme wiederholt werden.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= maximum - current;
    }

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

Implementierung des Befehls

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

UO.PetsMax() — UO.PetsMax()

Parameter: Keine Parameter.

Ergebnis: int / Integer.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "petsmax": return new InjectionValue(bridge.FollowersMax);

UO.Rename

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

C#-Signaturen

void UO.Rename(object? mobile, object? newName);

Fordert eine Änderung des Charakter-/Haustiernamens an.

Parameter

  • mobile – 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.
  • newName – Text bis ToString; als übermittelt gespeichert.

Rückgabewert

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

Verhalten

  • Die Reihenfolge ist serial, dann der neue Name. Bridge.RenameMobile ruft GameActions.Rename(serial, Name) auf. API überprüft CanChangeName nicht und ändert auch nicht das lokale Name selbst.
  • Der Server prüft die Berechtigung zum Umbenennen. Für Haustiere prüfen Sie zunächst MobileCanBeRenamed; Die Anfrage stellt keine Garantie für die Annahme des Namens dar.

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

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Fordert eine Änderung des Charakter-/Haustiernamens an.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.Rename(id, "Companion");
}

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:

  • Die Reihenfolge ist serial, dann der neue Name. Bridge.RenameMobile ruft GameActions.Rename(serial, Name) auf. API überprüft CanChangeName nicht und ändert auch nicht das lokale Name selbst.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.Rename(id, "Guardian");
    }

    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:

  • Der Server prüft die Berechtigung zum Umbenennen. Für Haustiere prüfen Sie zunächst MobileCanBeRenamed; Die Anfrage stellt keine Garantie für die Annahme des Namens dar.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.Rename(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.Rename(mobile, newName) — UO.Rename(Any,Any)

Parameter: mobile (Any), newName (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;

UO.RenameMobile

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

C#-Signaturen

void UO.RenameMobile(object? mobID, object? newName);

Fordert eine Änderung des Charakter-/Haustiernamens an.

Parameter

  • mobID – 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.
  • newName – Text bis ToString; als übermittelt gespeichert.

Rückgabewert

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

Verhalten

  • Die Reihenfolge ist serial, dann der neue Name. Bridge.RenameMobile ruft GameActions.Rename(serial, Name) auf. API überprüft CanChangeName nicht und ändert auch nicht das lokale Name selbst.
  • Der Server prüft die Berechtigung zum Umbenennen. Für Haustiere prüfen Sie zunächst MobileCanBeRenamed; Die Anfrage stellt keine Garantie für die Annahme des Namens dar.

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

1. Direkter Aufruf – direktes Skript

Parameter und Ablauf:

  • Fordert eine Änderung des Charakter-/Haustiernamens an.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.RenameMobile(id, "Companion");
}

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:

  • Die Reihenfolge ist serial, dann der neue Name. Bridge.RenameMobile ruft GameActions.Rename(serial, Name) auf. API überprüft CanChangeName nicht und ändert auch nicht das lokale Name selbst.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.RenameMobile(id, "Guardian");
    }

    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:

  • Der Server prüft die Berechtigung zum Umbenennen. Für Haustiere prüfen Sie zunächst MobileCanBeRenamed; Die Anfrage stellt keine Garantie für die Annahme des Namens dar.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.RenameMobile(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.RenameMobile(mobID, newName) — UO.RenameMobile(Any,Any)

Parameter: mobID (Any), newName (Any)

Ergebnis: void / Unit.

Beim Aufruf:

Interner Implementierungscode; kein eigenständiges Skript.

case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;
⚠️ **GitHub.com Fallback** ⚠️