DE UO Topic character Part 4 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MaxStamina();Liest die maximale Ausdauer aus dem lokalen Modell.
Es gibt keine Parameter.
int ist der Wert des Feldes StaminaMax, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.
- Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
- Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
- Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
- Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.
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.
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.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(value));Parameter und Ablauf:
- Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxStamina();
if (Truth(value > 0))
{
UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxStamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [MaxStamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxStamina:bridge.MaxStamina.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.MaxStaminaAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.MaxWeight();Liest den Statuszähler deines Charakters: maximales Gewicht in Steinen.
Es gibt keine Parameter.
int – maximales Gewicht in Steinen, 0..65535 im Kundenmodell. 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.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.WeightMax, 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.
- MaxWeight liest den WeightMax-Cache. Der native Status type >= 5 setzt das Serverlimit auf UInt16, auch wenn es gleich 0 ist. Der alte erweiterte Status berechnet ihn einmalig beim Empfang: Protokoll UO >= 5.0.0a - 7 * floor(Strength / 2) + 40; die ältere ist Strength * 4 + 25. Das Ergebnis wird als UInt16 gespeichert; Extremwerte werden modulo 65536 umschlossen. Konvertieren.ToString=101 ergibt 390 bzw. 429. Wenn Strength separat geändert wird, berechnet der Getter selbst den Grenzwert nicht neu.
- 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.
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.
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.MaxWeight();
UO.Print("MaxWeight: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert einen Aufruf ohne Argumente für sein eigenes Zeichen; Convert.ToString formatiert die Zahl für das Protokoll, ohne ihre Bedeutung zu ändern.
var value = UO.MaxWeight();
UO.Print("WeightMax: " + Convert.ToString(value));Parameter und Ablauf:
- UO.Wait(500) trennt Vorher und Nachher um 500 Millisekunden. Die Differenz kann positiv, null oder negativ sein; Zwischenaktualisierungen und Charakteränderungen können übersprungen werden. Pause ist ein Beispiel.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.MaxWeight();
await Delay(500);
var after = UO.MaxWeight();
var difference = after - before;
UO.Print("Counter change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- CanCarry(extra) erhält zusätzliches Gewicht in Steinen; 10 ist ein Beispiel, nicht die Anzahl der Stapel. Lehnt negatives Extra, kein Spieler oder Maximum <= 0 ab, liest das aktuelle Gewicht und Limit und gibt dann bool zurück: true oder false durch Extra <= Maximum – aktuell. Durch Subtraktion wird ein aktueller + zusätzlicher Überlauf vermieden. Bei Überladung ist das Ergebnis false, auch für extra=0. Dies ist eine lokale Bewertung, keine Serverlösung; Lesevorgänge sind nicht atomar und die Nullgewichtung ist möglicherweise unbekannt.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(CanCarry(10)) == true))
{
UO.Print("Local check passed");
}
else
{
UO.Print("Local check failed or data unavailable");
}
return null;
}
dynamic CanCarry(dynamic extra)
{
if (Truth(extra < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0))
{
return false;
}
return extra <= maximum - current;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.MaxWeight. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxWeight:bridge.MaxWeight.
Interner Implementierungscode; kein eigenständiges Skript.
public int MaxWeight() => bridge.MaxWeight;int UO.Mount();
int UO.Mount(object? mount);Mount und Dismount senden die Objektbenutzung ohne manuellen Doppelklick oder Angriff im Kampfmodus. int ist die aktuelle serial des Gegenstands auf Layer Mount, kein Erfolgsflag. Die Serverantwort erfolgt später: Mount kann noch 0 und Dismount die serial vor dem Absteigen liefern. Prüfen Sie danach ObjAtLayer("Mount").
-
mount— Seriennummer des Reittiers; sonst letztes Ziel.
Jeder Block ist eine vollständige .csx-Datei. Ersetzen Sie Beispiel-serials, Typen und Koordinaten. Parameterreihenfolge und benannte C#-Argumente folgen der Signatur.
#mount 0x00001234
#mount
Jeder Block ist eine vollständige .csx-Datei. Ersetzen Sie Beispiel-serials, Typen und Koordinaten. Parameterreihenfolge und benannte C#-Argumente folgen der Signatur.
int mountLayerSerial = UO.Mount(0x00001234);
UO.Print(UO.Int2Hex(mountLayerSerial));int currentSerial = UO.Mount();
UO.Print(UO.Int2Hex(currentSerial));UO.Mount(0x00001234);
for (int attempt = 0; attempt < 40; attempt++)
{
var serial = UO.ObjAtLayer("Mount");
if (Convert.ToString(serial) != "0" && Convert.ToString(serial) != "0x00000000")
{
UO.Print(Convert.ToString(serial));
break;
}
await WaitAsync(50);
}new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
int mountLayerSerial = api.Mount(0x00001234);
api.Print(api.Int2Hex(mountLayerSerial));
}
}CSharpGameApi.Mount
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.Mount
ClassicUOInjectionApiBridge -> NativeMountController.Request
-> OutgoingPackets.Send_UseObjectRequest (0x06)
-> MountedLayerSerialUnsafe -> Player.FindItemByLayer(Layer.Mount)
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ObjAtLayer(object? layer);Findet einen Gegenstand auf der angegebenen Ebene der Ausrüstung Ihres eigenen Charakters.
-
layer– Ein erforderliches Argument: Layer-Nummer 1..29 oder ein Zeichenfolgenname aus der Liste unten. Die Zahl 0 und der Name Invalid ergeben 0. Groß-/Kleinschreibung und nachgestellte Leerzeichen des Namens werden ignoriert. Ein unbekannter Zeichenfolgenname verursacht einen Skriptfehler; Die Zahlenfolge „1“ ersetzt nicht die Zahl 1.
Die numerische Form gibt int - serial für das Element oder 0 für eine leere/ungültige Ebene zurück. Die Zeichenfolgenform gibt string der Form „0x40001001“ zurück, wenn das Element gefunden wird, andernfalls int 0. Dies ist der ID des Artikels, nicht die Schichtnummer, graphic/type oder die Menge. Metadaten object? Die Zeichenfolgenform spiegelt zwei mögliche Ergebnistypen wider.
- 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.
- Gerätedaten self werden geprüft. Das Team öffnet die Tasche nicht, legt den Artikel nicht an und sendet auch keine Inspektionsanfrage.
- Zahlen außerhalb von 1..29 ergeben 0 ohne Modulo-Konvertierung 256; Beispielsweise kann 257 nicht die rechte Hand auswählen.
- Alle unterstützten numerischen Ebenen und Zeichenfolgennamen:
- 1 OneHanded/Rhand/RightHand; 2 TwoHanded/Lhand/LeftHand; 3 Shoes; 4 Pants; 5 Shirt; 6 Helmet/Hat; 7 Gloves; 8 Ring; 9 Talisman; 10 Necklace/Neck.
- 11 Hair; 12 Waist; 13 Torso; 14 Bracelet/Brace; 15 Face; 16 Beard; 17 Tunic; 18 Earrings/Ear; 19 Arms; 20 Cloak.
- 21 Backpack/Bpack/BackpackLayer; 22 Robe; 23 Skirt; 24 Legs; 25 Mount; 26 ShopBuyRestock/Rstk; 27 ShopBuy/NRstk; 28 ShopSell/Sell; 29 Bank.
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.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
object? item = UO.ObjAtLayer("Rhand");
if (item is string serial) UO.Print("Equipped serial: " + serial);
else UO.Print("The layer is empty");Parameter und Ablauf:
- Rhand wählt die Ebene 1 aus. Bei Erfolg ist hand eine Hex-Zeichenfolge; falls nicht vorhanden, die Nummer 0.
- Mit Convert.ToString können Sie beide möglichen Typen ausgeben. Das Ergebnis kann nicht als graphic der Waffe angesehen werden.
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
UO.Print("Right hand serial: " + serial);
}
else
{
UO.Print("Right hand is empty or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Die Zahl 2 wählt TwoHanded. Dieses Formular gibt immer int zurück.
- Exists prüft, ob das Element zum Lesen seiner Eigenschaften verfügbar ist. GetGraphic gibt ein separates type zurück.
return RunScenario();
object? RunScenario()
{
var item = UO.ObjAtLayer(2);
if (Truth(UO.Exists(item)))
{
UO.Print("Two-handed layer serial: " + Convert.ToString(item));
UO.Print("Graphic: " + UO.GetGraphic(item));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- 21 – Schicht Backpack; Ergebnis 0 ist vor dem Laden der Ausrüstung möglich.
- 257 liegt außerhalb der Liste und ergibt immer 0. Dies ist keine alternative Bezeichnung für die 1-Schicht.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var bag = UO.ObjAtLayer(21);
var invalid = UO.ObjAtLayer(257);
UO.Print("Backpack serial: " + Convert.ToString(bag));
UO.Print("Invalid layer: " + Convert.ToString(invalid));
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: layer (Any/String)
Ergebnis: dynamic / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(ObjAtLayer(Text(0))). -
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer:ObjAtLayer(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "objatlayer":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String
? GetObject(ObjAtLayer(Text(0))) : bridge.ObjAtLayer(Arg(0)));Parameter: layer (Any/String)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
Interner Implementierungscode; kein eigenständiges Skript.
public InjectionValue ObjAtLayer(string layer)
{
var id = bridge.ObjAtLayer(ConvertLayer(layer));
if (id == 0)
return InjectionValue.Zero;
return new InjectionValue("0x" + id.ToString("X8"));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ObjAtLayerEx(object? layerType, object? playerID);Liest ein Element/Container in der angegebenen Ebene für das angegebene geladene Zeichen.
-
layerType– Numerische Nummer der Ebene 1..29. Akzeptiert eine Ganzzahl oder eine numerische Zeichenfolge, z. B. 26 oder „0x1A“. String-Namen Rhand/ShopBuyRestock und Bare-Layer-Konstanten werden hier nicht in Zahlen umgewandelt. Verwenden Sie eine Zahl. -
playerID– Zeichenserie/mobile, eine Zahl, eine Hexadezimalzeichenfolge oder ein auflösbarer Objektname, z. B. „self“/„lasttarget“. Grafik/type des Artikels oder ID des Behälters selbst sind nicht geeignet.
int: serial des Artikels/Behälters auf der Ebene oder 0, wenn die Ebene leer/unbekannt ist, die Nummer ungültig ist oder kein Mobiltelefon geladen ist. Dies ist nicht bool oder eine Layer-Nummer.
- Das Lesen erfolgt lokal, ohne Ziel, Kauf, Containeröffnung und Netzwerkanfrage.
- Der Bereich 1..29 wird überprüft. Das Konvertieren eines ungeeigneten Zeichenfolgenparameters kann zu einem Fehler führen. Anstelle einer Nummer sollte kein beliebiger Layername übergeben werden.
- Für ein benutzerdefiniertes Zeichen mit einem String-Layer-Namen ist ein separates UO.ObjAtLayer verfügbar. Verwechseln Sie die Ebene nicht mit world Z, dem statischen Index oder der Gump-Koordinate.
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.
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.ObjAtLayerEx(26, UO.GetSerial("lasttarget"));
UO.Print("ObjAtLayerEx: " + Convert.ToString(result));Parameter und Ablauf:
- LayerType=26; PlayerID=Anbieter; shop – serial Container. Bei GetContent wird der Shop übergeben, nicht die Layernummer.
- Das Array wird von 0 bis zur Länge minus 1 indiziert. Jedes Element ist serial. Ein leeres Array bedeutet, dass keine unmittelbaren Elemente geladen sind; Der Kauf wird nicht erfüllt.
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("ShopBuyRestock container is not loaded");
return null;
}
UO.Print("Shop container ID: " + Convert.ToString(shop));
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
UO.Print(UO.GetName(item) + " | ID: " + Convert.ToString(item));
UO.Print("Graphic: " + Convert.ToString(UO.GetType(item)));
i = i + 1;
}
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
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;Parameter und Ablauf:
- wantedType ist graphic und Artikel ist ID eines einzelnen Artikels. stacks zählt Datensätze/Stacks; Einheiten addiert die darin enthaltene Zahl.
- Hierbei handelt es sich um die bereits erhaltene Menge und nicht um den durch einen zukünftigen Kauf garantierten Restbetrag. Hier ist kein Preis angegeben.
return RunScenario();
object? RunScenario()
{
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("Shop layer is not loaded");
return null;
}
var wantedType = 0x1766;
var stacks = 0;
var units = 0;
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
if (Truth(UO.GetType(item) == wantedType))
{
stacks = stacks + 1;
units = units + UO.GetQuantity(item);
}
i = i + 1;
}
UO.Print("Stacks: " + Convert.ToString(stacks) + " | Units: " + Convert.ToString(units));
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;Parameter und Ablauf:
- ShowVendorLayer wird vollständig deklariert. Anbieter – ID NPC, layerNumber – 26/27/28, Bildunterschrift – nur Unterschrift.
- Die Container sind dem Kunden möglicherweise unbekannt. 0 wird vor GetContent geprüft: Ein explizites GetContent(0) würde bedeuten, dass nach Gegenständen am Boden gefragt wird, was hier nicht erforderlich ist.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
ShowVendorLayer(vendor, 26, "ShopBuyRestock / Rstk");
ShowVendorLayer(vendor, 27, "ShopBuy / NRstk");
ShowVendorLayer(vendor, 28, "ShopSell / Sell");
return null;
}
void ShowVendorLayer(dynamic vendor, dynamic layerNumber, dynamic caption)
{
var container = UO.ObjAtLayerEx(layerNumber, vendor);
if (Truth(container == 0))
{
UO.Print(caption + ": not loaded");
return;
}
var items = UO.GetContent(container);
UO.Print(caption + " | Container ID: " + Convert.ToString(container));
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
}
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;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: layerType (Any), playerID (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayerEx:bridge.ObjAtLayerEx(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "objatlayerex": return new InjectionValue(bridge.ObjAtLayerEx(Arg(0), Arg(1)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Paralyzed();
int UO.Paralyzed(object? value);Überprüft die dem Client bekannte Lähmungsflagge des Charakters.
-
value– Optional serial/ID mobile: Zahl, Hexadezimalzeichenfolge, self, lasttarget oder ein anderer Standardobjektname oder AddObject-Name. Dies ist nicht graphic/type. Ohne Argument wird self verwendet. Unbekannter Name wird in 0 aufgelöst; Ziel öffnet sich nicht.
Numerisches Flag int: 1 (Bedingung erfüllt) – geladen mobile hat Flag IsParalyzed; 0 (Bedingung nicht erfüllt) – kein Flag, mobile unbekannt, gelöscht oder das Objekt ist ein Element. Dies ist keine Zeit der Lähmung und garantiert nicht die Bewegungsfähigkeit mit dem Ergebnis 0.
- Verwenden Sie Paralyzed, um die Lähmungsflagge zu überprüfen. Die Varianten Is/Get, GetParalisa, Frozen und GetLocked lesen das gleiche Flag.
- Der Befehl liest nur lokale Daten. Es wendet keine Lähmung an oder entfernt sie, wartet nicht auf deren Ende und sendet keine Aktualisierungsanforderung an den Server.
- Das Ergebnis dieses Befehls ist vom Typ int: Verwenden Sie if (Wert != 0) oder if (Wert == 0). Direkte Vergleiche mit true/false und if (value) in C# sind nicht zulässig. Der Wert behält die Bedeutung des Flags bei, nicht die Menge oder ID.
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.
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.Paralyzed();
UO.Print("Paralyzed: " + Convert.ToString(result));Parameter und Ablauf:
- Leere Klammern wählen self. Der Staat speichert einen Schnappschuss der Flagge. true ist die numerische Konstante 1.
- Ein Ergebnis von false schließt eine Wand, mangelnde Ausdauer oder einen anderen Grund für das Anhalten nicht aus.
var state = UO.Paralyzed();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- target speichert die Hex-Zeichenfolge serial des letzten Ziels. IsNpc prüft, ob es sich um den geladenen mobile handelt, einschließlich der Spieler.
- Der Befehl mit dem Argument lautet Ziel. Sie wählt keinen neuen Charakter und ändert auch nicht lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.Paralyzed(target);
UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Nicht mehr als 10 Pausen für 100 ms. Jeder Aufruf ohne Argument liest self erneut.
- Nach der Schleife wird die Anwesenheit von self separat überprüft. Dies ist eine Beobachtung für etwa eine Sekunde plus die Ausführung von Befehlen und keine garantierte Beseitigung der Lähmung.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var attempts = 0;
while (Truth(Truth(UO.Paralyzed()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.Paralyzed()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "paralyzed": return new InjectionValue(bridge.GetLocked(bridge.Self));Parameter: value (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Paralyzed]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
serial => bridge.GetLocked(serial)Interner Implementierungscode; kein eigenständiges Skript.
value => getter(GetObject(value))API-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PhysicalResist();Liest das Widerstandsfeld des aktuellen Charakters: physische Rüstung/Widerstand.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.PhysicalResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- PhysicalResistance – Server-Rüstungs-/Statusfeld: Der klassische Server kann die Rüstungsbewertung übertragen, und Regeln mit Widerständen können physischen Widerstand übertragen. API konvertiert nicht von einem zum anderen und berechnet nicht den Prozentsatz der Schadensreduzierung. Armor und physische Aliase lesen dasselbe Feld.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.PhysicalResist();
UO.Print("PhysicalResist: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.PhysicalResist();
UO.Print("PhysicalResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PhysicalResist();
await Delay(500);
var after = UO.PhysicalResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PhysicalResist();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [PhysicalResist]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.ArmorAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Poison();
void UO.Poison(object? target);Verwendet bei Bedarf die Fertigkeit „Vergiftung“ auf ein bestimmtes Ziel.
-
target– Optionaler serial/Ziel-Alias. Keine Argumente – nur UseSkill("Poisoning"). Mit Argument - UseSkillAtTarget("Vergiftung", Ziel).
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- Der registrierte Legacy-Befehl ist kein Getter für Giftresistenz oder Giftstatus. Der Zweig beschwört die Fertigkeit und wirft sie ab 1/0.
- In einem Formular mit einem Ziel prüft UseSkillAtTarget, ob ein positives Ergebnis vorliegt. serial bereitet das Ziel vor, bevor die Fertigkeit angefordert wird. Wenn die Fertigkeit nicht akzeptiert wird, wird das Ziel abgebrochen. Eine Vergiftung des Ziels durch den Server ist nicht garantiert.
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.
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.Poison");
UO.Poison();Parameter und Ablauf:
- Verwendet bei Bedarf die Fertigkeit „Vergiftung“ auf ein bestimmtes Ziel.
UO.Poison();Parameter und Ablauf:
- Der registrierte Legacy-Befehl ist kein Getter für Giftresistenz oder Giftstatus. Der Zweig beschwört die Fertigkeit und wirft sie ab 1/0.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.Poison("lasttarget");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- In einem Formular mit einem Ziel prüft UseSkillAtTarget, ob ein positives Ergebnis vorliegt. serial bereitet das Ziel vor, bevor die Fertigkeit angefordert wird. Wenn die Fertigkeit nicht akzeptiert wird, wird das Ziel abgebrochen. Eine Vergiftung des Ziels durch den Server ist nicht garantiert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.Poison(id);
UO.Print(UO.Waiting());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
Interner Implementierungscode; kein eigenständiges Skript.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;Parameter: target (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
Interner Implementierungscode; kein eigenständiges Skript.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.PoisonResist();Liest das Widerstandsfeld des aktuellen Charakters: Gift.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.PoisonResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.PoisonResist();
UO.Print("PoisonResist: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.PoisonResist();
UO.Print("PoisonResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PoisonResist();
await Delay(500);
var after = UO.PoisonResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PoisonResist();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PoisonResistance:bridge.PoisonResistance.
Interner Implementierungscode; kein eigenständiges Skript.
case "poisonresist": return new InjectionValue(bridge.PoisonResistance);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Poisoned();
int UO.Poisoned(object? id);Überprüft die Vergiftung des Charakters.
-
id– Optionales Objekt in den gezeigten Formen: serial nach Nummer/Hex-Zeichenfolge, self, lasttarget oder registrierter Name AddObject. Das ist nicht type. Lesen Sie ohne Argument self. Unbekannter Text führt in manchen Formularen zu einem Konvertierungsfehler; Überprüfen Sie den Namen, bevor Sie anrufen.
Numerisches Flag int: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt). Dies ist ein numerisches Flag: in C# Prüfergebnis != 0 oder Ergebnis == 0. Direkter Vergleich von int mit true/false und if (Ergebnis) ist nicht zulässig. 1 - mobile hat IsPoisoned, 0 hat keine Flagge oder mobile fehlt. Der Giftgrad und die verbleibende Zeit werden nicht zurückgegeben.
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.
- Liest das lokale Modell: öffnet das Ziel nicht, fordert keinen Status an, ändert das Flag nicht und sendet das Paket nicht. Ein zerstörtes Objekt gilt bereits als fehlend, bevor der Eintrag aus dem Wörterbuch gelöscht wird.
- Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
- Für Poisoned/Flying wird die Protokollversion berücksichtigt: bis 7.0.0.0 Bit 0x04 bedeutet Poison; beginnend mit 7.0.0.0 bedeutet es Flucht und das Gift wird separat gelagert. Der Flug wird nicht von Z aus berechnet.
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.
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.Poisoned();
UO.Print("Poisoned: " + Convert.ToString(result));Parameter und Ablauf:
- Leere Klammern lauten self. aktiv speichert das Ergebnis einmal; true und false definieren zwei Zweige. Print zeigt nur eine Beispielnachricht an.
var active = UO.Poisoned();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- lasttarget – zuvor ausgewähltes Objekt. Exists prüft, ob es vorhanden ist. obj ist der einzige Parameter ReadState; Die Funktion gibt das Ergebnis des Befehls ohne Änderung zurück. Seine Definition ist im kopierten Code enthalten.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.Poisoned(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Zwei Aufrufe ohne Argumente lesen self, UO.Wait(500) setzt 500 Millisekunden. Zwei Bilder werden verglichen; Zwischenübergänge können übersprungen werden. Es gibt kein endloses Warten.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Poisoned();
await Delay(500);
var after = UO.Poisoned();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
public int Poisoned() => bridge.Poisoned(bridge.Self);Parameter: id (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int Poisoned(InjectionValue id) => bridge.Poisoned(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Race();Liest die Rasse des Charakters aus dem Clientmodell.
Es gibt keine Parameter.
int – 1=Mensch, 2=Elf, 3=Wasserspeier entsprechend dem Kundenmodell. 0 bedeutet, dass kein Zeichen geladen ist. Es ist nicht body/graphic und nicht serial.
- 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.
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.
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.Race();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Die Rasse des Charakters wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.Race();
UO.Print("Race: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die Rasse des Charakters wird in der angezeigten Berechnung oder 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.Race();
if (Truth(value == 3))
{
UO.Print("Player race is gargoyle");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
- Änderung im Vergleich: Charakterrasse. 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.Race();
await Delay(1000);
var after = UO.Race();
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;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Race:bridge.Race.
Interner Implementierungscode; kein eigenständiges Skript.
case "race": return new InjectionValue(bridge.Race);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveEarrings();Fordert die Entfernung eines Elements aus der Ohrschicht an.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- ExecuteLegacyManualAlias ruft Unequip("Ear") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
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.
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.RemoveEarrings");
UO.RemoveEarrings();Parameter und Ablauf:
- Fordert die Entfernung eines Elements aus der Ohrschicht an.
UO.RemoveEarrings();Parameter und Ablauf:
- ExecuteLegacyManualAlias ruft Unequip("Ear") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ear"));
UO.RemoveEarrings();
return null;
}Parameter und Ablauf:
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveEarrings();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ear"));
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ear").
Interner Implementierungscode; kein eigenständiges Skript.
case "removeearrings": Unequip("Ear"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveHat();Fordert die Entfernung eines Elements aus der Hat-Ebene an.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- ExecuteLegacyManualAlias ruft Unequip("Hat") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung an den Rucksack an.
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
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.
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.RemoveHat");
UO.RemoveHat();Parameter und Ablauf:
- Fordert die Entfernung eines Elements aus der Hat-Ebene an.
UO.RemoveHat();Parameter und Ablauf:
- ExecuteLegacyManualAlias ruft Unequip("Hat") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung an den Rucksack an.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Hat"));
UO.RemoveHat();
return null;
}Parameter und Ablauf:
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveHat();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Hat"));
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Hat").
Interner Implementierungscode; kein eigenständiges Skript.
case "removehat": Unequip("Hat"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveNeckless();Fordert an, dass ein Element aus der Halsebene entfernt wird.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- ExecuteLegacyManualAlias ruft Unequip("Neck") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
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.
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.RemoveNeckless");
UO.RemoveNeckless();Parameter und Ablauf:
- Fordert an, dass ein Element aus der Halsebene entfernt wird.
UO.RemoveNeckless();Parameter und Ablauf:
- ExecuteLegacyManualAlias ruft Unequip("Neck") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Neck"));
UO.RemoveNeckless();
return null;
}Parameter und Ablauf:
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveNeckless();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Neck"));
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Neck").
Interner Implementierungscode; kein eigenständiges Skript.
case "removeneckless": Unequip("Neck"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RemoveRing();Fordert die Entfernung eines Elements aus der Ringebene an.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- ExecuteLegacyManualAlias ruft Unequip("Ring") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
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.
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.RemoveRing");
UO.RemoveRing();Parameter und Ablauf:
- Fordert die Entfernung eines Elements aus der Ringebene an.
UO.RemoveRing();Parameter und Ablauf:
- ExecuteLegacyManualAlias ruft Unequip("Ring") auf. ConvertLayer wählt die numerische Ebene Brücke aus. Unequip fordert die Übertragung in den Rucksack an.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ring"));
UO.RemoveRing();
return null;
}Parameter und Ablauf:
- Das Ergebnis des internen Unequip (1/0) des Legacy-Befehls wird verworfen; Rufen Sie auf einer separaten Leitung an. Wenn kein Artikel/Rucksack vorhanden ist, kann die Anfrage möglicherweise nicht ausgeführt werden. Die ObjAtLayer-Prüfung nach dem Aufruf liest nur den lokalen Status.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveRing();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ring"));
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ring").
Interner Implementierungscode; kein eigenständiges Skript.
case "removering": Unequip("Ring"); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.RequestStats(object? objID);Fordert den Status des Charakters mit serial an.
-
objID– Serielles/ID-Objekt: int, numerische/Hex-Zeichenfolge oder etablierter Alias, zum Beispiel „lasttarget“. Dies ist nicht graphic/type. Überprüfen Sie das geladene Objekt, bevor Sie Maßnahmen ergreifen.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- RequestStats ruft RequestMobileStatus(_world, serial, true) auf. Der Aufruf gibt kein Array von Merkmalen zurück und wartet nicht auf eine Antwort; Auf GetHP/GetStr folgt das Auslesen des lokalen Modells.
- Bridge sendet die Anfrage im Game-Stream. Es gelten die Serverregeln; Es gibt kein eingebautes Warten auf Bestätigung.
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.
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.RequestStats");
UO.RequestStats(UO.GetSerial("lasttarget"));Parameter und Ablauf:
- Fordert den Status des Charakters mit serial an.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- RequestStats ruft RequestMobileStatus(_world, serial, true) auf. Der Aufruf gibt kein Array von Merkmalen zurück und wartet nicht auf eine Antwort; Auf GetHP/GetStr folgt das Auslesen des lokalen Modells.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Bridge sendet die Anfrage im Game-Stream. Es gelten die Serverregeln; Es gibt kein eingebautes Warten auf Bestätigung.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: objID (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestStats:bridge.RequestStats(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "requeststats": bridge.RequestStats(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistCold();Liest das Widerstandsfeld des aktuellen Charakters: kalt.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.ColdResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.ResistCold();
UO.Print("ResistCold: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.ResistCold();
UO.Print("ColdResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistCold();
await Delay(500);
var after = UO.ResistCold();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistCold();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [ResistCold]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ColdResistance:bridge.ColdResistance.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.ColdResistanceAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistEnergy();Liest das Widerstandsfeld des aktuellen Charakters: Energie.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.EnergyResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.ResistEnergy();
UO.Print("ResistEnergy: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.ResistEnergy();
UO.Print("EnergyResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistEnergy();
await Delay(500);
var after = UO.ResistEnergy();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistEnergy();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [ResistEnergy]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnergyResistance:bridge.EnergyResistance.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.EnergyResistanceAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistFire();Liest das Widerstandsfeld des aktuellen Charakters: Feuer.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.FireResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.ResistFire();
UO.Print("ResistFire: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.ResistFire();
UO.Print("FireResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistFire();
await Delay(500);
var after = UO.ResistFire();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistFire();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [ResistFire]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FireResistance:bridge.FireResistance.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.FireResistanceAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistPhysical();Liest das Widerstandsfeld des aktuellen Charakters: physische Rüstung/Widerstand.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.PhysicalResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- PhysicalResistance – Server-Rüstungs-/Statusfeld: Der klassische Server kann die Rüstungsbewertung übertragen, und Regeln mit Widerständen können physischen Widerstand übertragen. API konvertiert nicht von einem zum anderen und berechnet nicht den Prozentsatz der Schadensreduzierung. Armor und physische Aliase lesen dasselbe Feld.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.ResistPhysical();
UO.Print("ResistPhysical: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.ResistPhysical();
UO.Print("PhysicalResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPhysical();
await Delay(500);
var after = UO.ResistPhysical();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPhysical();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [ResistPhysical]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.ArmorAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ResistPoison();Liest das Widerstandsfeld des aktuellen Charakters: Gift.
Es gibt keine Parameter.
int ist der signierte Statuswert, -32768..32767 im Client-Modell. Der negative Wert bleibt erhalten. 0 kann echter Widerstand, fehlende Daten oder fehlender/zerstörter Spieler sein; GetResist ergibt auch 0 für einen unbekannten Selektor. Es handelt sich nicht um bool, ID, Geschicklichkeits- oder Widerstandsgrenze. 1 bedeutet einen Punkt, keinen Erfolg.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Das Lesen im Spielthread erfordert Player.PoisonResistance, wenn der aktuelle Player existiert und nicht zerstört wurde; andernfalls 0. Ausrüstung wird nicht sortiert, Boni werden nicht neu berechnet, Status wird nicht abgefragt und es gibt kein Warten auf Updates. Ein gegenwärtiger Geist ist nicht gleichbedeutend mit einem zerstörten Spieler.
- Elementare Felder gibt es in den erweiterten Formen CharacterStatus (0x11), type >= 4. Der Befehl selbst prüft nicht die Server-Epoche. Der kompakte/alte Status ohne diese Felder verlässt den vorherigen Cache; Der neue Spieler ist zunächst 0. Giftresistenz ist keine Poisoned-Flagge; Es handelt sich auch nicht um eine Fertigkeit zur Abwehr von Zaubersprüchen.
- CharacterStatus prüft den erforderlichen Körper, bevor er den Namen, die Gesundheit und die eigenen Eigenschaften ändert, und übersetzt dann jedes Widerstandswort in ein signiertes Int16. Ein gekürzter Pflichtkörper verändert die bisherigen Daten nicht. Der optionale Schwanz type 6 behält die gleichen Regeln bei; Widerstandsbefehle lesen daraus keine Höchstgrenzen aus.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt. C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
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.
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.ResistPoison();
UO.Print("ResistPoison: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das Ergebnis eines Aufrufs. Convert.ToString formatiert die Zahl für das Protokoll. Es gibt keine Argumente: Sie können Ihren eigenen Charakter lesen.
var value = UO.ResistPoison();
UO.Print("PoisonResistance: " + Convert.ToString(value));Parameter und Ablauf:
- Zwischen Vorher und Nachher liegen UO.Wait(500) Millisekunden; Der Unterschied kann negativ sein. Zwischenaktualisierungen können unter Umständen fehlen. Die Pause bezieht sich auf das Beispiel, nicht auf die Verzögerung API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPoison();
await Delay(500);
var after = UO.ResistPoison();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=50 ist ein Beispiel für eine Anforderung, kein Client-Limit. ResistanceAtLeast lehnt den fehlenden Player ab, liest einen Wert und gibt bool zurück: true oder false, wenn Wert >= Minimum. Der Widerstand selbst beträgt nicht bool. Die Funktion wird unten vollständig deklariert.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPoison();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [ResistPoison]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PoisonResistance:bridge.PoisonResistance.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.PoisonResistanceAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Self();Gibt ID des aktuellen Zeichens zurück.
Es gibt keine Parameter.
int - serial/ID, nicht graphic/type, Schicht, Anzahl der Elemente oder bool. 0 – es gibt kein aktuelles Objekt. Alle 32 Bits serial werden gespeichert; check != 0, nicht == true oder > 0. Das gespeicherte Ergebnis wird nicht selbst aktualisiert. Liest World.Player.Serial; ein vermisster oder zerstörter Spieler gibt 0. Der Tod unterscheidet sich von der Entfernung: Der anwesende Geist behält das ID des Charakters.
- Es gibt keine Parameter. Liest lokale Daten über Invoke im Spielstream; Das Abbrechen des Skripts unterbricht das Warten auf diesen Thread. Versendet das Paket nicht, öffnet den Container/das Ziel nicht und überträgt den Artikel nicht.
- Das eingebaute self/backpack ohne Klammern wird erneut gelesen, sofern es nicht durch eine Skriptvariable überschrieben wird. String-Namen werden vom empfangenden Befehl verarbeitet. Im Trageziel bedeutet „self“ den Rucksack und UO.Self() gibt das serial des Charakters zurück. Verwenden Sie für den ID-Container explizit UO.Backpack().
- World.Clear entfernt Player; Nachfolgende Messungen ergeben 0. Das Betreten der Welt oder das Wechseln der ausgerüsteten Tasche kann ID verändern. Einzelne Lesevorgänge sind nicht atomar. Ein ID ungleich Null ist kein Beweis für die Verbindung, die Serverauflösung oder das Laden von Inhalten.
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.
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.Self();
UO.Print("Self: " + Convert.ToString(result));Parameter und Ablauf:
- id speichert das Ergebnis eines Aufrufs; HEX formatiert serial für Protokoll. Das Beispiel wählt oder verwendet nichts.
var id = UO.Self();
UO.Print("ID: " + Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Parameter und Ablauf:
- Vorher/Nachher werden in Abständen von 250 ms gelesen. UO.Wait wurde nur als Beispiel hinzugefügt. Gleichheit bedeutet identisches Endergebnis ID; Zwischenänderungen können übersehen werden.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Self();
await Delay(250);
var after = UO.Self();
if (Truth(before != after))
{
UO.Print("ID changed: " + Hex(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Kandidat - gespeichert ID LastTarget. IsOwnSerial(Kandidat) nimmt ein serial und gibt bool zurück: true für den aktuellen eigenen Nicht-Null-Wert ID, andernfalls false. Die Funktionsdefinition ist vollständig angegeben; Ziel ändert sich nicht.
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 candidate = UO.LastTarget();
if (Truth(Truth(IsOwnSerial(candidate)) == true))
{
UO.Print("Own object selected");
}
else
{
UO.Print("Different object or no own object");
}
return null;
}
dynamic IsOwnSerial(dynamic candidate)
{
var current = UO.Self();
return Truth(current != 0) && Truth(current == candidate);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "self": return new InjectionValue(bridge.Self);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetARExtParams();
void UO.SetARExtParams(object? shardName);
void UO.SetARExtParams(object? shardName, object? charName);
void UO.SetARExtParams(object? shardName, object? charName, object? useAtEveryConnect);Gibt einen Server aus der Liste der Shards und ein Zeichen für die spätere Anmeldung an. Nützlich, wenn das Skript von einem bestimmten Charakter desselben Kontos erneut verbunden werden muss.
-
shardName– Optionaler Anzeigename des Servers aus der Anmeldeliste, nicht IP oder Port. Ein leerer oder fehlender Wert wird vom aktuellen ShardName übernommen. Leerzeichen an den Rändern werden entfernt. -
charName– Optionaler Name eines vorhandenen Kontocharakters. Ein leerer oder fehlender Wert erhält, sofern bekannt, den Namen self. Dies ist der Name, nicht die Steckplatznummer oder serial; Ein nicht leerer Name hat Vorrang vor einem Profilslot. -
useAtEveryConnect– Optionales Flag: false/0 standardmäßig – einmalige Auswahl; true/1 oder eine andere Ganzzahl ungleich Null – Speichern Sie die Auswahl für zukünftige Anmeldungen in dieser Sitzung.
void – kein Wert. Dadurch wird die nächste Eingabe eingerichtet und nicht die Verbindung oder Existenz des Charakters bestätigt.
- Im Manager werden Nonces über fehlgeschlagene Netzwerkversuche hinweg gespeichert und erst nach dem Eintritt in die Welt verbraucht. Bei der nächsten Verbindung kehren Sie zu den Profileinstellungen zurück. Eine dauerhafte Auswahl bleibt bestehen, bis eine neue Einstellung oder der Sitzungseigentümer endet. Die Managerprofildatei wird nicht überschrieben. Die neue Einstellung während der Anmeldung gilt für die nächste Anmeldung und geht nicht verloren, wenn die aktuelle abgeschlossen ist.
- In einem separaten grafischen Client wird der Server als LastServerName gespeichert, das Zeichen wird als LastCharacterManager gespeichert. Nach erfolgreicher Anmeldung ist der Charakter auch der zuletzt verwendete: Wegwerfbarkeit bedeutet nicht, dass automatisch zum vorherigen Charakter zurückgekehrt wird. Die permanente Überschreibung bleibt im aktuellen Prozess bestehen.
- Der Befehl selbst aktiviert keine automatische Wiederverbindung und unterbricht die Verbindung nicht. Hierzu werden SetARStatus, Connect und Disconnect separat verwendet. Namen müssen in den Serverlisten vorhanden sein; Beim Vergleich wird die Groß-/Kleinschreibung nicht beachtet. Wenn die automatische Zeicheneingabe im Manager deaktiviert ist, bleibt die manuelle Auswahl bestehen. Der Name self ist möglicherweise offline nicht bekannt: Geben Sie Namen explizit an. Der Befehl ändert nichts an Konto, Passwort, IP, Port und Verschlüsselung; Leere Werte ohne verfügbaren aktuellen Namen löschen die zuvor festgelegte Auswahl nicht.
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.
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.SetARExtParams");
UO.SetARExtParams("", "", true);Parameter und Ablauf:
- Das erste Beispiel funktioniert nur online. Die beiden leeren Zeilen übernehmen die aktuellen Namen; true speichert sie für wiederholte Anmeldungen, SetARStatus(true) aktiviert die Richtlinie zur automatischen Wiederverbindung. Es erfolgt keine sofortige Wiederverbindung.
if (!(Truth(UO.Connected())))
{
return null;
}
UO.SetARExtParams("", "", true);
UO.SetARStatus(true);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Im zweiten Beispiel wird „Example Character“ nur ausgewählt, wenn dieser Name im echten GetCharsListForShard steht. Das Array ist mit 0 indiziert; ToLowerInvariant vergleicht Namen ohne Berücksichtigung der Groß- und Kleinschreibung. false bedeutet eine erfolgreiche Eingabe, nach der Konfiguration wird die automatische Wiederverbindung aktiviert und Disconnect wird aufgerufen. Ersetzen Sie den Namen durch Ihren. Wenn kein Name vorhanden ist, bleibt die Verbindung erhalten. Die automatische Pause kann die Rückkehr verzögern, bis die Verbindung wiederhergestellt ist.
return RunScenario();
object? RunScenario()
{
if (!(Truth(UO.Connected())))
{
return null;
}
var wanted = "Example Character";
var names = UO.GetCharsListForShard();
var i = 0;
while (Truth(i < ArrayLength(names)))
{
if (Truth(Convert.ToString(names[i]) == Convert.ToString(wanted)))
{
UO.SetARExtParams("", names[i], false);
UO.SetARStatus(true);
UO.Disconnect();
return null;
}
i += 1;
}
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;Parameter und Ablauf:
- Das dritte Beispiel wird von einem laufenden Offline-Skript aus gestartet. Beispiel-Shard und Beispiel-Zeichen werden explizit angegeben; Ersetzen Sie sie durch echte Namen. true behält die Auswahl bei, false in SetARStatus deaktiviert automatische Wiederholungsversuche, Connect fordert eine Eingabe an. Sie benötigen Ihre gespeicherten Kontodaten. Connect wartet nicht darauf, dass die Welt bereit ist; Ein automatisch angehaltenes Skript erreicht diese Zeilen nicht, ohne fortzufahren.
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.Connected()))
{
return null;
}
UO.SetARExtParams("Example Shard", "Example Character", true);
UO.SetARStatus(false);
UO.Connect();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Parameter: shardName (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Parameter: shardName (Any), charName (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Parameter: shardName (Any), charName (Any), useAtEveryConnect (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Interner Implementierungscode; kein eigenständiges Skript.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetARStatus(object? value);Aktiviert oder deaktiviert die automatische Wiederverbindung.
-
value- 0 schaltet sich aus; Jede Ganzzahl ungleich Null enthält.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- Bridge.SetAutoReconnect ändert die Einstellung für die automatische Wiederverbindung. Der Wert wird als aktiviert interpretiert != 0; Es erfolgt keine unmittelbare Anmeldung/Abmeldung am Server.
- Ändert die Client-Einstellung. Der Wert ist nicht das Ergebnis eines Verbindungstests und bestätigt nicht die Verarbeitung durch den Server.
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.
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.SetARStatus");
UO.SetARStatus(1);Parameter und Ablauf:
- Aktiviert oder deaktiviert die automatische Wiederverbindung.
UO.SetARStatus(1);Parameter und Ablauf:
- Bridge.SetAutoReconnect ändert die Einstellung für die automatische Wiederverbindung. Der Wert wird als aktiviert interpretiert != 0; Es erfolgt keine unmittelbare Anmeldung/Abmeldung am Server.
return RunScenario();
object? RunScenario()
{
UO.SetARStatus(0);
return null;
}Parameter und Ablauf:
- Ändert die Client-Einstellung. Der Wert ist nicht das Ergebnis eines Verbindungstests und bestätigt nicht die Verarbeitung durch den Server.
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()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetARStatus(mode);
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: value (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetAutoReconnect:bridge.SetAutoReconnect(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "setarstatus": bridge.SetAutoReconnect(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetArm(object? name);Merkt sich die aktuelle Waffe und den aktuellen Schild in einem benannten Set.
-
name– String-Name des Sets, z. B. „travel“ oder „battle“. Bei Namen wird die Groß-/Kleinschreibung nicht beachtet. Kleidungsstücke und Waffen werden getrennt aufbewahrt, in beiden ist der gleiche Name erlaubt. Dies ist kein ID-Ding oder Dateiname. Nur SetDress erlaubt das Fehlen eines Namens: Dann wird für DressSavedSet/EquipDressSet ein separater Satz aufgezeichnet.
void – kein Wert. Rufen Sie eine separate Leitung an; Ordnen Sie das Ergebnis nicht zu und vergleichen Sie es nicht mit true. Durch das Speichern und Löschen wird der Eintrag verändert, nicht das Gerät.
- Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
- Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
- Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
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.
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.SetArm");
UO.SetArm("battle");Parameter und Ablauf:
- Das Bild entsteht jetzt, wenn die nötigen Dinge bereits angelegt sind. Bei der Herausforderung werden keine Gegenstände aus dem Rucksack ausgerüstet.
UO.SetArm("battle");Parameter und Ablauf:
- Derselbe Name wird in verschiedenen Repositories verwendet. SetDress() speichert die unbenannte Menge auch separat; es handelt sich nicht um eine Auswahl eines zuvor aufgezeichneten Namens.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
return null;
}Parameter und Ablauf:
- SaveIfReady prüft die Kontrollschicht: 3 – Schuhe für Kleidung, 1 – rechte Hand für Waffen. Wenn es leer ist, wird der Snapshot nicht überschrieben. Das zurückgegebene 1/0 gehört dem Helfer, nicht SetDress/SetArm.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return SaveIfReady("battle");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(1, UO.Self()) == 0))
{
return 0;
}
UO.SetArm(name);
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: name (String)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.SetArm. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, armSets, weaponLayers, "Arm set.").
Interner Implementierungscode; kein eigenständiges Skript.
public void SetArm(string name)
=> SetEquip(name, armSets, weaponLayers, "Arm set.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetDress();
void UO.SetDress(object? name);Merkt sich die aktuell getragene Kleidung und Rüstung zur späteren Wiederherstellung.
-
name– String-Name des Sets, z. B. „travel“ oder „battle“. Bei Namen wird die Groß-/Kleinschreibung nicht beachtet. Kleidungsstücke und Waffen werden getrennt aufbewahrt, in beiden ist der gleiche Name erlaubt. Dies ist kein ID-Ding oder Dateiname. Nur SetDress erlaubt das Fehlen eines Namens: Dann wird für DressSavedSet/EquipDressSet ein separater Satz aufgezeichnet.
void – kein Wert. Rufen Sie eine separate Leitung an; Ordnen Sie das Ergebnis nicht zu und vergleichen Sie es nicht mit true. Durch das Speichern und Löschen wird der Eintrag verändert, nicht das Gerät.
- Kleidung: Schichten 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Waffen: nur 1 und 2. Haare, Bart, Rucksack, Tier und Bank sind in diesen Sets nicht enthalten.
- Bestimmte serial bereits geladene Dinge werden in eigenen Ebenen aufgezeichnet. Durch erneutes Speichern desselben Namens wird der Eintrag ersetzt. Auch leere Schichten machen Sinn: Bei der Wiederherstellung wird die entsprechende belegte Schicht in einen eigenen Rucksack freigegeben. Daher entfernt ein gespeicherter, vollständig leerer Satz Dinge aus seinen Ebenen.
- Der Satz wird im Laufzeitzustand gespeichert. Der Aufruf selbst erstellt keine Datei und garantiert nicht, dass der Satz in ein anderes Profil oder eine neue Laufzeit übertragen wird. Speichern Sie zunächst das gewünschte Set im gebrauchten Zustand. Das Laden/Speichern des allgemeinen Zustands des Clients ist ein separater Mechanismus.
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
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.
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.SetDress");
UO.SetDress();Parameter und Ablauf:
- Das Bild entsteht jetzt, wenn die nötigen Dinge bereits angelegt sind. Bei der Herausforderung werden keine Gegenstände aus dem Rucksack ausgerüstet.
UO.SetDress("travel");Parameter und Ablauf:
- Derselbe Name wird in verschiedenen Repositories verwendet. SetDress() speichert die unbenannte Menge auch separat; es handelt sich nicht um eine Auswahl eines zuvor aufgezeichneten Namens.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
UO.SetDress();
return null;
}Parameter und Ablauf:
- SaveIfReady prüft die Kontrollschicht: 3 – Schuhe für Kleidung, 1 – rechte Hand für Waffen. Wenn es leer ist, wird der Snapshot nicht überschrieben. Das zurückgegebene 1/0 gehört dem Helfer, nicht SetDress/SetArm.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return SaveIfReady("travel");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(3, UO.Self()) == 0))
{
return 0;
}
UO.SetDress(name);
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SetDress:SetDress("__stealth_saved_set__").
Interner Implementierungscode; kein eigenständiges Skript.
case "setdress": SetDress("__stealth_saved_set__"); return InjectionValue.Unit;Parameter: name (String)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.SetDress. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, dressSets, dressLayers, "Clothing set.").
Interner Implementierungscode; kein eigenständiges Skript.
public void SetDress(string name)
=> SetEquip(name, dressSets, dressLayers, "Clothing set.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetDressSpeed(object? delayms);Legt eine Pause zwischen Aufforderungen zum Umziehen fest.
-
delayms– int, Millisekunden. Der Wert ist auf 10..10000 einschließlich begrenzt.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- SetDressSpeed speichert den Zustand.DressSpeed = max(10, min(10000, Verzögerungsms)). Die Operationen gespeicherter Sätze machen sich dies zunutze; Die Geschwindigkeit der vom Server zugelassenen Aktionen ändert sich nicht.
- Ein Wert kleiner als 10 wird zu 10, ein Wert größer als 10000 wird zu 10000. Das Team nimmt keine Gegenstände an oder aus.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
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.
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.SetDressSpeed");
UO.SetDressSpeed(250);Parameter und Ablauf:
- Legt eine Pause zwischen Aufforderungen zum Umziehen fest.
UO.SetDressSpeed(250);Parameter und Ablauf:
- SetDressSpeed speichert den Zustand.DressSpeed = max(10, min(10000, Verzögerungsms)). Die Operationen gespeicherter Sätze machen sich dies zunutze; Die Geschwindigkeit der vom Server zugelassenen Aktionen ändert sich nicht.
return RunScenario();
object? RunScenario()
{
UO.SetDressSpeed(0);
UO.Print(UO.DressSpeed());
return null;
}Parameter und Ablauf:
- Ein Wert kleiner als 10 wird zu 10, ein Wert größer als 10000 wird zu 10000. Das Team nimmt keine Gegenstände an oder aus.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.SetDressSpeed(20000);
UO.Print(UO.DressSpeed());
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: delayms (Integer)
Ergebnis: void / Unit.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
public void SetDressSpeed(int delayms) => state.DressSpeed = Math.Max(10, Math.Min(10_000, delayms));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetStatLockState(object? statNum, object? statState);Fordert eine Änderung des charakteristischen Modus an.
-
statNum- Pflichtkennzahl: 0 - Konvert.ToString, 1 - DEX, 2 - INT. Dies ist nicht der aktuelle Wert und nicht der Name der Zeichenfolge. -
statState– Pflichtmodus: 0 – erhöhen, 1 – verringern, 2 – blockieren. Dies sind drei Codes, nicht bool; true/false ersetzen nicht die Namen aller Modi.
void – kein Rückgabewert. Das Ergebnis kann nicht als Erfolg/Misserfolg gewertet oder mit true verglichen werden. Die anschließende Lesung zeigt das lokale Modell, nicht die Bestätigung des Servers.
- Eine gültige Anfrage sendet ein Paket über GameActions und ändert sofort den lokalen Modus. Der Server kann seine eigenen Einschränkungen anwenden; Eine Steigerung der Fähigkeiten oder Statistiken kann nicht garantiert werden. Unbekannter Skill, ungültiger Index/Modus und fehlendes Zeichen werden ohne Paket ignoriert.
- Obligatorische Kennzahl: 0 - Konvert.ToString, 1 - DEX, 2 - INT. Dies ist nicht der aktuelle Wert und nicht der Name der Zeichenfolge.
- ExecuteClientApiCompatibility wählt den Befehlszweig aus. Text liest die Fertigkeitsauswahl, Arg liest die numerischen Zahlen und Modi. Bei einem nicht konvertierbaren Argument kann der Aufruf mit einem Konvertierungsfehler fehlschlagen.
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.
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.SetStatLockState");
UO.SetStatLockState(0, 2);Parameter und Ablauf:
- Im Beispiel werden Selektor und bei der Aufnahme der Modus explizit angegeben. In der ersten Zeile wird eine Fertigkeit anhand des Namens oder ein Merkmal anhand der Nummer ausgewählt. Print zeigt nur das Ergebnis an.
var selector = 0;
var mode = 2;
UO.SetStatLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));Parameter und Ablauf:
- Als Beispiel dienen die Schwelle 95.1 und die Modi 0/1/2. −1 wird vor dem Ändern des Modus überprüft. Nach dem Schreiben wird nur die lokale Kopie gelesen; Es wird nicht darauf gewartet, dass der Server antwortet.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Der gesamte Hilfscode ist unter Main angegeben. Der Selektor wählt eine Fertigkeit/Eigenschaft aus, der Modus stellt den Aufnahmemodus ein. ReadValue/ReadMode gibt die ursprüngliche Nummer zurück; ApplyMode prüft die Argumente, führt die Aktion aus und gibt keinen Wert zurück. UO.Wait(1000) trennt im Lesebeispiel zwei Bilder.
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()
{
ApplyMode(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatLockState(selector, mode);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: statNum (Any), statState (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetStatState(object? statNum, object? statState);Fordert eine Änderung des charakteristischen Modus an.
-
statNum- Pflichtkennzahl: 0 - Konvert.ToString, 1 - DEX, 2 - INT. Dies ist nicht der aktuelle Wert und nicht der Name der Zeichenfolge. -
statState– Pflichtmodus: 0 – erhöhen, 1 – verringern, 2 – blockieren. Dies sind drei Codes, nicht bool; true/false ersetzen nicht die Namen aller Modi.
void – kein Rückgabewert. Das Ergebnis kann nicht als Erfolg/Misserfolg gewertet oder mit true verglichen werden. Die anschließende Lesung zeigt das lokale Modell, nicht die Bestätigung des Servers.
- Eine gültige Anfrage sendet ein Paket über GameActions und ändert sofort den lokalen Modus. Der Server kann seine eigenen Einschränkungen anwenden; Eine Steigerung der Fähigkeiten oder Statistiken kann nicht garantiert werden. Unbekannter Skill, ungültiger Index/Modus und fehlendes Zeichen werden ohne Paket ignoriert.
- Obligatorische Kennzahl: 0 - Konvert.ToString, 1 - DEX, 2 - INT. Dies ist nicht der aktuelle Wert und nicht der Name der Zeichenfolge.
- ExecuteClientApiCompatibility wählt den Befehlszweig aus. Text liest die Fertigkeitsauswahl, Arg liest die numerischen Zahlen und Modi. Bei einem nicht konvertierbaren Argument kann der Aufruf mit einem Konvertierungsfehler fehlschlagen.
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.
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.SetStatState");
UO.SetStatState(0, 2);Parameter und Ablauf:
- Im Beispiel werden Selektor und bei der Aufnahme der Modus explizit angegeben. In der ersten Zeile wird eine Fertigkeit anhand des Namens oder ein Merkmal anhand der Nummer ausgewählt. Print zeigt nur das Ergebnis an.
var selector = 0;
var mode = 2;
UO.SetStatState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));Parameter und Ablauf:
- Als Beispiel dienen die Schwelle 95.1 und die Modi 0/1/2. −1 wird vor dem Ändern des Modus überprüft. Nach dem Schreiben wird nur die lokale Kopie gelesen; Es wird nicht darauf gewartet, dass der Server antwortet.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Der gesamte Hilfscode ist unter Main angegeben. Der Selektor wählt eine Fertigkeit/Eigenschaft aus, der Modus stellt den Aufnahmemodus ein. ReadValue/ReadMode gibt die ursprüngliche Nummer zurück; ApplyMode prüft die Argumente, führt die Aktion aus und gibt keinen Wert zurück. UO.Wait(1000) trennt im Lesebeispiel zwei Bilder.
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()
{
ApplyMode(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatState(selector, mode);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: statNum (Any), statState (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Sex();Liest den Geschlechts- und Rassencode aus dem Clientmodell.
Es gibt keine Parameter.
int – kompatibler Code: 0=männlicher Mensch, 1=weiblicher Mensch, 2=männlicher Elf, 3=weiblicher Elf, 4=männlicher Wasserspeier, 5=weiblicher Wasserspeier. Ohne Zeichen auch 0, also prüfen Sie Exists(self) auf Verfügbarkeit. Dies ist keine einfache bool-Frau.
- 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.
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.
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.Sex();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Der Geschlechts- und Rassencode wird im Wert gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.Sex();
UO.Print("Sex: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Der Geschlechts- und Rassencode 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.Sex();
if (Truth(value == 4) || Truth(value == 5))
{
UO.Print("Gargoyle sex/race code");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
- Veränderung wird verglichen: Geschlecht und Rassencode. 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.Sex();
await Delay(1000);
var after = UO.Sex();
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;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Sex:bridge.Sex.
Interner Implementierungscode; kein eigenständiges Skript.
case "sex": return new InjectionValue(bridge.Sex);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.Stam();Liest die aktuelle Ausdauer aus dem lokalen Modell.
Es gibt keine Parameter.
int ist der Wert des Feldes Stamina, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.
- Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
- Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
- Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
- Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.
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.
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.Stam();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.Stam();
UO.Print("Stam: " + Convert.ToString(value));Parameter und Ablauf:
- Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return RunScenario();
object? RunScenario()
{
var value = UO.Stam();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Stam();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
Interner Implementierungscode; kein eigenständiges Skript.
case "stam": return new InjectionValue(bridge.Stamina);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Stamina();Liest die aktuelle Ausdauer aus dem lokalen Modell.
Es gibt keine Parameter.
int ist der Wert des Feldes Stamina, kein Prozentsatz oder bool. 0 kann ein realer Wert oder ein Hinweis auf fehlende Daten sein. Das Nullmaximum kann nicht als Teiler verwendet werden. Für das mobile einer anderen Person sind die Bedeutungen möglicherweise unbekannt. HP/HitsMax kann anstelle von genauen Punkten einen relativen Servermaßstab enthalten. HP=0 beweist nicht den Tod; Dafür gibt es Dead/IsDead.
- Der Befehl öffnet den Status nicht und fordert kein Server-Update an. Der Client liest nur die bereits geladenen Daten. Ändert die Eigenschaften nicht und sendet keine Pakete.
- Das Ergebnis ist eine separate Lesung. Die Welt kann sich zwischen „Exists“ und der nächsten Herausforderung verändern; Mehrere Abfragen bilden keinen atomaren Snapshot.
- Beim Lesen eines Objekts weist World.Get das fehlende oder IsDestroyed zurück und führt zu 0. HP/HitsMax werden aus der Entität gelesen, einschließlich Elementen mit diesen Feldern; Mana/Stamina – nur für Mobilgeräte. Lesen Sie ohne Argument self. Die gleichnamige Variante ohne Parameter muss nicht unbedingt eine Variante mit ID haben: siehe Signaturen.
- Beim Lesen ohne Argumente wird auch 0 für einen fehlenden oder zerstörten Spieler zurückgegeben. Dies gilt für direkte Mana/Stamina und deren Maxima, nicht nur die Formen über World.Get. Ein vorhandener toter Charakter kann Werte behalten.
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.
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.Stamina();
UO.Print("Stamina: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente lautet self. value speichert eine Zahl, Convert.ToString konvertiert sie nur für Nachrichten.
var value = UO.Stamina();
UO.Print("Stamina: " + Convert.ToString(value));Parameter und Ablauf:
- Der angewendete Schwellenwert oder die Berechnung für dieses Feld wird angezeigt. Die Zahlen in der Bedingung sind Beispieleinstellungen, keine Servergrenzen. Vor der Division durch das Maximum wird dessen Positivität überprüft.
return RunScenario();
object? RunScenario()
{
var value = UO.Stamina();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Dieser Name hat keine Form mit ID. ReadValue ohne Parameter liest self; Die beiden Anrufe werden durch UO.Wait(1000) getrennt. Beim Vergleich zweier Snapshots können Zwischenänderungen ü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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Stamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Stamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.StaminaAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Str();Liest den aktuellen Stärkewert (Strength) der Spielfigur.
Es gibt keine Parameter.
int – aktuelle Statistikpunkte, 0..65535 im Client-Modell; nicht Prozentsatz, ID, Fähigkeit, Sperrmodus oder bool. 0 bedeutet auch fehlendes/gelöschtes Zeichen oder unzugängliches Objekt. Vergleichen Sie mit der numerischen Anforderung, nicht == true. Dies ist keine statistische Obergrenze oder ein garantierter Basiswert ohne Modifikatoren.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Liest Player.Strength, wenn Player existiert und nicht zerstört wurde; andernfalls 0. Ein vorhandener toter Charakter ist kein entferntes Objekt. Der Wert wird nicht aus HP, Mana oder Ausdauer berechnet.
- GetStr/GetInt/GetDex akzeptieren ObjID. PlayerMobile-Daten sind nur für self verfügbar; für ein weiteres serial - 0, auch für geladenes mobile. Die Eigenschaften einer anderen Person werden nicht ersetzt oder erraten.
- Aufrufen von Lesevorgängen im Spielstream mit der Möglichkeit, das Warten per Skript abzubrechen. Fragt den Status nicht ab, öffnet kein Ziel, sendet kein Paket, ändert die Eigenschaften nicht und fügt keine Verzögerung hinzu.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- Verwenden Sie die genauen C# Namen:
UO.Str(),UO.Strength(),UO.GetStr()oderUO.GetStrength(). C# unterscheidet Groß- und Kleinschreibung.
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.
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.Str();
UO.Print("Str: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das numerische Ergebnis; Convert.ToString formatiert es nur für das Magazin. Es gibt keine Argumente oder Charakteraktionen.
var value = UO.Str();
UO.Print("Strength: " + Convert.ToString(value));Parameter und Ablauf:
- vor und nach separaten 1000 ms; UO.Wait zum Beispiel hinzugefügt. change=after-before kann positiv, null oder negativ sein. An sich unterscheidet es nicht zwischen allen Zwischenaktualisierungen und dem Verlassen der Welt.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Str();
await Delay(1000);
var after = UO.Str();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=80 ist ein Beispiel für eine Anforderung, kein Client-Limit. AttributeAtLeast(Minimum) lehnt das fehlende Zeichen ab, liest das Merkmal einmal und gibt bool zurück: true oder false, wenn >= Minimum. Die logische Bedeutung ergibt sich aus dem Vergleich, nicht aus dem Merkmal selbst.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Str();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
Interner Implementierungscode; kein eigenständiges Skript.
case "str": return new InjectionValue(bridge.Strength);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Strength();Liest die aktuelle Leistung (Strength, Konvert.ToString) des Zeichens.
Es gibt keine Parameter.
int – aktuelle Statistikpunkte, 0..65535 im Client-Modell; nicht Prozentsatz, ID, Fähigkeit, Sperrmodus oder bool. 0 bedeutet auch fehlendes/gelöschtes Zeichen oder unzugängliches Objekt. Vergleichen Sie mit der numerischen Anforderung, nicht == true. Dies ist keine statistische Obergrenze oder ein garantierter Basiswert ohne Modifikatoren.
- Der Befehl akzeptiert keine Argumente. Verwenden Sie die genauen Signaturen oben.
- Liest Player.Strength, wenn Player existiert und nicht zerstört wurde; andernfalls 0. Ein vorhandener toter Charakter ist kein entferntes Objekt. Der Wert wird nicht aus HP, Mana oder Ausdauer berechnet.
- GetStr/GetInt/GetDex akzeptieren ObjID. PlayerMobile-Daten sind nur für self verfügbar; für ein weiteres serial - 0, auch für geladenes mobile. Die Eigenschaften einer anderen Person werden nicht ersetzt oder erraten.
- Aufrufen von Lesevorgängen im Spielstream mit der Möglichkeit, das Warten per Skript abzubrechen. Fragt den Status nicht ab, öffnet kein Ziel, sendet kein Paket, ändert die Eigenschaften nicht und fügt keine Verzögerung hinzu.
- Bei jedem Aufruf werden die lokalen Daten neu gelesen. Die Variable speichert den Snapshot; Einzelne Lesevorgänge können unterschiedliche Serveraktualisierungen erhalten. Bei einem Ergebnis ungleich Null wird die Verbindung nicht getestet. Null kann ein Wert oder keine Daten sein.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.Str(),UO.Strength(),UO.GetStr(),UO.GetStrength().
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.
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.Strength();
UO.Print("Strength: " + Convert.ToString(result));Parameter und Ablauf:
- value speichert das numerische Ergebnis; Convert.ToString formatiert es nur für das Magazin. Es gibt keine Argumente oder Charakteraktionen.
var value = UO.Strength();
UO.Print("Strength: " + Convert.ToString(value));Parameter und Ablauf:
- vor und nach separaten 1000 ms; UO.Wait zum Beispiel hinzugefügt. change=after-before kann positiv, null oder negativ sein. An sich unterscheidet es nicht zwischen allen Zwischenaktualisierungen und dem Verlassen der Welt.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Strength();
await Delay(1000);
var after = UO.Strength();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));Parameter und Ablauf:
- Minimum=80 ist ein Beispiel für eine Anforderung, kein Client-Limit. AttributeAtLeast(Minimum) lehnt das fehlende Zeichen ab, liest das Merkmal einmal und gibt bool zurück: true oder false, wenn >= Minimum. Die logische Bedeutung ergibt sich aus dem Vergleich, nicht aus dem Merkmal selbst.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Strength();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Strength]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.StrengthAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TicksDead();Liest oder markiert zum ersten Mal einen bemerkten Todesfall.
Es gibt keine Parameter.
int – UO.Timer in Zehntelsekunden ab Beginn der Laufzeit, zunächst 0. Nicht die Anzahl der Todesfälle und nicht die Dauer des Todes.
- Wenn bei jedem Aufruf „bridge.Dead()!=0“ und „ticksDead==0“ gilt, wird Timer() gespeichert. Andernfalls wird das vorherige ticksDead zurückgegeben. Nach der Wiederbelebung wird das Feld durch diese Methode nicht zurückgesetzt.
- Dies ist die Markierung des ersten Aufrufs TicksDead zum Zeitpunkt des beobachteten Todes, nicht der genaue Zeitpunkt des Serverereignisses. In der ersten Zehntelsekunde kann der Wert von 0 zurückgesetzt werden.
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.
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.TicksDead();
UO.Print("TicksDead: " + Convert.ToString(result));Parameter und Ablauf:
- Liest oder markiert zum ersten Mal einen bemerkten Todesfall.
UO.Print(UO.TicksDead());Parameter und Ablauf:
- Wenn bei jedem Aufruf „bridge.Dead()!=0“ und „ticksDead==0“ gilt, wird Timer() gespeichert. Andernfalls wird das vorherige ticksDead zurückgegeben. Nach der Wiederbelebung wird das Feld durch diese Methode nicht zurückgesetzt.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsDead()))
{
var stamp = UO.TicksDead();
UO.Print(UO.Timer() - stamp);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Dies ist die Markierung des ersten Aufrufs TicksDead zum Zeitpunkt des beobachteten Todes, nicht der genaue Zeitpunkt des Serverereignisses. In der ersten Zehntelsekunde kann der Wert von 0 zurückgesetzt 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()
{
var before = UO.TicksDead();
UO.Wait(500);
UO.Print(before = UO.TicksDead());
return null;
}
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.TicksDead. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dead:bridge.Dead(). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
Interner Implementierungscode; kein eigenständiges Skript.
public int TicksDead()
{
if (bridge.Dead() != 0 && ticksDead == 0)
ticksDead = Timer();
return ticksDead;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ToggleFly();Fordert den Wechsel des Fluges Ihres eigenen Gargoyle auf: vom Boden zum Flug, vom Flug zum Boden. Dies ist eine Aktion und UO.Flying() prüft nur den Status. Der Befehl ist vor einer Route nützlich, die einen bestimmten Modus erfordert.
Es gibt keine Parameter.
void – kein Wert. Dies ist keine true/false oder Serverbestätigung. Überprüfen Sie das tatsächliche Ergebnis über UO.Flying(), nachdem die Serverantwort verarbeitet wurde.
- Die einzige Form ist UO.ToggleFly(), ohne ID, Koordinaten und Parameter true/false. Bezieht sich auf Ihren Charakter; Der Flug eines anderen mobile kann nicht geändert werden.
- Sendet eine Anfrage 0xBF mit einem Unterbefehl 0x0032. Der Aufruf selbst überprüft weder Rasse, Protokollversion, Serverberechtigungen noch den aktuellen Modus. Wählen Sie es für Ihren eigenen Gargoyle auf einem flugfähigen Server.
- Der Server fällt möglicherweise aus und die Statusaktualisierung erfolgt später. Rufen Sie ToggleFly nicht in einer Warteschleife auf: Ein erneuter Aufruf kann den vorherigen Wechsel abbrechen. Senden Sie eine Anfrage und lesen Sie Flying, bis das Zeitlimit überschritten wird.
- Die Höhe Z und das Flugzeichen sind unterschiedliche Daten. UO.Flying() gibt int 1/true oder 0/false zurück; false ist auch möglich, wenn kein Zeichen oder das alte Protokoll vorhanden ist.
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.
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.ToggleFly");
UO.ToggleFly();Parameter und Ablauf:
- Das Beispiel gilt für Ihren Gargoyle auf einem flugunterstützenden Server. EnsureFlight(timeoutMs) gibt 1/true zurück, wenn ein Flug beobachtet wird, andernfalls 0/false. 2000 — Wartelimit in Millisekunden; prüft alle 50 ms. Wenn Sie bereits fliegen, wird ToggleFly nicht aufgerufen. Es wird höchstens eine Anfrage gesendet, dann wird der Antwortstatus überprüft. Skriptpausen/Scheduler-Verzögerungen können die Echtzeit verlängern.
if (Truth(await EnsureFlight(2000)))
{
UO.Print("Flight confirmed; ready for the next stage");
}
else
{
UO.Print("Flight not confirmed; route was not started");
}
async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
UO.ToggleFly();
var waited = 0;
while (Truth(waited < timeoutMs))
{
if (!(Truth(UO.Connected())))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
await Delay(50);
waited += 50;
}
return UO.Flying();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Bis 40 wartet 50 ms, nur eine Anfrage. Die Connected-Prüfung verhindert, dass eine Verbindungsunterbrechung als erfolgreiche Landung akzeptiert wird. Durch das Anhalten des Skripts kann sich die tatsächliche Zeit verlängern.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.Connected()) && Truth(UO.Flying()))
{
UO.ToggleFly();
var checks = 0;
while (Truth(UO.Connected()) && Truth(UO.Flying()) && Truth(checks < 40))
{
await Delay(50);
checks += 1;
}
if (Truth(UO.Connected()) && !(Truth(UO.Flying())))
{
UO.Print("Landing state observed");
}
else
{
UO.Print("Landing not confirmed");
}
}
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;Parameter und Ablauf:
- Weisen Sie Main einer Taste für eine Schaltanforderung zu. Dies ist nicht EnsureFlight: Erneutes Drücken während der Landung des Fluges. Eine Tastenwiederholung oder zwei parallele Skripte können mehrere Anfragen senden; Hier ist kein Limiter verbaut.
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.Connected()) && !(Truth(UO.Dead())))
{
UO.ToggleFly();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ToggleFly:bridge.ToggleFly().
Interner Implementierungscode; kein eigenständiges Skript.
case "togglefly": bridge.ToggleFly(); return InjectionValue.Unit;