Skip to content

FR UO Topic files json data

Codex edited this page Oct 12, 2026 · 4 revisions

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

Fichiers / JSON / Données

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.

Sections

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

Toutes les commandes du thème

Collections de compatibilité

UO.GetArrayLength · UO.GetWord · UO.GetWordCount

Random Valeurs

UO.Random

C# et bibliothèque standard · C# et bibliothèque standard · C# et bibliothèque standard

Exemples sur le sujet

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.

UO.GetArrayLength

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;

UO.GetWord

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;

Référence complète des commandes


UO.GetArrayLength

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

Signatures C#

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.

Paramètres

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Ajouter des quantités à partir d'une liste limitée - script direct

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;

2. Compter séparément les points et les champs de coordonnées - fonction de script

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;
}

3. Vérifier le premier index - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetArrayLength(arg) — UO.GetArrayLength(Any)

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;

UO.GetWord

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

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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

Scripts C# autonomes

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.

Exemple simple

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));

1. UO.GetWord - 1 - script direct

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;

2. UO.GetWord — 2 — fonction de script

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, "|");
}

3. UO.GetWord - 3 - classe de scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetWord(value, wordIndex) — UO.GetWord(String,Integer)

Paramètres: value (String), wordIndex (Integer)

Résultat: string / String.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");

UO.GetWord(value, wordIndex, delimiter) — UO.GetWord(String,Integer,String)

Paramètres: value (String), wordIndex (Integer), delimiter (String)

Résultat: string / String.

Pendant un appel:

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;
        }

UO.GetWordCount

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

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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

Scripts C# autonomes

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.

Exemple simple

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));

1. UO.GetWordCount - 1 - script direct

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;

2. UO.GetWordCount — 2 — fonction de script

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;

3. UO.GetWordCount - 3 - classe de scénario

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, "::");
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetWordCount(value) — UO.GetWordCount(String)

Paramètres: value (String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

private static int GetWordCount(string value) => GetWordCount(value," ");

UO.GetWordCount(value, delimiter) — UO.GetWordCount(String,String)

Paramètres: value (String), delimiter (String)

Résultat: int / Integer.

Pendant un appel:

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;

UO.Random

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

Signatures C#

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.

Paramètres

  • 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é.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Nombre aléatoire de 1 à 6 - script direct

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));

2. Pause aléatoire entre 350 et 700 millisecondes - fonction script

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;
}

3. Sélectionnez l'une des trois actions comme condition - classe de scénario

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;
}

4. Sélectionnez un emplacement pour MassMove à l'intérieur du sac à dos - script direct

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));

5. Décalage négatif par rapport à la coordonnée d'origine - fonction script

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;
}

6. Compatibilité maintenue avec Random(max) - classe de scénario

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;
    }
}

7. Limites égales et plage complète int - script direct

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));

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.Random(max) — UO.Random(Integer)

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);

        }

UO.Random(min, max) — UO.Random(Integer,Integer)

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));

            }

        }

Clone this wiki locally