Repository navigation
DE UO Topic files json data
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen
Dateien, JSON, Arrays und Sammlungen C# und kompatible Helfer UO. Integrierte Funktionen C# werden ohne UO geschrieben.
| Thema | Befehle und Erklärungen |
|---|---|
| Datei | C# und Standardbibliothek |
| JSON Analysieren | C# und Standardbibliothek |
| JSON Laden | C# und Standardbibliothek)) |
| JSON Speichern | C# und Standardbibliothek |
| JSON Stringifizieren | C# und Standardbibliothek |
| Liste | C# und Standardbibliothek |
| Wörterbuch | C# und Standardbibliothek |
| Arrays | C# und Standardbibliothek · C# und Standardbibliothek |
| MemoryStream | C# und Standardbibliothek |
UO.GetArrayLength · UO.GetWord · UO.GetWordCount
C# und Standardbibliothek · C# und Standardbibliothek · C# und Standardbibliothek
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
dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
total += amounts[index];
}
return total;Parameter, Ergebnis und alle Szenarien
return ReadX("move 1445 1690");
dynamic ReadX(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return -1;
}
if (Truth(UO.GetWord(text, 0) != "move"))
{
return -1;
}
var xText = UO.GetWord(text, 1);
if (!(Truth(IsNumeric(xText))))
{
return -1;
}
var x = Convert.ToDouble(xText);
if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
{
return -1;
}
if (Truth(x != Math.Truncate(x)))
{
return -1;
}
return Convert.ToInt32(x);
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetArrayLength(object? arg);Zählt unmittelbare Array-Zellen für begrenzte Iteration und sicheres Lesen des Index.
int >= 0. Ein leeres Array und ein Wert einer anderen Art ergeben 0: Das Ergebnis allein kann den Typ nicht überprüfen. Dies ist eine Größe, nicht bool und nicht der letzte Index.
- Lokale Prüfung: sendet keine Anfrage an den Server, verschiebt keine Elemente und ändert das Array nicht. Die Beispiele enthalten Trainingsdaten, kein Live-Inventar.
- Überprüft den Werttyp und liest Array.Length ohne Durchlaufen oder Summieren. Durch die Deklaration der Variablenwerte (2) werden drei Zellen mit den Indizes 0..2 erstellt, einschließlich leerer Zellen.
- Verschachtelte Elemente werden nicht rekursiv gezählt. Für einen String gibt es Len, für List/Dictionary gibt es deren Count. UO.GetArrayLength ist ein kompatibler Name für dieselbe lokale Prüfung.
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.GetArrayLength(new[] { 10, 20, 30 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Durch die Deklaration der variablen Beträge (2) werden drei Einträge erstellt. Die Schleife iteriert über die Indizes 0..2 und gibt 150 zurück. Die Mengen werden zyklusweise addiert, nicht per ArrayLength.
- Lokale Prüfung: sendet keine Anfrage an den Server, verschiebt keine Elemente und ändert das Array nicht. Die Beispiele enthalten Trainingsdaten, kein Live-Inventar.
dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
total += amounts[index];
}
return total;Parameter und Ablauf:
- Es gibt zwei Array-Punkte in der Route mit jeweils drei Koordinatenzellen. Das Ergebnis ist 2|3, nicht sechs. Der Charakter bewegt sich nicht.
- Lokale Prüfung: sendet keine Anfrage an den Server, verschiebt keine Elemente und ändert das Array nicht. Die Beispiele enthalten Trainingsdaten, kein Live-Inventar.
return RunScenario();
object? RunScenario()
{
dynamic[] first = new dynamic[checked((int)(2) + 1)];
first[0] = 100;
first[1] = 200;
first[2] = 0;
dynamic[] second = new dynamic[checked((int)(2) + 1)];
second[0] = 101;
second[1] = 200;
second[2] = 0;
dynamic[] route = new dynamic[checked((int)(1) + 1)];
route[0] = first;
route[1] = second;
return Convert.ToString(UO.GetArrayLength(route)) + "|" + Convert.ToString(UO.GetArrayLength(route[0]));
return null;
}Parameter und Ablauf:
- Die Zeile ergibt 0; Main gibt keine Route zurück, bevor auf den Index zugegriffen wird. Die Prüfung eignet sich auch für ein leeres Array, unterscheidet jedoch nicht zwischen diesen Fällen.
- Lokale Prüfung: sendet keine Anfrage an den Server, verschiebt keine Elemente und ändert das Array nicht. Die Beispiele enthalten Trainingsdaten, kein Live-Inventar.
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 route = "not an array";
if (Truth(UO.GetArrayLength(route) == 0))
{
return "no route";
}
return route[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;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: arg (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
public static InjectionValue GetArrayLength(InjectionValue arg) => arg.Kind==InjectionValueKind.Array?new InjectionValue(arg.Array.Length):InjectionValue.Zero;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetWord(object? value, object? wordIndex);
string UO.GetWord(object? value, object? wordIndex, object? delimiter);Ruft ein einzelnes Wort oder Feld aus Text ab. Nützlich zum Parsen von Koordinaten, einer Prioritätenliste oder gespeicherten Skripteinstellungen.
-
value– Quellzeichenfolge. Die Funktion analysiert genau den übertragenen Text: Sie liest nicht selbstständig das Magazin, die Datei, das Gerät oder die Welt. -
wordIndex– Gesamtindex des Wortes aus 0: 0 ist das erste, 1 ist das zweite. Ein negativer Index und ein Index, der nicht kleiner als die Anzahl der Wörter ist, geben eine leere Zeichenfolge zurück. -
delimiter– Optionales Trennzeichen. Ohne es, mit „“ oder mit einem einzelnen Leerzeichen „ “ wird der Text durch alle Unicode-Leerzeichen, einschließlich Tabulatoren und Zeilenumbrüche, geteilt. Ein weiteres Trennzeichen ist die genaue Reihenfolge in ihrer Gesamtheit: „::“ bedeutet zwei Doppelpunkte hintereinander, nicht jeder Doppelpunkt. Leere Teile werden entsorgt; Nicht leere Teile werden nicht beschnitten.
string – ausgewählter nicht leerer Teil oder „“, wenn kein Index vorhanden ist. Dies ist Text, nicht ID, type oder eine Zahl: Für eine Zahl kreuzen Sie IsNumeric separat an und konvertieren Sie den Wert.
- Funktioniert lokal, ohne Pakete oder Spielaktionen. GetWord und UO.GetWord rufen denselben Handler auf; GetWordCount und UO.GetWordCount sind ebenfalls gleich. Bei jedem Aufruf wird der gesamte Text neu aufgeteilt. Speichern Sie in der Schleife die Menge im Voraus. Für große wiederholte Parsingvorgänge ist es besser, bereits analysierte Felder in einem Array zu speichern. Dies ist kein CSV-Parser: Anführungszeichen schützen keine Trennzeichen, leere Spalten gehen verloren.
- GetWord · GetWordCount · IsNumeric
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.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));Parameter und Ablauf:
- ReadX empfängt die Zeichenfolge „move 1445 1690“. Testet drei Wörter und den Namenszug; Index 1 wählt X aus. IsNumeric prüft den Text, Konvertieren. ToInt32 gibt 1445 zurück. Dies ist nur eine Aufschlüsselung des Setups; Der Charakter bewegt sich nicht. Wenn das Formular falsch ist, wird -1 zurückgegeben.
- ReadX erfordert außerdem das gesamte X im Bereich 0..65535 vor Convert.ToInt32; NaN, Unendlich und gebrochenes X werden abgelehnt. Y wird hier nicht getestet.
return ReadX("move 1445 1690");
dynamic ReadX(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return -1;
}
if (Truth(UO.GetWord(text, 0) != "move"))
{
return -1;
}
var xText = UO.GetWord(text, 1);
if (!(Truth(IsNumeric(xText))))
{
return -1;
}
var x = Convert.ToDouble(xText);
if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
{
return -1;
}
if (Truth(x != Math.Truncate(x)))
{
return -1;
}
return Convert.ToInt32(x);
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
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:
- PriorityAt erhält die Liste „mage||tank|archer|“ and index=1. Separator | verwirft leere Elemente, das Ergebnis ist also tank. Names are arbitrary; hier wird weder ClassMask registriert noch die Kleidung überprüft. Verwenden Sie beim Zählen und Auswählen dieselben Teilungsregeln.
return RunScenario();
object? RunScenario()
{
return PriorityAt("mage||tank|archer|", 1);
return null;
}
dynamic PriorityAt(dynamic names, dynamic index)
{
return UO.GetWord(names, index, "|");
}Parameter und Ablauf:
- ReadPlace teilt „Britain::Bank:west“ mit dem genauen Trennzeichen ::. Der Index 1 gibt Bank:west zurück und lässt den inneren einzelnen Doppelpunkt übrig. Wenn es nicht genau zwei nicht leere Teile gibt, gibt der Helfer „“ zurück. Freiräume um Teile herum bleiben erhalten.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return ReadPlace("Britain::Bank:west");
return null;
}
dynamic ReadPlace(dynamic text)
{
if (Truth(UO.GetWordCount(text, "::") != 2))
{
return "";
}
return UO.GetWord(text, 1, "::");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: value (String), wordIndex (Integer)
Ergebnis: string / String.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.GetWord:GetWord(value,wordIndex," ").
Interner Implementierungscode; kein eigenständiges Skript.
private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");Parameter: value (String), wordIndex (Integer), delimiter (String)
Ergebnis: string / String.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
Interner Implementierungscode; kein eigenständiges Skript.
private static string GetWord(string value,int wordIndex,string delimiter)
{
var words=SplitWords(value,delimiter);return wordIndex>=0&&wordIndex<words.Length?words[wordIndex]:string.Empty;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetWordCount(object? value);
int UO.GetWordCount(object? value, object? delimiter);Zählt nicht leere Textfelder. Ermöglicht Ihnen, die Anzahl der Koordinaten vor dem Parsen zu überprüfen und die Grenzen der Aufzählung der Liste zu bestimmen.
-
value– Quellzeichenfolge. Die Funktion analysiert genau den übertragenen Text: Sie liest nicht selbstständig das Magazin, die Datei, das Gerät oder die Welt. -
delimiter– Optionales Trennzeichen. Ohne es, mit „“ oder mit einem einzelnen Leerzeichen „ “ wird der Text durch alle Unicode-Leerzeichen, einschließlich Tabulatoren und Zeilenumbrüche, geteilt. Ein weiteres Trennzeichen ist die genaue Reihenfolge in ihrer Gesamtheit: „::“ bedeutet zwei Doppelpunkte hintereinander, nicht jeder Doppelpunkt. Leere Teile werden entsorgt; Nicht leere Teile werden nicht beschnitten.
int – Anzahl der nicht leeren Teile. Eine leere Zeichenfolge und eine nur durch Trennzeichen getrennte Zeichenfolge ergeben 0. Dies ist ein Zähler, nicht bool: 2 ist ebenfalls ein gültiges Ergebnis; Überprüfen Sie die Anzahl > 0 oder die genaue Menge, die Sie benötigen.
- Funktioniert lokal, ohne Pakete oder Spielaktionen. GetWord und UO.GetWord rufen denselben Handler auf; GetWordCount und UO.GetWordCount sind ebenfalls gleich. Bei jedem Aufruf wird der gesamte Text neu aufgeteilt. Speichern Sie in der Schleife die Menge im Voraus. Für große wiederholte Parsingvorgänge ist es besser, bereits analysierte Felder in einem Array zu speichern. Dies ist kein CSV-Parser: Anführungszeichen schützen keine Trennzeichen, leere Spalten gehen verloren.
- GetWord · GetWordCount · IsNumeric
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.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));Parameter und Ablauf:
- HasPoint akzeptiert „1445 1690 0“. Erfordert jeweils genau drei Wörter und numerischen Text und gibt dann 1 zurück; andernfalls 0. Dabei handelt es sich lediglich um eine Prüfung der Form, nicht aber der Gültigkeit der Karte, der Koordinatengrenzen oder der Passierbarkeit. GetWordCount gibt hier 3 zurück und bool wird von unserem Helfer zurückgegeben.
- HasPoint lehnt zusätzlich NaN und Unendlichkeiten ab, die IsNumeric selbst akzeptieren kann. Gebrochene endliche Zahlen sind zulässig; Vor der Bewegung ist eine gesonderte Überprüfung der gesamten Spielkoordinaten erforderlich.
return HasPoint("1445 1690 0");
dynamic HasPoint(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return 0;
}
var i = 0;
while (Truth(i < 3))
{
if (!(Truth(IsNumeric(UO.GetWord(text, i)))))
{
return 0;
}
var value = Convert.ToString(Convert.ToDouble(UO.GetWord(text, i)));
if (Truth(value == "NaN") || Truth(value == "Infinity") || Truth(value == "-Infinity"))
{
return 0;
}
i = i + 1;
}
return 1;
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
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:
- JoinPriorities erhält „mage||tank|archer|“. Zählt drei nicht leere Elemente einmal, durchläuft die Indizes 0..2 und gibt „Magier > Panzer > Bogenschütze“ zurück. Anfang, Ende und Wiederholung | Erstellen Sie keine separate Priorität.
return RunScenario();
object? RunScenario()
{
return JoinPriorities("mage||tank|archer|");
return null;
}
dynamic JoinPriorities(dynamic names)
{
var count = UO.GetWordCount(names, "|");
var i = 0;
var result = "";
while (Truth(i < count))
{
if (Truth(i > 0))
{
result = result + " > ";
}
result = result + UO.GetWord(names, i, "|");
i = i + 1;
}
return result;
}
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:
- CountPlaces erhält „Britain::Bank:west::“. Das ::-Trennzeichen ergibt zwei Felder, das abschließende leere Feld wird entfernt: Das Ergebnis ist 2. Single: Bank:west teilt den Text nicht auf. Dies ist keine Liste der Städte des Clients, sondern ein Beispiel für Ihr Setup-Format.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return CountPlaces("Britain::Bank:west::");
return null;
}
dynamic CountPlaces(dynamic text)
{
return UO.GetWordCount(text, "::");
}
}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 (String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.GetWordCount:GetWordCount(value," ").
Interner Implementierungscode; kein eigenständiges Skript.
private static int GetWordCount(string value) => GetWordCount(value," ");Parameter: value (String), delimiter (String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
Interner Implementierungscode; kein eigenständiges Skript.
private static int GetWordCount(string value,string delimiter) => SplitWords(value,delimiter).Length;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Random(object? max);
int UO.Random(object? min, object? max);Gibt eine zufällige Ganzzahl zurück. Die neue Form UO.Random(min, max) wählt die Zahl VON min BIS max. einschließlich aus. Die bisherige Form UO.Random(max) bleibt erhalten: Es wird von 0 bis max−1 ausgewählt. Das Ergebnis kann in einer Variablen gespeichert und als Verzögerung, Koordinate, Index oder Bedingung verwendet werden.
-
min– Das erste Argument der Zwei-Argument-Form ist NUR die untere Grenze, eine ganze Zahl von −2147483648 bis 2147483647. Kann negativ, null oder positiv sein. Sollte nicht mehr als max. In der Ein-Argument-Form gibt es kein Minimum und die übergebene Zahl bedeutet Maximum. -
max– In Form mit zwei Argumenten das zweite Argument, die enthaltene Obergrenze int von −2147483648 bis 2147483647. In der früheren Ein-Argument-Form ein einzelnes Argument, AUSGESCHLOSSENE Obergrenze, eine ganze Zahl von 0 bis 2147483647; Random(0) gibt 0 zurück. Ein negatives Maximum in Ein-Argument-Form ist nicht zulässig.
int ist eine pseudozufällige Ganzzahl. Mit zwei Argumenten min ≤ result ≤ max; beide Ränder können herausfallen. Mit einem positiven Argument 0 ≤ Ergebnis < max. Die Wiederholung einer zuvor gezogenen Zahl ist akzeptabel: Das Team wählt keine Zahlen ohne Wiederholungen aus.
- Es werden genau zwei Formen unterstützt: UO.Random(max) und UO.Random(min, max). Ein Anruf ohne Argumente wird nicht registriert. Verwenden Sie für einen „von“- und „bis“-Bereich zwei Argumente.
- Random(5, 5) gibt immer 5 zurück. Random(10, 1) meldet einen Bereichsfehler: Grenzen werden nicht stillschweigend ausgetauscht. Random(-10, -1) ist korrekt, da −10 kleiner als −1 ist.
- Beide Grenzen sind ganze Zahlen int; Für Dezimalbrüche können Sie ganze Einheiten der gewünschten Skala auswählen und dann dividieren. Beispielsweise gibt Random(0, 100) / 100.0 diskrete Werte von 0 bis 1 in Schritten von 0,01 an.
- Der gesamte Bereich von Random(-2147483648, 2147483647) ist akzeptabel. Die Implementierung fügt 1 nicht zu max in int hinzu und führt daher nicht zu einem Überlauf an der Obergrenze. Bei großen Bereichen werden zusätzliche Werte verworfen, damit der Rest der Division die Auswahl nicht verzerrt.
- Der Anruf berechnet die Nummer lokal, sendet keine Pakete und pausiert selbst nicht. Für eine zufällige Pause übergeben Sie das Ergebnis an UO.Wait. Ihr Skript sollte die vom Server geforderte Mindestlatenz einhalten.
- Speichern Sie das Ergebnis in var, wenn Sie dieselbe Zahl mehrmals benötigen. Zwei separate Aufrufe von Random können unterschiedliche Werte zurückgeben. Der Befehl prüft nicht, ob das ausgewählte Feld für Bewegung oder Transfer gültig ist: Dies wird durch den entsprechenden Spielbefehl überprüft.
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.Random(10);
UO.Print("Random: " + Convert.ToString(result));Parameter und Ablauf:
- Min wird niedriger =1, Max wird höher =6. Es gibt genau sechs mögliche Werte: 1, 2, 3, 4, 5 und 6.
- Roll speichert eine empfangene Nummer. Print zeigt genau dies an; Convert.ToString konvertiert int in einen String. Wenn Sie es erneut ausführen, wird möglicherweise dieselbe Nummer angezeigt.
var lower = 1;
var upper = 6;
var roll = UO.Random(lower, upper);
UO.Print("Roll: " + Convert.ToString(roll));Parameter und Ablauf:
- min=350 und max=700 definieren die aktivierten Verzögerungsgrenzen. Das Ergebnis, beispielsweise 350, 512 oder 700, wird in die Verzögerung geschrieben.
- UO.Wait empfängt ein Verzögerungsargument in Millisekunden. Die Pause erfolgt in UO.Wait; Random berechnet nur die Zahl.
- Wählen Sie die Untergrenze basierend auf den Aktionen und Anforderungen Ihres Servers. Die zufällige Verzögerung ersetzt nicht das Warten auf die Antwort des Servers, wenn die nächste Aktion diese Antwort erfordert.
return RunScenario();
object? RunScenario()
{
var delay = UO.Random(350, 700);
UO.Print("Waiting " + Convert.ToString(delay) + " ms");
UO.Wait(delay);
UO.Print("Wait finished");
return null;
}Parameter und Ablauf:
- min=1, max=3: Auswahl ist 1, 2 oder 3. Jeder Zweig entspricht einer der gültigen Nummern.
- Der Aufruf von Random wird einmal vor dem if ausgeführt. Wenn Sie es in jeder Bedingung erneut aufrufen, handelt es sich um unterschiedliche Wahlen.
- Ersetzen Sie Print durch die gewünschten Aktionen in Ihrem Skript und behalten Sie die Bedingung, den Bereich und die Serverantwortprüfungen für diese Aktionen bei.
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 choice = UO.Random(1, 3);
if (Truth(choice == 1))
{
UO.Print("First action");
}
else
{
if (Truth(choice == 2))
{
UO.Print("Second action");
}
else
{
UO.Print("Third action");
}
}
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:
- Erstes Random: min=50, max=90, Ergebnis x. Zweitens: min=60, max=100, Ergebnis y. Dies sind zwei unabhängige Koordinaten innerhalb des Containers, keine Bildschirmkoordinaten oder Kartenkoordinaten.
- In MassMove Verzögerung=350 ms, Menge=10 ganzzahlige Elemente, type=0 wird durch die erste manuelle Übertragung bestimmt, Ziel=backpack, x/y werden aus den Variablen übernommen, z=0.
- Ziehen Sie nach dem Befehl das Sample mit der Maus aus dem Originalcontainer. Diese gesamte Einbeziehung von MassMove verwendet eine ausgewählte Position. Das Randomisieren der Position jedes einzelnen Elements erfordert eine Schleife mit separatem MoveItem und nicht einen einzelnen Aufruf von MassMove.
- Wählen Sie den X/Y-Bereich innerhalb des verfügbaren Bereichs Ihres Rucksacks. Der Server kann die Platzierung von Elementen ändern.
var x = UO.Random(50, 90);
var y = UO.Random(60, 100);
UO.MassMove(350, 10, 0, "backpack", x, y, 0);
UO.Print("Drag a source item; position: " + Convert.ToString(x) + ", " + Convert.ToString(y));Parameter und Ablauf:
- In beiden Aufrufen sind min=−2 und max=2: −2, −1, 0, 1, 2 möglich. GetX/GetY liest die Koordinaten des Zeichens ohne Argumente.
- x/y ist nur eine berechnete Zelle in einem Quadrat um das Zeichen. In diesem Beispiel werden keine Objekte bewegt oder geworfen.
- Eine zufällige Zelle kann unpassierbar sein oder sich außerhalb der Kartengrenze befinden. Führen Sie vor Spielhandlungen entsprechende Koordinaten- und Streckenkontrollen durch.
return RunScenario();
object? RunScenario()
{
var offsetX = UO.Random(-2, 2);
var offsetY = UO.Random(-2, 2);
var x = UO.GetX() + offsetX;
var y = UO.GetY() + offsetY;
UO.Print("Candidate tile: " + Convert.ToString(x) + ", " + Convert.ToString(y));
return null;
}Parameter und Ablauf:
- In Random(count) gibt es nur max=10: keine Obergrenze, 0..9 möglich. Die Nummer 10 erscheint nicht.
- In Random(0, count−1) min=0 und max=9 einschließlich: Der gültige Bereich ist derselbe, aber der Aufruf trifft eine neue unabhängige Auswahl.
- count muss für die Indexauswahl positiv sein. Der spezielle kompatible Fall Random(0)=0 bedeutet nicht, dass die leere Sammlung ein Element am Index 0 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()
{
var count = 10;
var index = UO.Random(count);
var equivalent = UO.Random(0, count - 1);
UO.Print("Index 0..9: " + Convert.ToString(index));
UO.Print("Another independent index: " + Convert.ToString(equivalent));
return null;
}
}Parameter und Ablauf:
- min=7 und max=7 ergeben ein einzelnes Ergebnis 7.
- min=−100 und max=−50 ergeben nur negative Zahlen, einschließlich beider Grenzen.
- Der letzte Aufruf deckt das gesamte vorzeichenbehaftete 32-Bit int ab. Das Ergebnis kann positiv, negativ oder Null sein.
- Grenzen werden vom Kleinen zum Größeren weitergegeben. Der fehlerhafte Aufruf von Random(10, 1) stoppt mit der Meldung min darf max nicht überschreiten; Es muss nicht für einen invertierten Bereich verwendet werden.
var fixedValue = UO.Random(7, 7);
var negative = UO.Random(-100, -50);
var signedValue = UO.Random(-2147483648, 2147483647);
UO.Print("Fixed: " + Convert.ToString(fixedValue));
UO.Print("Negative: " + Convert.ToString(negative));
UO.Print("Signed Integer: " + Convert.ToString(signedValue));C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: max (Integer)
Ergebnis: int / Integer.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
public int Random(int max)
{
lock (randomSync) return random.Next(max);
}Parameter: min (Integer), max (Integer)
Ergebnis: int / Integer.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
public int Random(int min, int max)
{
if (min > max)
throw new NativeSubrutineException("UO.Random(min, max): min must not exceed max.");
if (min == max) return min;
long count = (long)max - min + 1;
lock (randomSync)
{
if (count <= int.MaxValue)
return (int)(min + (long)random.Next((int)count));
// Inclusive Int32.MaxValue and the full signed range must not
// overflow. Rejection avoids modulo bias; reuse the four bytes.
const ulong domain = 1UL << 32;
ulong limit = domain - domain % (ulong)count;
uint sample;
do
{
random.NextBytes(randomRangeBytes);
sample = BitConverter.ToUInt32(randomRangeBytes, 0);
} while (sample >= limit);
return (int)(min + (long)(sample % (ulong)count));
}
}ClassicUO — Bad Newbie & C# Scripts IDE