Repository navigation
FR UO Topic files json data
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Accueil · C# · IDE · UO API · A–Z · Exemples · Langues
Fichiers, JSON, tableaux et collections C# et assistants compatibles UO. Les fonctions intégrées C# sont écrites sans UO.
| Sujet | Commandes et explications |
|---|---|
| Fichier | C# et bibliothèque standard |
| JSON Analyser | C# et bibliothèque standard |
| JSON Charger | C# et bibliothèque standard)) |
| JSON Enregistrer | C# et bibliothèque standard |
| JSON Stringifier | C# et bibliothèque standard |
| Liste | C# et bibliothèque standard |
| Dictionnaire | C# et bibliothèque standard |
| Tableaux | C# et bibliothèque standard · C# et bibliothèque standard |
| MemoryStream | C# et bibliothèque standard |
UO.GetArrayLength · UO.GetWord · UO.GetWordCount
C# et bibliothèque standard · C# et bibliothèque standard · C# et bibliothèque standard
Chaque carte de commande possède plusieurs scénarios indépendants : code direct, fonctions et classes. Vous trouverez ci-dessous une sélection de courts scénarios ; des restrictions et une analyse complète sont à prévoir.
Paramètres, résultat et tous les scénarios
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;Paramètres, résultat et tous les scénarios
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);Compte les cellules du tableau immédiat pour une itération limitée et une lecture d'index sécurisée.
int >= 0. Un Array vide et une valeur d'un autre type donnent 0 : le résultat seul ne peut pas vérifier le type. Il s'agit d'une quantité, pas de bool ni du dernier indice.
- Vérification locale : n'envoie pas de requête au serveur, ne déplace pas les éléments et ne modifie pas le tableau. Les exemples contiennent des données de formation, pas un inventaire en direct.
- Vérifie le type de valeur et lit Array.Length sans parcourir ni additionner. déclarer les valeurs des variables (2) crée trois cellules, index 0..2, y compris les vides.
- Les éléments imbriqués ne sont pas comptés de manière récursive. Pour une chaîne, il y a Len, pour List/Dictionary, il y a leur Count. UO.GetArrayLength est un nom compatible pour le même chèque local.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetArrayLength(new[] { 10, 20, 30 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- déclarer les montants variables (2) crée trois entrées. La boucle parcourt les indices 0..2 et renvoie 150. Les quantités sont ajoutées par cycle et non par ArrayLength.
- Vérification locale : n'envoie pas de requête au serveur, ne déplace pas les éléments et ne modifie pas le tableau. Les exemples contiennent des données de formation, pas un inventaire en direct.
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;Paramètres et déroulement de l’exécution :
- Il y a deux points du tableau sur l'itinéraire, chacun avec trois cellules de coordonnées. Le résultat est 2|3, pas six. Le personnage ne bouge pas.
- Vérification locale : n'envoie pas de requête au serveur, ne déplace pas les éléments et ne modifie pas le tableau. Les exemples contiennent des données de formation, pas un inventaire en direct.
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;
}Paramètres et déroulement de l’exécution :
- La ligne donne 0 ; Main ne renvoie aucune route avant d'accéder à l'index. La vérification convient également à un tableau vide, mais ne fait pas de distinction entre ces cas.
- Vérification locale : n'envoie pas de requête au serveur, ne déplace pas les éléments et ne modifie pas le tableau. Les exemples contiennent des données de formation, pas un inventaire en direct.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: arg (Any)
Résultat: dynamic / Any.
Pendant un appel:
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Obtient un seul mot ou champ à partir du texte. Utile pour analyser les coordonnées, une liste de priorités ou les paramètres de script enregistrés.
-
value— Chaîne source. La fonction analyse exactement le texte transmis : elle ne lit pas seule le magazine, le fichier, l'équipement ou le monde. -
wordIndex— Index entier du mot de 0 : 0 est le premier, 1 est le second. Un index négatif et un index non inférieur au nombre de mots renvoient une chaîne vide. -
delimiter— Délimiteur facultatif. Sans cela, avec "" ou avec un seul espace " ", le texte est divisé par tous les caractères d'espacement Unicode, y compris les tabulations et les nouvelles lignes. Un autre délimiteur est la séquence exacte dans son intégralité : "::" signifie deux deux-points d'affilée, pas tous les deux-points. Les pièces vides sont jetées ; les parties non vides ne sont pas tronquées.
string — la partie non vide sélectionnée, ou "" s'il n'y a pas d'index. Il s'agit d'un texte, pas de ID, d'un type ou d'un nombre : pour le nombre, vérifiez IsNumeric séparément et convertissez la valeur.
- Fonctionne localement, sans packages ni actions de jeu. GetWord et UO.GetWord appellent le même gestionnaire ; GetWordCount et UO.GetWordCount sont également identiques. Chaque appel divise à nouveau l'intégralité du texte. Dans la boucle, enregistrez la quantité à l'avance ; Pour une analyse répétée et volumineuse, il est préférable de stocker les champs déjà analysés dans un tableau. Ce n'est pas un analyseur CSV : les guillemets ne protègent pas les délimiteurs, les colonnes vides sont perdues.
- GetWord · GetWordCount · IsNumeric
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- ReadX reçoit la chaîne "move 1445 1690". Teste trois mots et le nom bouge ; l'index 1 sélectionne X. IsNumeric vérifie le texte, Convertir. ToInt32 renvoie 1445. Ceci est juste une ventilation de la configuration ; le personnage ne bouge pas. Si le formulaire est incorrect, -1 est renvoyé.
- ReadX nécessite également l'intégralité de X dans la plage 0..65535 avant Convert.ToInt32 ; NaN, l'infini et le fractionnaire X sont rejetés. Y n'est pas testé ici.
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;Paramètres et déroulement de l’exécution :
- PriorityAt obtient la liste "mage||tank|archer|" et index=1. Séparateur | supprime les éléments vides, le résultat est donc un réservoir. Les noms sont arbitraires ; ici, ils n'enregistrent pas ClassMask et ne vérifient pas les vêtements. Utilisez les mêmes règles de division lors du comptage et de la sélection.
return RunScenario();
object? RunScenario()
{
return PriorityAt("mage||tank|archer|", 1);
return null;
}
dynamic PriorityAt(dynamic names, dynamic index)
{
return UO.GetWord(names, index, "|");
}Paramètres et déroulement de l’exécution :
- ReadPlace divise "Britain::Bank:west" avec le délimiteur exact ::. L'index 1 renvoie Bank:west, en laissant les deux points internes. S'il n'y a pas exactement deux parties non vides, l'assistant renvoie "". Les espaces autour des pièces sont préservés.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: value (String), wordIndex (Integer)
Résultat: string / String.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.GetWord:GetWord(value,wordIndex," ").
Code interne de l’implémentation ; ce n’est pas un script autonome.
private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");Paramètres: value (String), wordIndex (Integer), delimiter (String)
Résultat: string / String.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Compte les champs de texte non vides. Vous permet de vérifier le nombre de coordonnées avant l'analyse et de déterminer les limites d'énumération de la liste.
-
value— Chaîne source. La fonction analyse exactement le texte transmis : elle ne lit pas seule le magazine, le fichier, l'équipement ou le monde. -
delimiter— Délimiteur facultatif. Sans cela, avec "" ou avec un seul espace " ", le texte est divisé par tous les caractères d'espacement Unicode, y compris les tabulations et les nouvelles lignes. Un autre délimiteur est la séquence exacte dans son intégralité : "::" signifie deux deux-points d'affilée, pas tous les deux-points. Les pièces vides sont jetées ; les parties non vides ne sont pas tronquées.
int — nombre de pièces non vides. Une chaîne vide et une chaîne délimitée uniquement donnent 0. Il s'agit d'un compteur, pas de bool : 2 est également un résultat valide ; vérifiez le nombre > 0 ou la quantité exacte dont vous avez besoin.
- Fonctionne localement, sans packages ni actions de jeu. GetWord et UO.GetWord appellent le même gestionnaire ; GetWordCount et UO.GetWordCount sont également identiques. Chaque appel divise à nouveau l'intégralité du texte. Dans la boucle, enregistrez la quantité à l'avance ; Pour une analyse répétée et volumineuse, il est préférable de stocker les champs déjà analysés dans un tableau. Ce n'est pas un analyseur CSV : les guillemets ne protègent pas les délimiteurs, les colonnes vides sont perdues.
- GetWord · GetWordCount · IsNumeric
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- HasPoint accepte "1445 1690 0". Nécessite exactement trois mots et un texte numérique dans chacun, puis renvoie 1 ; sinon 0. Il s'agit uniquement d'un contrôle de forme, et non de la validité de la carte, des limites de coordonnées ou de la praticabilité. GetWordCount renvoie ici 3 et bool est renvoyé par notre assistant.
- HasPoint rejette en outre NaN et les infinis, que IsNumeric lui-même peut accepter. Les nombres finis fractionnaires sont autorisés ; Avant le mouvement, une vérification séparée de l'ensemble des coordonnées du jeu est requise.
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;Paramètres et déroulement de l’exécution :
- JoinPriorities obtient "mage||tank|archer|". Compte une fois trois éléments non vides, parcourt les indices 0..2 et renvoie "mage > tank > archer". Début, fin et répétition | ne créez pas de priorité distincte.
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;Paramètres et déroulement de l’exécution :
- CountPlaces obtient "Britain::Bank:west::". Le séparateur :: donne deux champs, le champ vide de fin est supprimé : le résultat est 2. Unique : Bank:west ne divise pas le texte à l'intérieur. Il ne s'agit pas d'une liste de villes du client, mais d'un exemple de votre format de configuration.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: value (String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.GetWordCount:GetWordCount(value," ").
Code interne de l’implémentation ; ce n’est pas un script autonome.
private static int GetWordCount(string value) => GetWordCount(value," ");Paramètres: value (String), delimiter (String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Renvoie un entier aléatoire. La nouvelle forme UO.Random(min, max) sélectionne le nombre FROM min TO max inclus. La forme précédente UO.Random(max) est conservée : elle sélectionne de 0 à max−1. Le résultat peut être stocké dans une variable et utilisé comme délai, coordonnée, index ou condition.
-
min— Le premier argument de la forme à deux arguments SEULEMENT est la limite inférieure incluse, un entier de −2147483648 à 2147483647. Peut être négatif, nul ou positif. Ne devrait pas dépasser le maximum. Dans la forme à un argument, il n'y a pas de minimum et le nombre transmis signifie maximum. -
max— Sous forme de deux arguments, le deuxième argument, y compris la limite supérieure int de −2147483648 à 2147483647. Dans l'ancienne forme à un argument, un seul argument, EXCLU limite supérieure, un entier de 0 à 2147483647 ; Random(0) renvoie 0. Un maximum négatif sous forme d’un seul argument n’est pas autorisé.
int est un entier pseudo-aléatoire. Avec deux arguments min ≤ résultat ≤ max ; les deux frontières peuvent tomber. Avec un argument positif 0 ≤ résultat < max. La répétition d'un numéro tiré précédemment est acceptable : l'équipe ne sélectionne pas de numéros sans répétitions.
- Exactement deux formulaires sont pris en charge : UO.Random(max) et UO.Random(min, max). Un appel sans arguments n'est pas enregistré. Pour une plage « de et vers », utilisez deux arguments.
- Random(5, 5) renvoie toujours 5. Random(10, 1) signale une erreur de plage : les limites ne sont pas échangées silencieusement. Random(-10, -1) est correct car −10 est inférieur à −1.
- Les deux frontières sont des entiers int ; pour les fractions décimales, vous pouvez sélectionner des unités entières de l'échelle souhaitée, puis les diviser. Par exemple, Random(0, 100) / 100.0 donne des valeurs discrètes de 0 à 1 par incréments de 0,01.
- La gamme complète de Random(-2147483648, 2147483647) est acceptable. L'implémentation n'ajoute pas 1 à max int et ne déborde donc pas à la limite supérieure. Pour les plages larges, la suppression des valeurs supplémentaires est utilisée afin que le reste de la division ne biaise pas la sélection.
- L'appel calcule le numéro localement, n'envoie pas de paquets et ne se met pas en pause. Pour une pause aléatoire, transmettez le résultat à UO.Wait. Votre script doit maintenir la latence minimale requise par le serveur.
- Stockez le résultat dans var si vous avez besoin du même nombre plusieurs fois. Deux appels distincts à Random peuvent renvoyer des valeurs différentes. La commande ne vérifie pas si la case sélectionnée est valable pour le déplacement ou le transfert : ceci est vérifié par la commande de jeu correspondante.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.Random(10);
UO.Print("Random: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- min devient inférieur = 1, max devient supérieur = 6. Il y a exactement six valeurs possibles : 1, 2, 3, 4, 5 et 6.
- roll stocke un numéro reçu. Print affiche exactement ceci ; Convert.ToString convertit int en chaîne. L'exécuter à nouveau peut donner le même numéro.
var lower = 1;
var upper = 6;
var roll = UO.Random(lower, upper);
UO.Print("Roll: " + Convert.ToString(roll));Paramètres et déroulement de l’exécution :
- min=350 et max=700 définissent les limites de délai activées. Le résultat, tel que 350, 512 ou 700, est écrit dans un délai.
- UO.Wait reçoit un argument de retard en millisecondes. La pause se produit à UO.Wait ; Random calcule uniquement le nombre.
- Choisissez la limite inférieure en fonction des actions et des exigences de votre serveur. Le délai aléatoire ne remplace pas l'attente que le serveur réponde si l'action suivante nécessite cette réponse.
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;
}Paramètres et déroulement de l’exécution :
- min=1, max=3 : le choix est 1, 2 ou 3. Chaque branche correspond à l'un des numéros valides.
- L'appel à Random est exécuté une fois avant le if. Si vous le rappelez dans chaque condition, ce seront des élections différentes.
- Remplacez Print par les actions souhaitées dans votre script, en conservant les vérifications de condition, de plage et de réponse du serveur pour ces actions.
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;
}Paramètres et déroulement de l’exécution :
- Premier Random : min=50, max=90, résultat x. Deuxièmement : min=60, max=100, résultat y. Il s'agit de deux coordonnées indépendantes à l'intérieur du conteneur, et non de coordonnées d'écran ou de coordonnées de carte.
- Dans MassMove delay=350 ms, quantité=10 éléments entiers, type=0 est déterminé par le premier transfert manuel, destination=backpack, x/y sont extraits des variables, z=0.
- Après la commande, faites glisser l'échantillon avec la souris depuis le conteneur d'origine. Toute cette inclusion de MassMove utilise une position sélectionnée. La randomisation de la position de chaque élément individuel nécessite une boucle avec MoveItem séparé plutôt qu'un seul appel à MassMove.
- Sélectionnez la plage X/Y dans la zone disponible de votre sac à dos. Le serveur peut modifier l'emplacement des éléments.
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));Paramètres et déroulement de l’exécution :
- Dans les deux appels min=−2 et max=2 : −2, −1, 0, 1, 2 sont possibles. GetX/GetY lit les coordonnées du personnage sans arguments.
- x/y est juste une cellule calculée dans un carré autour du caractère. Cet exemple ne démarre pas le mouvement ni ne lance d'objets.
- Une cellule aléatoire peut être infranchissable ou au-delà du bord de la carte. Avant l'action du jeu, utilisez les vérifications appropriées des coordonnées et de l'itinéraire.
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;
}Paramètres et déroulement de l’exécution :
- Dans Random(count) il n'y a que max=10 : pas de limite supérieure, 0..9 possible. Le numéro 10 n'apparaît pas.
- Dans Random(0, count−1) min=0 et max=9 inclus : la plage valide est la même, mais l'appel fait un nouveau choix indépendant.
- le nombre doit être positif pour la sélection de l'index. Le cas spécial compatible Random(0)=0 ne signifie pas que la collection vide a un élément à l'index 0.
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;
}
}Paramètres et déroulement de l’exécution :
- min=7 et max=7 donnent un seul résultat 7.
- min=−100 et max=−50 ne donnent que des nombres négatifs, incluant les deux limites.
- Le dernier appel couvre l'intégralité du bit 32 signé int. Son résultat peut être positif, négatif ou nul.
- Les frontières passent du plus petit au plus grand. L'appel erroné à Random(10, 1) s'arrête avec le message min ne doit pas dépasser max ; il n'est pas nécessaire de l'utiliser pour une plage inversée.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: max (Integer)
Résultat: int / Integer.
Pendant un appel:
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int Random(int max)
{
lock (randomSync) return random.Next(max);
}Paramètres: min (Integer), max (Integer)
Résultat: int / Integer.
Pendant un appel:
Code interne de l’implémentation ; ce n’est pas un script autonome.
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