Repository navigation
DE UO Topic combat
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen
Angriff, Kampfmodus, Waffenfähigkeiten und Verbandsheilung. Die Anfrage des Clients und die vom Server ausgeführte Aktion sind unterschiedlich.
| Thema | Befehle und Erklärungen |
|---|---|
| Attack | UO.Attack |
| AttackNearest | UO.AttackNearest |
| LastAttack | UO.LastAttack |
| WarMode | UO.WarMode |
| WarTarget | UO.WarTargetID |
| Waffenfähigkeiten | UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility |
| Primary Ability | UO.UsePrimaryAbility |
| Secondary Ability | UO.UseSecondaryAbility |
| Special Moves | UO.Specmove |
| BandageSelf | UO.BandageSelf |
UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID
UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove
UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest
Die Namen der Gruppen und die Art der getragenen Gegenstände werden durch das Skript festgelegt; Die Reihenfolge der Namen bis | gibt die Priorität an.
Jede Befehlskarte verfügt über mehrere unabhängige Szenarien: Direktcode, Funktionen und Klassen. Nachfolgend finden Sie ausgewählte kurze Szenarien; Einschränkungen und eine vollständige Analyse sind geplant.
Parameter, Ergebnis und alle Szenarien
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
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, Ergebnis und alle Szenarien
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Attack(object? objID);Leitet eine Angriffsanforderung an einen bestimmten serial. Geeignet, wenn das Ziel bereits vom Benutzer ausgewählt oder von einem anderen Team gefunden wurde; Eine eigenständige Suche nach Kleidung/Entfernung gibt es hier nicht.
-
objID– Seriell mobile: int, Dezimal-/Hex-Zeichenfolge oder auflösbarer Objektname (zum Beispiel lasttarget oder Name AddObject). Nicht graphic/type oder Klassenname. Erforderliches Argument; 0 ist kein Befehl, den Kampf zu beenden. Um ein Ziel ohne ID auszuwählen, verwenden Sie die Suche oder das Spielziel.
void – kein Wert. Schreiben Sie UO.Attack(enemy) in eine separate Zeile, nicht var result=UO.Attack(...). Das Beenden eines Anrufs stellt keine Bestätigung eines Treffers, einer Beschädigung oder einer Serverakzeptanz dar.
- Die Herausforderung selbst wirft keine toten, entfernten, self, Verbündeten, leeren serial oder Gegenstände zurück. Überprüfen Sie das ausgewählte Ziel. vorzugsweise gefiltert mobile aus GetMobiles/FindMan.
- Es wird der Standard GameActions.Attack verwendet: Die Frage nach einem kriminellen Angriff mit EnabledCriminalActionQuery ist möglich. Im normalen Verlauf werden LastAttack/NewTargetSystemSerial aktualisiert und ein Angriffsanforderungspaket gesendet.
- Der Befehl aktiviert WarMode nicht, führt keinen Maus-Doppelklick aus, berechnet keine Route und startet keine Schleife wiederholter Angriffe. Kampfmodus und weiterer Kampf hängen vom Server ab.
- Bei einer Zeichenfolge mit einem unbekannten Objektnamen kann ein Auflösungsfehler auftreten. Das Testen von Exists beweist die Anwesenheit eines Objekts, aber nicht, dass es sich um mobile handelt; GetMobiles wird von Mobiltelefonen vergeben.
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.Attack");
UO.Attack(UO.LastTarget());Parameter und Ablauf:
- lasttarget kann ein Gegenstand oder ein freundlicher Charakter sein. Die zulässige Liste schließt diese Fälle aus; Attack wird höchstens einmal aufgerufen.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;2. Finden Sie zuerst den Feind und greifen Sie dann an, wenn die Höhe verfügbar ist – Skriptfunktion
Parameter und Ablauf:
- FindMan gibt serial zurück und greift nicht an. Die IsDead-Prüfung wird separat hinzugefügt, da FindMan kein aliveOnly hat.
return RunScenario();
object? RunScenario()
{
var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
if (Truth(enemy == 0))
{
return null;
}
if (Truth(UO.IsDead(enemy) == 0))
{
UO.AddObject("enemy", enemy);
UO.Attack(enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- GetMobiles ist bereits „nearest=true“ geordnet. Befindet sich vor dem ersten Ziel eine Wand, wird das nächste überprüft; Das Vorhandensein von visibleOnly allein ersetzt CheckLOS nicht. Die Serverüberprüfung kann variieren.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(targets)))
{
var enemy = targets[i];
if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
{
UO.Attack(enemy);
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;
}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/Integer/String)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;Parameter: objID (Any/Integer/String)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
Interner Implementierungscode; kein eigenständiges Skript.
public void Attack(int id) => bridge.Attack(id);Parameter: objID (Any/Integer/String)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public void Attack(string id) => Attack(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);Wählt ein geeignetes Kampfziel aus und übergibt es an den Angriffsführer. Filter begrenzen die zulässigen Zeichen. benutzerdefiniert classMask legt die Ausrüstungs- und Klassenpriorität fest, am nächsten – Auswahl innerhalb einer Klasse.
-
notoriety– Beziehungsstatus zum vom Server empfangenen Charakter: 0 – unbekannt, 1 – unschuldig, 2 – Verbündeter, 3 – grau, 4 – kriminell, 5 – Feind, 6 – Mörder, 7 – Unverwundbar. Die Zahl bedeutet einen Status; „5|6“ oder eine Reihe von Zahlen – eine der oben genannten. Es liegt nicht an der Farbe der Kleidung oder der Klasse. Eine negative Zahl (normalerweise -1), 0xFFFF, „beliebig“, eine leere Zeichenfolge oder ein leeres Array deaktiviert diesen Filter separat. Eine ungültige Zeichenfolge ohne gültige Zahlen findet niemanden. Die Reihenfolge der Status legt keine Priorität fest. Der 5-Filter wählt den Feind aus, anstatt automatisch ein beliebiges NPC/Monster auszuwählen. Die tatsächlichen Werte hängen vom Server ab. -
distance– Horizontaler Radius in Zellen einschließlich: 5 ermöglicht den Abstand 0..5. Der Abstand beträgt max(abs(dx),abs(dy)), daher ist die angrenzende Diagonale ebenfalls 1. Standardmäßig oder wenn die Zahl negativ ist, wird UO.FindDistance() anstelle einer unbegrenzten Suche verwendet. 0 verlässt dieselbe X/Y-Zelle. Nicht die Länge der Strecke; Hindernisse und Böden werden von diesem Parameter nicht überprüft. -
body– Grafik des Körpers des Charakters/NPC, nicht ID eines bestimmten Charakters und nicht type der getragenen Rüstung. Eine Zahl, eine Hex-Zeichenfolge, die Zeichenfolge „0x0190|0x0191“ oder ein Array von Zahlen. 0x0190 (400) – männlicher Mensch; 0x0191 (401) – weiblicher Mensch. Die Maske vereint beide Körper. Die Liste umfasst nicht automatisch andere Rassen, Geister oder Transformationen; Tabelle der Standard-Grafikkörpertypen. Eine negative Zahl (standardmäßig -1), 0xFFFF, „beliebig“, eine leere Zeichenfolge oder ein leeres Array allein – ein beliebiger Körper. Unbekannter Text ohne gültige Nummer führt zu einem leeren Ergebnis. -
maxZ– Maximale Bauchmuskeln (Z des Ziels – Z des eigenen Charakters), einschließlich, in Welt-Z-Einheiten. Dabei handelt es sich nicht um die Anzahl der Stockwerke oder X/Y-Zellen. maxZ=4 mit Z-Spieler 10 erlaubt Z-Ziel 6..14; 0 erfordert genau die gleiche Höhe. Standardmäßig/für eine negative Zahl wird UO.FindVertical() verwendet. Auf der Treppe kann ein gleiches Z das gewünschte Ziel eliminieren. Selbst ein kleiner Unterschied in Z beweist nicht die Zugänglichkeit des Bodens. -
nearest- true/1 wählt standardmäßig das am besten passende Zeichen aus; Gleicher Abstand ist durch kleinere serial zulässig. false/0 behält das erste übereinstimmende Objekt in der Client-Listenreihenfolge bei und wählt nicht das am weitesten entfernte Objekt aus. Bei classMask gilt zuerst die Klassenpriorität, dann der klasseninterne Abstand. -
color– Farbton von mobile selbst: int oder numerische/hexadezimale Zeichenfolge. Negative Zahl (standardmäßig -1) und 0xFFFF – jedes hue; 0 ist genau hue 0 und kein beliebiger Wert. Nicht die Farbe des Berühmtheitsstreifens oder der Farbton der Kleidung. Dieser Parameter überprüft nicht die Farbe des getragenen Artikels. -
classMask– Namen von Regeln, die von UO.SetClassMask in derselben Skriptlaufzeit vordefiniert wurden. Beispiel: „DTMH|hunter|spare“ – Priorität von links nach rechts; Ein Array von Strings ist ebenfalls zulässig. Irgendwelche Namen, Groß- und Kleinschreibung ist nicht wichtig. Zeilentrennzeichen: |, Komma oder ;. Jeder unbekannte Name/leere Element in der Liste hebt die Auswahl der gesamten Auswahl auf: Ergebnis 0, kein Angriff. Dies ist keine numerische Bitmaske: 7 bedeutet nicht drei Klassen. Ein fehlendes Argument, -1, „-1“, „any“, „all“ oder die leere Zeichenfolge deaktiviert den Klassenfilter separat. Magier/Tank/Bogenschütze sind nicht integriert: Ohne die Registrierung solcher Regeln wird es keine Matches geben. -
aliveOnly– true/1 schließt Mobiltelefone mit IsDead != 0 aus; false/0 fügt diese Bedingung standardmäßig nicht hinzu. Kein Vergleich von HP mit Null, keine Suche nach Leichengegenständen und keine Garantie, dass das Ziel nach der Beschwörung am Leben bleibt. -
visibleOnly- true/1 erfordert IsVisible=1 entsprechend dem aktuellen Stand ClassicUO; false/0 fügt standardmäßig keine Bedingung hinzu. Hierbei handelt es sich um die Sichtbarkeit des geladenen Objekts für den Kunden, nicht um eine Wand-/Sichtlinienprüfung. Zur geometrischen Prüfung gibt es ein eigenes UO.CheckLOS mit Koordinaten; Der Server kann die Aktion dennoch ablehnen.
int - serial ausgewählt mobile oder 0, wenn kein geeignetes Ziel vorhanden ist oder classMask ungültig ist. Dies ist keine 1/0-Flagge, kein body/type, keine Entfernung oder Bestätigung eines Angriffs. Feind überprüfen != 0; Feind == true ist in C# nicht gültig: int lässt sich nicht mit bool vergleichen. Wenn ID ungleich Null ist, kann der ClassicUO-Handler immer noch eine Bestätigung des Innocent-Angriffs anzeigen; Der Server kann die Aktion ablehnen.
- Lokale Suche: nur bereits heruntergeladene Handys. Ignore wird berücksichtigt; self ist ausgeschlossen, mit Ausnahme des expliziten includeSelf=true in den Befehlen, die es unterstützen. Behälter und Gegenstände sind keine Mobilgeräte.
- Die Bedingungen gelten gemeinsam (AND). Gültige Alternativen innerhalb von body/bekanntheit werden durch OR kombiniert. Die Suche ändert FindItem, FindCount und GetFoundItems nicht.
- In body/bekanntheit verwendet eine Maske mit gültigen Zahlen genau diese: „any|5“ begrenzt sie immer noch auf den Wert 5. Leere/ungültige Elemente neben gültigen Zahlen werden ignoriert. Für keine Einschränkung übergeben Sie -1 separat. Übertragen Sie diese Regel nicht auf classMask: Unbekannter Klassenname lehnt die gesamte Liste ab.
- Die Teams öffnen keinen Bereich der Welt, laufen nicht zum Ziel und prüfen nicht die Passierbarkeit der Route. Zwischen der Auswahl und der Verarbeitung durch den Server kann sich der Zustand der Welt ändern.
- Die Übertragung von true und 1 ist für die Flags false und 0 gleichwertig. Andere Zahlen ungleich Null werden ebenfalls in true umgewandelt, aber 8/9 sind keine separaten Modi; Verwenden Sie klar true/false.
- Der Name ist eine individuelle Bezeichnung, kein Serverberuf. Sie können die Regel DTMH, my_group oder jedes andere Wort nennen. Die Engine bestimmt Fertigkeiten/Klassen auf dem Server nicht anhand des Charakternamens.
- Bei Bedarf bedeutet ein type oder flaches Array mindestens eine Sache aus der Liste. Eine Reihe von Gruppen bedeutet: Sie benötigen mindestens eine Sache aus JEDER Gruppe. Zum Beispiel erfordert [Leder, Stäbe] Leder UND einen Stab. Hierbei handelt es sich um eine Reihe von Alternativen und nicht um die Verpflichtung, die gesamte aufgeführte Garderobe zu tragen.
- Jeder Gegenstand, der aus dem Verbotenen Bereich getragen wird, schließt den Charakter von dieser Regel aus, auch wenn die erforderlichen Voraussetzungen erfüllt sind. Leder und eine verbotene Kette erfüllen nicht die Lederregel. Andere Regeln werden weiterhin getestet.
- Es werden nur beladene Gegenstände gezählt, die auf den Schichten 1..24 getragen werden, mit Ausnahme des Rucksacks 21. Der Inhalt von Rucksack/Truhe, Reittier 25, Magazin 26..28 und Bank 29 gilt nicht als Kleidung. Vergleicht graphic/type; Die Dinge serial, Name und hue werden hier nicht verwendet.
- Ohne die entsprechende geladene Ausrüstung stimmt die Liste nicht überein. Das Fehlen eines verbotenen Elements in den lokalen Daten beweist nicht, dass es auf dem Server nicht vorhanden ist, sofern der Server das Gerät noch nicht gesendet hat. Der Client errät keine versteckten Daten.
- Die Regeln gehören zu einem Laufzeitskript, einschließlich seiner Funktionen und Includes; werden nicht auf andere unabhängige Starts übertragen und nicht im Profil gespeichert. Definieren Sie diese bei einem erneuten Start erneut, beispielsweise durch die allgemeine Einrichtungsprozedur. Ein wiederholtes SetClassMask ersetzt die gleichnamige Regel erst, nachdem die neuen Daten vollständig überprüft wurden.
- Arrays werden bei der Registrierung kopiert. Das Ändern des ursprünglichen Arrays ändert nichts an der Regel: Wiederholen Sie SetClassMask. Mehrere Übereinstimmungsregeln werden durch die Reihenfolge der Namen in classMask aufgelöst. Es gibt keine Standard-Bekleidungstische für Kellner.
- 1..9 Positionsargumente werden unterstützt. Sie können den Schwanz weglassen; Um classMask zu setzen, müssen die ersten sechs Argumente übergeben werden. Verwenden Sie den Namen var, um die Bedeutung jeder Position anzuzeigen.
- Ein Ziel wird ausgewählt und der Angriff wird einmal gesendet. Dies ist kein automatischer Kampfzyklus. Ohne classMask werden der Gerätefilter und die Artikelauslesung nicht durchgeführt.
- Zuerst die allgemeinen Filter, dann die Priorität von links nach rechts, dann die nächstgelegene. nearest=false behält weiterhin die Klassenpriorität, wählt jedoch innerhalb der ersten passenden Klasse das erste mobile in der Liste des Clients aus.
- Der alte Versuch, in einem Namen/Titel nach einer Teilzeichenfolge zu suchen, wurde durch Geräteregeln ersetzt. Verschieben Sie solche Skripte in ein explizites SetClassMask; Der Name des Charakters identifiziert ihn nicht mehr als eine bestimmte Klasse.
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.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));Parameter und Ablauf:
- body=-1, maxZ=FindVertical(), near=true, color=-1, classMask deaktiviert, aliveOnly=false, visibleOnly=false. Um sicherzustellen, dass tote Personen ausgeschlossen werden, verwenden Sie das vollständige Formular unten.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
return null;
}
UO.AddObject("combat_target", enemy);
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:
- maxZ=0 ist für strenge Höhenvergleiche nützlich, kann aber das Ziel an der Stufe abschneiden. visibleOnly prüft die Wand nicht. Alle neun Argumente sind signiert; gibt ID zurück, nicht true.
return RunScenario();
object? RunScenario()
{
var status = "5|6";
var radius = 8;
var bodies = "0x0190|0x0191";
var heightTolerance = 0;
dynamic chooseNearest = true;
var bodyHue = -1;
var equipmentClasses = -1;
dynamic requireAlive = true;
dynamic requireVisible = true;
var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_same_height", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- DTMH wird zuerst ausgewählt; nur wenn es kein passendes DTMH gibt – schwer, dann Jäger. DTMH auf 10-Zellen hat Vorrang vor Heavy auf 2-Zellen. Um die Reihenfolge umzukehren, ändern Sie die Zeile classMask. Von den beiden DTMH wird das nächstgelegene ausgewählt.
- Gear ist eine vollständig reduzierte Benutzerfunktion C#, kein separater Befehl UO. Die beiden Arrays in Gear (Leder, Dauben) bilden zwei erforderliche Gruppen. Das Hinzufügen einer Art zu Leder erweitert die Alternativen; erfordert nicht das Tragen von zwei Lederartikeln.
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 leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
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:
- 10 ist der Radius, 4 ist die zulässige Differenz Z, sowohl -1 nach der Flag-Disable-Farbe als auch classMask. Die Reihenfolge der Kundenliste zwischen Weltaktualisierungen ist nicht garantiert. Für vorhersehbare Nähe verwenden Sie „true“.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
return null;
}
UO.AddObject("current_enemy", target);
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:
- Lediglich die Reihenfolge der Beschriftungen ändert sich: Dem Client müssen keine neuen Bekleidungstabellen oder Namen hinzugefügt werden. Um zu verhindern, dass auf einen schweren Fehler zurückgegriffen wird, entfernen Sie ihn aus der Priorität.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var priority = "охотник|DTMH|тяжёлый";
var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("priority_enemy", enemy);
}
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
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: notoriety (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))Parameter: notoriety (Any), distance (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))Parameter: notoriety (Any), distance (Any), body (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)
Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)
Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)
Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)
Parameter: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
values => new InjectionValue(CompactAttackNearest(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BandageSelf();Platziert den Charakter als UO.Wait-Ziel und verwendet einen aus dem Rucksack ausgewählten Verband vom Typ 0x0E21. Der Vorgang wird vom Client gesendet und vom Server asynchron ausgeführt.
Es gibt keine Parameter.
void. Die Methode gibt den Behandlungsstatus nicht zurück und wartet nicht, bis der Verband abgeschlossen ist.
- Die Laufzeit legt das Ziel
Selffest, durchsucht dann den Rucksack nach dem am besten passenden Element des Typs0x0E21mit einem beliebigen hue und verwendet es. Wird der Verband nicht gefunden, meldet die Suche dies an das Systemprotokoll; Das Suchergebnis wird nicht an das aufrufende Skript zurückgegeben. Die Möglichkeit und das Ergebnis der Behandlung hängen vom Serverstatus des Charakters ab.
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.BandageSelf");
UO.BandageSelf();Parameter und Ablauf:
- Benutzen Sie einmal den Verband aus dem Rucksack für sich selbst.
UO.BandageSelf();2. Überprüfen Sie zunächst die Verbindung und lösen Sie dann die Aktion aus. Der Anruf wartet nicht auf das Ende der Behandlung. - Skriptfunktion
Parameter und Ablauf:
- Überprüfen Sie zunächst die Verbindung und lösen Sie dann die Aktion aus. Der Anruf wartet nicht auf das Ende der Behandlung.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.BandageSelf();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;3. Das Verfahren meldet nur die Verwendung des Verbandes und nicht den Erfolg der Behandlung. - Skriptklasse
Parameter und Ablauf:
- Das Verfahren meldet nur die Verwendung des Verbandes und nicht den Erfolg der Behandlung.
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()
{
ApplyBandage();
return null;
}
void ApplyBandage()
{
UO.BandageSelf();
}
}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.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
Interner Implementierungscode; kein eigenständiges Skript.
public void BandageSelf()
{
var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));
if (foundBandages != string.Empty)
{
WaitTargetSelf();
UseObject(foundBandages);
}
else
SystemMessage("No bandages found.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ClearClassMask();
int UO.ClearClassMask(object? name);Entfernt eine benutzerdefinierte Geräteregel oder alle Regeln der aktuellen Skriptlaufzeit. Nützlich vor dem Neukonfigurieren von Sätzen oder dem Deaktivieren der temporären Priorität.
-
name– Optionaler Name, der an SetClassMask übergeben wird. Der Fall ist nicht wichtig. Ohne Argumente werden alle Regeln für diese Laufzeit gelöscht. Dies ist keine Prioritätszeichenfolge: „mage|tank“ ist hier nicht zulässig; Entfernen Sie einzeln oder rufen Sie ohne Argumente auf.
int – Anzahl gelöschter Regeln. Der Name 1 bedeutet gelöscht, 0 – eine solche Regel gab es nicht. Ohne Argumente wird 0..N zurückgegeben, kein boolesches Flag. Vergleichen Sie daher das Gesamtergebnis mit > 0 und nicht mit true.
- Bricht einen bereits gesendeten Angriff nicht ab und stoppt das Skript nicht. Ändert die Charakterausrüstung nicht.
- Einmal gelöscht, bleibt der Name dem nächsten AttackNearest unbekannt. Entfernen Sie es ebenfalls aus classMask oder registrieren Sie es erneut; Ein unbekannter Name blockiert jede Auswahl.
- Die Laufzeiten und Regeln anderer Personen sind davon nicht betroffen. Für eine reguläre Suche ohne Klassen verwenden Sie classMask=-1 anstelle des leeren obligatorischen Kleidungssatzes.
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.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));Parameter und Ablauf:
- Durch das Entfernen wird weder die Waffe gewechselt noch der Kampf beendet. Es verändert lediglich die weitere Klassifizierung.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("main_enemy", enemy);
}
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:
- entfernt – Anzahl der entfernten Regeln. Ein neuer Satz wird in derselben Laufzeit erstellt, ohne dass der Client neu gestartet werden muss.
return RunScenario();
object? RunScenario()
{
UO.SetClassMask("старый_набор", 0x13B2);
var removed = UO.ClearClassMask();
UO.SetClassMask("новый_набор", 0x0F50);
var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("new_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Übergeben Sie nicht den Remote-Namen: Das Ergebnis wäre 0. -1 deaktiviert nur Kleidung; Andere Filter funktionieren weiterhin.
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.SetClassMask("по_одежде", 0x13C4);
UO.ClearClassMask();
var classes = -1;
var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_without_classes", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
args => new InjectionValue(ClearClassMask(null))Parameter: name (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetAbilityID(object? abilityName);Löst den Namen oder die Nummer einer Waffenfähigkeit im ID-Client-Verzeichnis auf.
-
abilityName- string: Name AbilityData, Enum-Fähigkeitsname oder Dezimalzahl ID. Leerzeichen/Satzzeichen werden beim Namensvergleich entfernt und die Groß-/Kleinschreibung wird nicht beachtet.
int 1..AbilityData.Abilities.Length – bekannte Fähigkeit; 0 ist ein unbekannter Name, eine leere normalisierte Zeichenfolge oder ein numerisches ID außerhalb des Verzeichnisses.
- ResolveClassicUOAbilityId analysiert zuerst die Dezimalzahl int und vergleicht dann die normalisierten Verzeichnis- und Enum-Namen. Der Befehl aktiviert weder die Fähigkeit noch prüft er die Kompatibilität mit der aktuellen Waffe.
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.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));Parameter und Ablauf:
- Die Zahl stellt den ID des Katalogs dar, nicht die Nutzung der Fähigkeit.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));Parameter und Ablauf:
- Die Linie 1 durchquert den numerischen Pfad des Resolvers.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}Parameter und Ablauf:
- Ein fehlender Name gibt 0 zurück.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetAbilityID("unknown-example-ability");
UO.Print(Convert.ToString(id));
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: abilityName (String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetAbilityName(object? abilityId);Gibt den Namen der Fähigkeit einer Waffe aus ihrem ID-Verzeichnis zurück.
-
abilityId- int: Indizierung von ID beginnt mit 1; Brücke lautet AbilityData.Abilities[abilityId-1].
string Verzeichnisname. Für ID kleiner als 1 oder größer als die Verzeichnislänge wird eine leere Zeichenfolge zurückgegeben.
- Der Messwert ist lokal und aktiviert die Fähigkeit nicht. ID des Katalogs bedeutet nicht, dass die Fähigkeit in der aktuellen Waffe 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.
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.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));Parameter und Ablauf:
- ID 1 entspricht dem ersten Element des Verzeichnisses.
var name = UO.GetAbilityName(1);
UO.Print(name);Parameter und Ablauf:
- Der Name wird basierend auf dem vom Resolver gefundenen ID zurückgegeben.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
UO.Print(UO.GetAbilityName(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:
- ID 0 gibt einen String der Länge 0 zurück.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = UO.GetAbilityName(0);
UO.Print(Convert.ToString(Len(name)));
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 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: abilityId (Integer)
Ergebnis: string / String.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
Interner Implementierungscode; kein eigenständiges Skript.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetActiveAbility();Liest den Namen der aktivierten Kampffähigkeit Ihres Charakters.
Es gibt keine Parameter.
string ist der englische Name der aktivierten Fähigkeit, zum Beispiel Armor Ignore. Zeichenfolge „0“, wenn keine Fähigkeit aktiviert ist oder ein Charakter fehlt. Dies ist weder eine int 0 noch eine ID-Fähigkeit, noch ist es eine Bestätigung eines erfolgreichen Treffers.
- Die PrimaryAbility/SecondaryAbility Flags des aktuellen Zeichens werden gelesen. Wenn beide aktiv sind, wird die primäre Fähigkeit gewählt. Das Aktivitätskennzeichen wird von der Nummer entfernt, bevor der Name gesucht wird.
- Daten werden lokal gelesen; Der Getter selbst aktiviert die Fähigkeit nicht und verbraucht kein Mana. Nach dem Angriff kann der Server die Aktivierung entfernen.
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.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Es gibt keine Argumente; Der Charakter des aktuellen Clients wird gelesen.
- Erfolgt keine Aktivierung, wird die Zeichenfolge 0 gedruckt.
var name = UO.GetActiveAbility();
UO.Print(name);2. Aktivieren Sie eine Primärfähigkeit nur, wenn keine aktive Fähigkeit vorhanden ist – Skriptfunktion
Parameter und Ablauf:
- Der Vergleich erfolgt mit der Zeichenfolge 0. UsePrimaryAbility wird separat aufgerufen.
- Dies ist eine Aktivierungsanfrage, kein Beweis für einen erfolgreichen Strike. Die Verfügbarkeit hängt von den Waffen und den Serverregeln ab.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetActiveAbility() == "0"))
{
UO.UsePrimaryAbility();
}
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:
- GetAbilityID erhält den vom Getter zurückgegebenen Namen.
- Die ID-Fähigkeit ist nicht die serial-Waffe oder der Charakter. Zunächst wird das Fehlen einer aktiven Fähigkeit ausgeschlossen.
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 name = UO.GetActiveAbility();
if (Truth(name != "0"))
{
var id = UO.GetAbilityID(name);
UO.Print("Ability ID: " + Convert.ToString(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;
}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.GetActiveAbility:bridge.GetActiveAbility().
Interner Implementierungscode; kein eigenständiges Skript.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWeaponAbilities();Bridge liest Player.Abilities, wendet ((byte)Wert & 0x7F an) und speichert positive ID in der ursprünglichen Reihenfolge.
Es gibt keine Parameter.
Array positiver int ID-Fähigkeiten der aktuellen Waffe. Das High-Flag 0x80 wird entfernt; Nullwerte sind ausgeschlossen. Ohne Player – ein leeres Array.
- Bridge liest Player.Abilities, wendet ((byte)Wert & 0x7F an) und speichert positive ID in der ursprünglichen Reihenfolge. Gibt das verfügbare ID zurück, nicht die Tatsache des aktiven Modus und nicht die Namen.
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Bridge liest Player.Abilities, wendet ((byte)Wert & 0x7F an) und speichert positive ID in der ursprünglichen Reihenfolge.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Parameter und Ablauf:
- Bridge liest Player.Abilities, wendet ((byte)Wert & 0x7F an) und speichert positive ID in der ursprünglichen Reihenfolge. Gibt das verfügbare ID zurück, nicht die Tatsache des aktiven Modus und nicht die Namen.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.GetAbilityName(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.GetWeaponAbilities();
UO.Wait(500);
var after = UO.GetWeaponAbilities();
UO.Print(before);
UO.Print(after);
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: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
Interner Implementierungscode; kein eigenständiges Skript.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsWarMode(object? objID);Überprüft die Kampfhaltung mobile.
-
objID– Obligatorisches serial/ID eines bestimmten Objekts: int, Hex-String oder Alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse oder Name AddObject. Dies ist nicht graphic/type. Nicht angegebener Name wird zu 0 aufgelöst; Der Befehl öffnet kein neues Ziel. Das Argument ist erforderlich; Bestehen Sie für sich selbst self.
int 1 - geladen mobile hat das Attribut InWarMode. int 0 – das Attribut fehlt, das Objekt ist nicht mobile, unbekannt oder gelöscht. Zeigt Ihnen nicht an, wen der Charakter angreift, und aktiviert auch nicht den Kampfmodus. Das Auslesen des Fremdmodus ist auf die vom Server empfangenen Daten beschränkt.
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.
- 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.
- Zeigt Ihnen nicht an, wen der Charakter angreift, und aktiviert auch nicht den Kampfmodus. Das Auslesen des Fremdmodus ist auf die vom Server empfangenen Daten beschränkt.
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.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));Parameter und Ablauf:
- Das Argument self wählt explizit seinen Charakter aus. Zustand – nur 1/0.
- Zeigt Ihnen nicht an, wen der Charakter angreift, und aktiviert auch nicht den Kampfmodus. Das Auslesen des Fremdmodus ist auf die vom Server empfangenen Daten beschränkt.
var state = UO.IsWarMode("self");
if (Truth(state))
{
UO.Print("Combat stance is active");
}
else
{
UO.Print("Combat stance is inactive");
}
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:
- IsNpc schließt Subjekt und unbekanntes Objekt aus. Das Ziel speichert ein einzelnes serial und keinen Live-Verweis auf ein sich änderndes lasttarget.
- Das Ergebnis bezieht sich auf das Feld InWarMode. Die Daten werden erst aktualisiert, nachdem der Client den entsprechenden Status erhält.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsWarMode(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- UO.Wait(500) – Pause in Millisekunden. Anschließend wird separat geprüft, ob mobile noch vorhanden ist.
- Zwei Fotos werden verglichen. Zwischenänderungen können unter Umständen übersehen werden und es handelt sich hierbei nicht um ein fortlaufendes Abonnement von Serverereignissen.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsWarMode(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsWarMode(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
Interner Implementierungscode; kein eigenständiges Skript.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastAttack();Liest serial des letzten Angriffsziels.
Es gibt keine Parameter.
int – gespeichert serial; 0 bedeutet, dass serial nicht installiert ist. Es ist nicht bool und nicht graphic/type; ein ID ungleich Null existiert möglicherweise nicht mehr auf der Welt.
- Feldquelle: Brücke.LastAttack. Der Befehl wählt das Objekt nicht aus, verwendet es nicht und greift es auch nicht an.
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Liest serial des letzten Angriffsziels.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Parameter und Ablauf:
- Feldquelle: Brücke.LastAttack. Der Befehl wählt das Objekt nicht aus, verwendet es nicht und greift es auch nicht an.
return RunScenario();
object? RunScenario()
{
var id = UO.LastAttack();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(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:
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.LastAttack();
UO.Wait(500);
var after = UO.LastAttack();
UO.Print(before = after);
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: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Interner Implementierungscode; kein eigenständiges Skript.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);Erstellt oder ersetzt eine benutzerdefinierte Geräteklasse für classMask in UO.AttackNearest. Sie wählen einen Namen und graphic/type Dinge; Integrierte Berufsbezeichnungen sind nicht erforderlich.
-
name– Eine nicht leere Zeichenfolge mit Ihrem Namen, zum Beispiel „DTMH“, „my_group“, „archer_with_shield“. Die Groß-/Kleinschreibung spielt keine Rolle, Leerzeichen an den Rändern werden entfernt. | , ; verboten: Dies sind Prioritätstrennzeichen. any/all/-1 sind für die Deaktivierung des Filters reserviert. -
required– Ein type, eine flache Reihe von Alternativen oder eine Reihe obligatorischer Gruppen. Jede Gruppe ist type oder ein flaches Array. Sie benötigen mindestens eine Sache aus jeder Gruppe; Leere erforderliche Gruppen sind nicht zulässig. Jedes type ist eine int/numerische/hex-Zeichenfolge 1..65534. Eine tiefere Verschachtelung als ein Array von Gruppen wird nicht akzeptiert. Dabei handelt es sich um graphic-Dinge, nicht um serial- und nicht um body-Zeichen. -
forbidden– Optionales type oder flaches Array unzulässiger Typen. Standardmäßig gibt es keine verbotenen Elemente. Ein leeres Array ist ebenfalls zulässig. Wenn ein solcher Gegenstand getragen wird, gilt die Regel nicht. Die gleichen Grenzen 1..65534; -1/any werden hier nicht akzeptiert. Es ist unmöglich, alle Alternativen zu einer Pflichtgruppe vollständig zu verbieten.
int 1 – die Regel wurde überprüft und protokolliert. Ein ungültiger Typ/Name/eine leere erforderliche Gruppe/Inkonsistenz führt zu einem Skriptfehler, der durch try/CATCH abgefangen werden kann; Die bisherige Regel bleibt bestehen. Gibt kein serial oder gefundene Zeichen zurück und startet keinen Angriff.
- Der Name ist eine individuelle Bezeichnung, kein Serverberuf. Sie können die Regel DTMH, my_group oder jedes andere Wort nennen. Die Engine bestimmt Fertigkeiten/Klassen auf dem Server nicht anhand des Charakternamens.
- Bei Bedarf bedeutet ein type oder flaches Array mindestens eine Sache aus der Liste. Eine Reihe von Gruppen bedeutet: Sie benötigen mindestens eine Sache aus JEDER Gruppe. Zum Beispiel erfordert [Leder, Stäbe] Leder UND einen Stab. Hierbei handelt es sich um eine Reihe von Alternativen und nicht um die Verpflichtung, die gesamte aufgeführte Garderobe zu tragen.
- Jeder Gegenstand, der aus dem Verbotenen Bereich getragen wird, schließt den Charakter von dieser Regel aus, auch wenn die erforderlichen Voraussetzungen erfüllt sind. Leder und eine verbotene Kette erfüllen nicht die Lederregel. Andere Regeln werden weiterhin getestet.
- Es werden nur beladene Gegenstände gezählt, die auf den Schichten 1..24 getragen werden, mit Ausnahme des Rucksacks 21. Der Inhalt von Rucksack/Truhe, Reittier 25, Magazin 26..28 und Bank 29 gilt nicht als Kleidung. Vergleicht graphic/type; Die Dinge serial, Name und hue werden hier nicht verwendet.
- Ohne die entsprechende geladene Ausrüstung stimmt die Liste nicht überein. Das Fehlen eines verbotenen Elements in den lokalen Daten beweist nicht, dass es auf dem Server nicht vorhanden ist, sofern der Server das Gerät noch nicht gesendet hat. Der Client errät keine versteckten Daten.
- Die Regeln gehören zu einem Laufzeitskript, einschließlich seiner Funktionen und Includes; werden nicht auf andere unabhängige Starts übertragen und nicht im Profil gespeichert. Definieren Sie diese bei einem erneuten Start erneut, beispielsweise durch die allgemeine Einrichtungsprozedur. Ein wiederholtes SetClassMask ersetzt die gleichnamige Regel erst, nachdem die neuen Daten vollständig überprüft wurden.
- Arrays werden bei der Registrierung kopiert. Das Ändern des ursprünglichen Arrays ändert nichts an der Regel: Wiederholen Sie SetClassMask. Mehrere Übereinstimmungsregeln werden durch die Reihenfolge der Namen in classMask aufgelöst. Es gibt keine Standard-Bekleidungstische für Kellner.
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.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));Parameter und Ablauf:
- DTMH – nur dein Name. Die Werte in myLeather/forbiddenChain sind Beispiele: Ersetzen/ergänzen Sie sie durch den echten graphic Ihres Servers. Eine flache Liste bedeutet OR, kein vollständiger Satz.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("leather_enemy", enemy);
}
dynamic Gear(params dynamic[] values)
{
return values;
}
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:
- DTMH wird zuerst ausgewählt; nur wenn es kein passendes DTMH gibt – schwer, dann Jäger. DTMH auf 10-Zellen hat Vorrang vor Heavy auf 2-Zellen. Um die Reihenfolge umzukehren, ändern Sie die Zeile classMask. Von den beiden DTMH wird das nächstgelegene ausgewählt.
- Gear ist eine vollständig reduzierte Benutzerfunktion C#, kein separater Befehl UO. Die beiden Arrays in Gear (Leder, Dauben) bilden zwei erforderliche Gruppen. Das Hinzufügen einer Art zu Leder erweitert die Alternativen; erfordert nicht das Tragen von zwei Lederartikeln.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
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:
- Durch die Deklaration der Variablen „required[1]“ werden zwei Elemente mit den Indizes 0 und 1 erstellt. Die beiden verschachtelten Gruppen erfordern Torso UND Waffe; flach [torsoType,weaponType] würde Rumpf ODER Waffe bedeuten.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
dynamic[] required = new dynamic[checked((int)(1) + 1)];
dynamic[] torso = new dynamic[checked((int)(0) + 1)];
dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
torso[0] = 0x13C4;
weapon[0] = 0x0DF0;
required[0] = torso;
required[1] = weapon;
UO.SetClassMask("мой_комплект", required);
var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("outfit_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Parameter und Ablauf:
- Die erneute Registrierung ersetzt eine Kopie der Regel. Der alte Name bleibt derselbe, sodass die Prioritätszeile nicht neu geschrieben werden muss.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("updated_outfit", enemy);
}
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 (Any), required (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
args => new InjectionValue(SetClassMask(args))Parameter: name (Any), required (Any), forbidden (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
args => new InjectionValue(SetClassMask(args))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWarMode(object? value);Fordert den Kampf- oder Friedensmodus des Charakters an.
-
value– 0 – friedlicher Modus; Jede Ganzzahl ungleich Null ist der Kampfmodus.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- WarMode übergibt den Modus an GameActions.ToggleWarMode: 0 deaktiviert, jeder Wert ungleich Null aktiviert. Ohne Spieler gibt es keine Aktion.
- 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.SetWarMode");
UO.SetWarMode(1);Parameter und Ablauf:
- Fordert den Kampf- oder Friedensmodus des Charakters an.
UO.SetWarMode(1);Parameter und Ablauf:
- WarMode übergibt den Modus an GameActions.ToggleWarMode: 0 deaktiviert, jeder Wert ungleich Null aktiviert. Ohne Spieler gibt es keine Aktion.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}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()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetWarMode(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. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);Sendet eine Schrittanforderung direkt an die Bridge.
-
direction— int; Richtung & 7 daët 0..7 N,NE,E,SE,S,SW,W,NW. -
running– Optionale numerische Flagge int: 0/keine – Gehen, ungleich Null – Laufen.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- ExecuteLegacyManualAlias ruft Brücke auf.Step(Richtung & 7, läuft != 0) und verwirft alle Ergebniscodes 0/2/3/4/5/7; void kehrt nach draußen zurück. Dies ist ein Schritt/eine Umdrehung, keine Route. Das Warten innerhalb von Step bis 10000 ms wird beibehalten, aber das Skript erhält keine Bestätigung, keinen Fehler oder keinen Timeout-Code.
- Der Zweig erfüllt nicht die Laufzeitbedingungen MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor von UO.Step. Bridge/Player.Walk selbst und der Server überprüfen weiterhin die Bewegung.
- QueueStep im Spielstream überprüft den Spieler, die Verbindung, die Richtung, die Warteschlange, das Tempo und den lokalen Verkehr. Vor Player.Walk zeichnet jeder Aufruf separat die Bestätigungs-/Verweigerungsgenerationen seiner Sequenz und Walker auf; gibt dann das Ergebnis zusammen mit diesem Schnappschuss zurück. Step und ausstehendes StepControlled prüfen nur dieses gespeicherte Paar, nicht die gemeinsamen Felder der nächsten Anfrage; Der Ersatzspieler/Walker beendet das Warten mit einer generellen Ablehnung. Die Bestätigung eines anderen regulären Befehls bestätigt diesen Schritt nicht. Drehung ohne Bewegung bleibt ein gesonderter Fall.
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.Specmove");
UO.Specmove(0);Parameter und Ablauf:
- Sendet eine Schrittanforderung direkt an die Bridge.
UO.Specmove(0);Parameter und Ablauf:
- ExecuteLegacyManualAlias ruft „bridge.Step(direction&7,running!=0)“ auf und verwirft dann das zurückgegebene 1/0. Dies ist ein Schritt, kein Pfad zu einer Koordinate.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}Parameter und Ablauf:
- Der Zweig erfüllt nicht die Laufzeitbedingungen MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor von UO.Step. Bridge/Player.Walk selbst und der Server überprüfen weiterhin die Bewegung.
Mindestschrittintervall: Gehen – Gehen 400 ms, Laufen 200 ms; Reiten - Gehen 200 ms, Laufen 100 ms.
Hierbei handelt es sich um Standard-Client-Limits und nicht um automatisch definierte Einstellungen für Ihren Shard. Servergeschwindigkeit und Flugmodi werden separat gezählt. Skript-Timer können die Bewegung verlangsamen, verringern diese Grenzwerte jedoch nicht.
Schritte, Routen, Follow, Maus-/Tastensteuerung und Karte nutzen die gemeinsame Warteschlange des Charakters. Durch das Ersetzen der Route, das Abbiegen oder das Anpassen der Position durch den Server wird die verbleibende Pause nach der Schrittanforderung nicht aufgehoben. Nach der Verzögerung gibt es keinen schnellen Burst, um die verlorenen Frames auszugleichen. Das Warten auf eine Bestätigung, Hindernisse und schlechte Kommunikation können die Bewegung verlangsamen.
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.GetX();
UO.Specmove(2, 0);
UO.Wait(500);
UO.Print(UO.GetX() - before);
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: direction (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Parameter: direction (Any), running (Any)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseAbility(object? abilityId);Fordert die für die aktuelle Waffe verfügbare Fähigkeit an.
-
abilityId– Fähigkeitsname oder int ID 1..AbilityData.Abilities.Length. Namen werden normalisiert: Es werden nur Buchstaben/Zahlen in Großbuchstaben gespeichert und verglichen. Numerischer Text bedeutet ID.
Numerisches Flag int: 1 – ID entspricht der primären/sekundären Fähigkeit des aktuellen Spielers und das entsprechende GameActions wird aufgerufen; 0 – kein Spieler, unbekannt ID/Name oder Fähigkeit gehört nicht zur aktuellen Waffe.
- Die Zeichenfolgenform verwendet ResolveAbility; Numerisch sofort Brücke.UseAbility. Bridge maskiert 0x80 aus zwei aktuellen Fähigkeiten und passt ID und ruft dann UsePrimaryAbility oder UseSecondaryAbility auf.
- Dabei handelt es sich um die Annahme einer lokalen Anfrage, nicht um die Bestätigung eines Treffers, einer Manaausgabe oder einer Aktivierung durch den Server. Verfügbare ID werden gelesen GetWeaponAbilities, aktiver Name ist GetActiveAbility.
- GameActions schaltet das Fähigkeitsauswahlbit 0x80 um. Eine bereits ausgewählte Fähigkeit sendet ID 0 und deaktiviert sie; andernfalls werden beide Auswahlbits gelöscht, der ausgewählte ID wird gesendet und dann wird sein Bit lokal gesetzt. Daher kann ein erneuter Aufruf die Fähigkeit deaktivieren. Eine lokale Änderung bedeutet keinen erfolgreichen Treffer oder eine Serverbestä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.
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.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));Parameter und Ablauf:
- Fordert die für die aktuelle Waffe verfügbare Fähigkeit an.
UO.Print(UO.UseAbility("Armor Ignore"));Parameter und Ablauf:
- Die Zeichenfolgenform verwendet ResolveAbility; Numerisch sofort Brücke.UseAbility. Bridge maskiert 0x80 aus zwei aktuellen Fähigkeiten und passt ID und ruft dann UsePrimaryAbility oder UseSecondaryAbility auf.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.UseAbility(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parameter und Ablauf:
- Dabei handelt es sich um die Annahme einer lokalen Anfrage, nicht um die Bestätigung eines Treffers, einer Manaausgabe oder einer Aktivierung durch den Server. Verfügbare ID werden gelesen GetWeaponAbilities, aktiver Name ist GetActiveAbility.
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.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.UseAbility(id);
UO.Print(accepted);
UO.Print(UO.GetActiveAbility());
}
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: abilityId (Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Interner Implementierungscode; kein eigenständiges Skript.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);Parameter: abilityId (Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Interner Implementierungscode; kein eigenständiges Skript.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UsePrimaryAbility();Beschwört die Hauptfähigkeit der Waffe.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- UsePrimaryAbility überträgt GameActions.UsePrimaryAbility(_world) über Invoke. Es wird kein Annahmeschild zurückgegeben; Die aktive Fähigkeit wird gesondert geprüft.
- In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
- GameActions schaltet das Fähigkeitsauswahlbit 0x80 um. Eine bereits ausgewählte Fähigkeit sendet ID 0 und deaktiviert sie; andernfalls werden beide Auswahlbits gelöscht, der ausgewählte ID wird gesendet und dann wird sein Bit lokal gesetzt. Daher kann ein erneuter Aufruf die Fähigkeit deaktivieren. Eine lokale Änderung bedeutet keinen erfolgreichen Treffer oder eine Serverbestä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.UsePrimaryAbility");
UO.UsePrimaryAbility();Parameter und Ablauf:
- Beschwört die Hauptfähigkeit der Waffe.
UO.UsePrimaryAbility();Parameter und Ablauf:
- UsePrimaryAbility überträgt GameActions.UsePrimaryAbility(_world) über Invoke. Es wird kein Annahmeschild zurückgegeben; Die aktive Fähigkeit wird gesondert geprüft.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}Parameter und Ablauf:
- In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UsePrimaryAbility();
UO.Print(UO.GetActiveAbility());
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
Interner Implementierungscode; kein eigenständiges Skript.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSecondaryAbility();Beschwört eine zusätzliche Waffenfähigkeit.
Es gibt keine Parameter.
void – kein Wert. Rufen Sie eine separate Leitung an; Der Abschluss bestätigt nicht die Aktion des Servers.
- UseSecondaryAbility überträgt GameActions.UseSecondaryAbility(_world) über Invoke. Es wird kein Annahmeschild zurückgegeben; Die aktive Fähigkeit wird gesondert geprüft.
- In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
- GameActions schaltet das Fähigkeitsauswahlbit 0x80 um. Eine bereits ausgewählte Fähigkeit sendet ID 0 und deaktiviert sie; andernfalls werden beide Auswahlbits gelöscht, der ausgewählte ID wird gesendet und dann wird sein Bit lokal gesetzt. Daher kann ein erneuter Aufruf die Fähigkeit deaktivieren. Eine lokale Änderung bedeutet keinen erfolgreichen Treffer oder eine Serverbestä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.UseSecondaryAbility");
UO.UseSecondaryAbility();Parameter und Ablauf:
- Beschwört eine zusätzliche Waffenfähigkeit.
UO.UseSecondaryAbility();Parameter und Ablauf:
- UseSecondaryAbility überträgt GameActions.UseSecondaryAbility(_world) über Invoke. Es wird kein Annahmeschild zurückgegeben; Die aktive Fähigkeit wird gesondert geprüft.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}Parameter und Ablauf:
- In den Beispielen gibt UO.Wait nur eine Skriptpause an; Das Ende der Pause beweist nicht, dass der Server die Anfrage abgeschlossen hat.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UseSecondaryAbility();
UO.Print(UO.GetActiveAbility());
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
Interner Implementierungscode; kein eigenständiges Skript.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WarMode();
void UO.WarMode(object? mode);Liest oder fragt den Kampfmodus des Charakters ab.
-
mode– Optionaler int: 0 deaktiviert, jeder Wert ungleich Null aktiviert. Das Formular ohne Argumente liest nur.
Keine Argumente Numerisches Flag int: 1 – aktueller Spieler im Kampfmodus, 0 – friedlicher Modus/kein Spieler. Im Modus - null gibt es kein Ergebnis.
- WarMode() liest Player.InWarMode lokal. WarMode(Modus) ruft GameActions.ToggleWarMode mit dem ausgewählten Modus auf; Ohne Player wird die Anfrage nicht ausgeführt.
- Weisen Sie das Ergebnis eines Formulars mit einem Argument nicht einer Variablen zu. Das sofortige erneute Lesen ist keine Online-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.
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.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));Parameter und Ablauf:
- Liest oder fragt den Kampfmodus des Charakters ab.
var active = UO.WarMode();
UO.Print(active);Parameter und Ablauf:
- WarMode() liest Player.InWarMode lokal. WarMode(Modus) ruft GameActions.ToggleWarMode mit dem ausgewählten Modus auf; Ohne Player wird die Anfrage nicht ausgeführt.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
return null;
}Parameter und Ablauf:
- Weisen Sie das Ergebnis eines Formulars mit einem Argument nicht einer Variablen zu. Das sofortige erneute Lesen ist keine Online-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()
{
var before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
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.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
Interner Implementierungscode; kein eigenständiges Skript.
public int WarMode() => bridge.WarMode();Parameter: mode (Integer)
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
Interner Implementierungscode; kein eigenständiges Skript.
public void WarMode(int mode) => bridge.WarMode(mode);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WarTargetID();Liest serial des letzten Angriffsziels.
Es gibt keine Parameter.
int – gespeichert serial; 0 bedeutet, dass serial nicht installiert ist. Es ist nicht bool und nicht graphic/type; ein ID ungleich Null existiert möglicherweise nicht mehr auf der Welt.
- Feldquelle: Brücke.LastAttack. Der Befehl wählt das Objekt nicht aus, verwendet es nicht und greift es auch nicht an.
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Liest serial des letzten Angriffsziels.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Parameter und Ablauf:
- Feldquelle: Brücke.LastAttack. Der Befehl wählt das Objekt nicht aus, verwendet es nicht und greift es auch nicht an.
return RunScenario();
object? RunScenario()
{
var id = UO.WarTargetID();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(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:
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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.WarTargetID();
UO.Wait(500);
var after = UO.WarTargetID();
UO.Print(before = after);
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: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Interner Implementierungscode; kein eigenständiges Skript.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ClassicUO — Bad Newbie & C# Scripts IDE