Skip to content

ES UO Topic files json data

Codex edited this page Oct 12, 2026 · 4 revisions

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

Archivos / JSON / Datos

Inicio · C# · IDE · UO API · A–Z · Ejemplos · Idiomas

Archivos, JSON, matrices y colecciones C# y ayudantes compatibles UO. Las funciones integradas C# se escriben sin UO.

Secciones

Tema Comandos y explicaciones
Archivo C# y biblioteca estándar
JSON Analizar C# y biblioteca estándar
JSON Cargar C# y biblioteca estándar))
JSON Guardar C# y biblioteca estándar
JSON Stringificar C# y biblioteca estándar
Lista C# y biblioteca estándar
Diccionario C# y biblioteca estándar
Matrices C# y biblioteca estándar · C# y biblioteca estándar
MemoryStream C# y biblioteca estándar

Todos los comandos del tema

Colecciones de compatibilidad

UO.GetArrayLength · UO.GetWord · UO.GetWordCount

Random Valores

UO.Random

C# y biblioteca estándar · C# y biblioteca estándar · C# y biblioteca estándar

Ejemplos sobre el tema.

Cada tarjeta de comando tiene varios escenarios independientes: código directo, funciones y clases. A continuación se muestran escenarios breves seleccionados; restricciones y análisis completos están en las cartas.

UO.GetArrayLength

Parámetros, resultado y todos los escenarios

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

Parámetros, resultado y todos los escenarios

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;

Referencia completa de comandos


UO.GetArrayLength

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

Firmas de C#

dynamic UO.GetArrayLength(object? arg);

Cuenta las celdas de la matriz inmediata para una iteración limitada y una lectura segura del índice.

Parámetros

Valor devuelto

int >= 0. Una matriz vacía y un valor de otro tipo dan 0: el resultado por sí solo no puede verificar el tipo. Esta es una cantidad, no un bool ni el último índice.

Comportamiento

  • Comprobación local: no envía una solicitud al servidor, no mueve elementos ni modifica la matriz. Los ejemplos contienen datos de entrenamiento, no inventario en vivo.
  • Comprueba el tipo de valor y lee Array.Length sin recorrer ni sumar. declarar los valores de la variable (2) crea tres celdas, índices 0..2, incluidas las vacías.
  • Los elementos anidados no se cuentan de forma recursiva. Para una cadena está Len, para Lista/Diccionario está su Count. UO.GetArrayLength es un nombre compatible para el mismo cheque local.

Scripts independientes de C#

Cada ejemplo se puede guardar como un archivo independiente .csx y ejecutar en IDE. Las funciones de objeto UO y de espera proporcionan el anfitrión de la sesión de juego actual. Reemplace los nombres, coordenadas y direcciones de la demostración serial por los suyos propios.

Ejemplo sencillo

Ejecuta este código en un archivo .csx independiente. Los argumentos aparecen en la llamada; sustituye los nombres, seriales y direcciones de ejemplo por los tuyos.

El resultado de una sola llamada se muestra en el diario. Un número no se convierte en bool; para un array se muestra su cantidad de elementos.

object? result = UO.GetArrayLength(new[] { 10, 20, 30 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Agregue cantidades de una lista limitada: secuencia de comandos directa

Parámetros y flujo de ejecución:

  • declarar los montos variables (2) crea tres entradas. El bucle itera sobre los índices 0...2 y devuelve 150. Las cantidades se suman por ciclo, no por ArrayLength.
  • Comprobación local: no envía una solicitud al servidor, no mueve elementos ni modifica la matriz. Los ejemplos contienen datos de entrenamiento, no inventario en vivo.
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. Cuente por separado puntos y campos de coordenadas: función de script

Parámetros y flujo de ejecución:

  • Hay dos puntos de matriz en la ruta, cada uno con tres celdas de coordenadas. El resultado es 2|3, no seis. El personaje no se mueve.
  • Comprobación local: no envía una solicitud al servidor, no mueve elementos ni modifica la matriz. Los ejemplos contienen datos de entrenamiento, no inventario en vivo.
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. Verifique el primer índice: clase de secuencia de comandos

Parámetros y flujo de ejecución:

  • La línea da 0; Main no devuelve ninguna ruta antes de acceder al índice. La verificación también es adecuada para un Array vacío, pero no distingue entre estos casos.
  • Comprobación local: no envía una solicitud al servidor, no mueve elementos ni modifica la matriz. Los ejemplos contienen datos de entrenamiento, no inventario en vivo.
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;
}

Implementación del comando

C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.

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

Parámetros: arg (Any)

Resultado: dynamic / Any.

Durante la llamada:

Código interno de implementación; no es un script independiente.

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 · 繁體中文 · 日本語 · 한국어

Firmas de C#

string UO.GetWord(object? value, object? wordIndex);
string UO.GetWord(object? value, object? wordIndex, object? delimiter);

Obtiene una sola palabra o campo del texto. Útil para analizar coordenadas, una lista de prioridades o configuraciones de script guardadas.

Parámetros

  • value — Cadena de origen. La función analiza exactamente el texto transmitido: no lee la revista, el archivo, el equipo o el mundo por sí solo.
  • wordIndex: índice completo de la palabra de 0: 0 es la primera, 1 es la segunda. Un índice negativo y un índice no menor que el número de palabras devuelven una cadena vacía.
  • delimiter — Delimitador opcional. Sin él, con "" o con un solo espacio " ", el texto se divide por cualquier carácter de espacio en blanco Unicode, incluidas tabulaciones y nuevas líneas. Otro delimitador es la secuencia exacta en su totalidad: "::" significa dos dos puntos seguidos, no cada dos puntos. Las piezas vacías se descartan; las partes no vacías no se recortan.

Valor devuelto

string: parte seleccionada que no está vacía, o "" si no hay índice. Esto es texto, no ID, type o un número: para un número, marque IsNumeric por separado y convierta el valor.

Comportamiento

  • Funciona localmente, sin paquetes ni acciones de juego. GetWord y UO.GetWord llaman al mismo controlador; GetWordCount y UO.GetWordCount también son iguales. Cada llamada vuelve a dividir el texto completo. En el bucle, guarde la cantidad por adelantado; Para análisis repetidos de gran tamaño, es mejor almacenar los campos ya analizados en una matriz. Este no es un analizador CSV: las comillas no protegen los delimitadores, las columnas vacías se pierden.
  • GetWord · GetWordCount · IsNumeric

Scripts independientes de C#

Cada ejemplo se puede guardar como un archivo independiente .csx y ejecutar en IDE. Las funciones de objeto UO y de espera proporcionan el anfitrión de la sesión de juego actual. Reemplace los nombres, coordenadas y direcciones de la demostración serial por los suyos propios.

Ejemplo sencillo

Ejecuta este código en un archivo .csx independiente. Los argumentos aparecen en la llamada; sustituye los nombres, seriales y direcciones de ejemplo por los tuyos.

El resultado de una sola llamada se muestra en el diario. Un número no se convierte en bool; para un array se muestra su cantidad de elementos.

var result = UO.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));

1. UO.GetWord - 1 - guión directo

Parámetros y flujo de ejecución:

  • ReadX recibe la cadena "mover 1445 1690". Prueba tres palabras y el nombre se mueve; índice 1 selecciona X. IsNumeric comprueba el texto, Convertir. ToInt32 devuelve 1445. Esto es sólo un desglose de la configuración; el personaje no se mueve. Si el formulario es incorrecto, se devuelve -1.
  • ReadX también requiere el X completo en el rango 0...65535 antes de Convert.ToInt32; Se rechazan NaN, infinito y fraccionario X. Y no se prueba aquí.
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 — función de secuencia de comandos

Parámetros y flujo de ejecución:

  • PriorityAt obtiene la lista "mago||tanque|arquero|" e índice=1. Separador | descarta elementos vacíos, por lo que el resultado es tanque. Los nombres son arbitrarios; aquí no registran ClassMask ni revisan vestimenta. Utilice las mismas reglas de división al contar y seleccionar.
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 - clase de escenario

Parámetros y flujo de ejecución:

  • ReadPlace divide "Britain::Bank:west" con el delimitador exacto ::. El índice 1 devuelve Bank:west, dejando los dos puntos interiores. Si no hay exactamente dos partes que no estén vacías, el ayudante devuelve "". Se conservan los espacios alrededor de las piezas.
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;
}

Implementación del comando

C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.

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

Parámetros: value (String), wordIndex (Integer)

Resultado: string / String.

Durante la llamada:

Código interno de implementación; no es un script independiente.

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

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

Parámetros: value (String), wordIndex (Integer), delimiter (String)

Resultado: string / String.

Durante la llamada:

Código interno de implementación; no es un script independiente.

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 · 繁體中文 · 日本語 · 한국어

Firmas de C#

int UO.GetWordCount(object? value);
int UO.GetWordCount(object? value, object? delimiter);

Cuenta los campos de texto que no están vacíos. Le permite verificar el número de coordenadas antes de analizar y determinar los límites de enumeración de la lista.

Parámetros

  • value — Cadena de origen. La función analiza exactamente el texto transmitido: no lee la revista, el archivo, el equipo o el mundo por sí solo.
  • delimiter — Delimitador opcional. Sin él, con "" o con un solo espacio " ", el texto se divide por cualquier carácter de espacio en blanco Unicode, incluidas tabulaciones y nuevas líneas. Otro delimitador es la secuencia exacta en su totalidad: "::" significa dos dos puntos seguidos, no cada dos puntos. Las piezas vacías se descartan; las partes no vacías no se recortan.

Valor devuelto

int: número de partes no vacías. Una cadena vacía y una cadena solo delimitada producen 0. Este es un contador, no un bool: 2 también es un resultado válido; verifique el recuento > 0 o la cantidad exacta que necesita.

Comportamiento

  • Funciona localmente, sin paquetes ni acciones de juego. GetWord y UO.GetWord llaman al mismo controlador; GetWordCount y UO.GetWordCount también son iguales. Cada llamada vuelve a dividir el texto completo. En el bucle, guarde la cantidad por adelantado; Para análisis repetidos de gran tamaño, es mejor almacenar los campos ya analizados en una matriz. Este no es un analizador CSV: las comillas no protegen los delimitadores, las columnas vacías se pierden.
  • GetWord · GetWordCount · IsNumeric

Scripts independientes de C#

Cada ejemplo se puede guardar como un archivo independiente .csx y ejecutar en IDE. Las funciones de objeto UO y de espera proporcionan el anfitrión de la sesión de juego actual. Reemplace los nombres, coordenadas y direcciones de la demostración serial por los suyos propios.

Ejemplo sencillo

Ejecuta este código en un archivo .csx independiente. Los argumentos aparecen en la llamada; sustituye los nombres, seriales y direcciones de ejemplo por los tuyos.

El resultado de una sola llamada se muestra en el diario. Un número no se convierte en bool; para un array se muestra su cantidad de elementos.

var result = UO.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));

1. UO.GetWordCount - 1 - guión directo

Parámetros y flujo de ejecución:

  • HasPoint acepta "1445 1690 0". Requiere exactamente tres palabras y texto numérico en cada una, luego devuelve 1; en caso contrario 0. Esto es sólo una verificación de la forma y no de la validez del mapa, los límites de las coordenadas o la transitabilidad. GetWordCount aquí devuelve 3 y bool devuelve nuestro ayudante.
  • HasPoint además rechaza NaN e infinitos, que el propio IsNumeric puede aceptar. Se permiten números finitos fraccionarios; Antes del movimiento, se requiere una verificación separada de las coordenadas completas del juego.
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 — función de secuencia de comandos

Parámetros y flujo de ejecución:

  • JoinPriorities obtiene "mago||tanque|arquero|". Cuenta tres elementos no vacíos una vez, itera a través de los índices 0..2 y devuelve "mago > tanque > arquero". Principio, final y repetición | no cree una prioridad separada.
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 - clase de escenario

Parámetros y flujo de ejecución:

  • CountPlaces obtiene "Britain::Bank:west::". El separador :: proporciona dos campos, el campo vacío final se elimina: el resultado es 2. Único: Bank:west no divide el texto. Esta no es una lista de ciudades del cliente, sino un ejemplo de su formato de configuración.
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, "::");
    }
}

Implementación del comando

C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.

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

Parámetros: value (String)

Resultado: int / Integer.

Durante la llamada:

Código interno de implementación; no es un script independiente.

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

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

Parámetros: value (String), delimiter (String)

Resultado: int / Integer.

Durante la llamada:

Código interno de implementación; no es un script independiente.

private static int GetWordCount(string value,string delimiter) => SplitWords(value,delimiter).Length;

UO.Random

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

Firmas de C#

int UO.Random(object? max);
int UO.Random(object? min, object? max);

Devuelve un número entero aleatorio. El nuevo formulario UO.Random(min, max) selecciona el número DESDE el mínimo HASTA el máximo inclusive. Se conserva la forma anterior UO.Random(max): selecciona desde 0 hasta max−1. El resultado puede almacenarse en una variable y usarse como retraso, coordenada, índice o condición.

Parámetros

  • min: el primer argumento de la forma de dos argumentos SOLAMENTE incluye el límite inferior, un número entero de −2147483648 a 2147483647. Puede ser negativo, cero o positivo. No debe ser más que máx. En la forma de un argumento no hay mínimo y el número pasado significa máximo.
  • max: en forma de dos argumentos, el segundo argumento, incluido el límite superior int de −2147483648 a 2147483647. En la forma anterior de un argumento, un argumento único, límite superior EXCLUIDO, un número entero de 0 a 2147483647; Random(0) devuelve 0. No se permite un máximo negativo en forma de un argumento.

Valor devuelto

int es un entero pseudoaleatorio. Con dos argumentos min ≤ resultado ≤ max; Ambas fronteras pueden caer. Con un argumento positivo 0 ≤ resultado < máx. Es aceptable repetir un número previamente sorteado: el equipo no selecciona números sin repeticiones.

Comportamiento

  • Se admiten exactamente dos formularios: UO.Random(max) y UO.Random(min, max). Una llamada sin argumentos no se registra. Para un rango "desde y hasta", utilice dos argumentos.
  • Random(5, 5) siempre devuelve 5. Random(10, 1) informa un error de rango: los límites no se intercambian silenciosamente. Random(-10, -1) es correcto porque −10 es menor que −1.
  • Ambos límites son números enteros int; para fracciones decimales, puede seleccionar unidades enteras de la escala deseada y luego dividir. Por ejemplo, Random(0, 100) / 100.0 proporciona valores discretos de 0 a 1 en incrementos de 0,01.
  • El rango completo Random(-2147483648, 2147483647) es válido. La implementación no agrega 1 al máximo en int y, por lo tanto, no se desborda en el límite superior. Para rangos amplios, se descartan valores adicionales para que el resto de la división no sesgue la selección.
  • La llamada calcula el número localmente, no envía paquetes y no se detiene. Para una pausa aleatoria, pase el resultado a UO.Wait. Su script debe mantener la latencia mínima requerida por el servidor.
  • Guarde el resultado en var si necesita el mismo número varias veces. Dos llamadas independientes a Random pueden devolver valores diferentes. El comando no verifica si la casilla seleccionada es válida para movimiento o transferencia: esto lo verifica el comando de juego correspondiente.

Scripts independientes de C#

Cada ejemplo se puede guardar como un archivo independiente .csx y ejecutar en IDE. Las funciones de objeto UO y de espera proporcionan el anfitrión de la sesión de juego actual. Reemplace los nombres, coordenadas y direcciones de la demostración serial por los suyos propios.

Ejemplo sencillo

Ejecuta este código en un archivo .csx independiente. Los argumentos aparecen en la llamada; sustituye los nombres, seriales y direcciones de ejemplo por los tuyos.

El resultado de una sola llamada se muestra en el diario. Un número no se convierte en bool; para un array se muestra su cantidad de elementos.

var result = UO.Random(10);
UO.Print("Random: " + Convert.ToString(result));

1. Número aleatorio de 1 a 6 - guión directo

Parámetros y flujo de ejecución:

  • min baja = 1, max sube = 6. Hay exactamente seis valores posibles: 1, 2, 3, 4, 5 y 6.
  • El rollo almacena un número recibido. Print muestra exactamente esto; Convertir.ToString convierte int en una cadena. Ejecutarlo nuevamente puede dar el mismo número.
var lower = 1;
var upper = 6;
var roll = UO.Random(lower, upper);
UO.Print("Roll: " + Convert.ToString(roll));

2. Pausa aleatoria entre 350 y 700 milisegundos - función de script

Parámetros y flujo de ejecución:

  • min=350 y max=700 definen los límites de retardo habilitados. El resultado, como 350, 512 o 700, se escribe en retraso.
  • UO.Wait recibe un argumento de retraso en milisegundos. La pausa ocurre en UO.Wait; Random solo calcula el número.
  • Elija el límite inferior según las acciones y requisitos de su servidor. El retraso aleatorio no sustituye a la espera de que el servidor responda si la siguiente acción necesita esa respuesta.
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. Seleccione una de las tres acciones como condición: clase de escenario

Parámetros y flujo de ejecución:

  • min=1, max=3: la elección es 1, 2 o 3. Cada sucursal corresponde a uno de los números válidos.
  • La llamada a Random se ejecuta una vez antes del if. Si lo vuelves a convocar en cada condición, serán elecciones diferentes.
  • Reemplace Print con las acciones deseadas en su secuencia de comandos, manteniendo las comprobaciones de condición, rango y respuesta del servidor para esas acciones.
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. Seleccione un lugar para MassMove dentro de la mochila - guión directo

Parámetros y flujo de ejecución:

  • Primero Random: min=50, max=90, resultado x. Segundo: min=60, max=100, resultado y. Estas son dos coordenadas independientes dentro del contenedor, no coordenadas de pantalla ni coordenadas de mapa.
  • En MassMove retraso=350 ms, cantidad=10 elementos enteros, type=0 se determina mediante la primera transferencia manual, destino=backpack, x/y se toman de las variables, z=0.
  • Después del comando, arrastre la muestra con el mouse desde el contenedor original. Toda esta inclusión de MassMove utiliza una posición seleccionada. Aleatorizar la posición de cada elemento individual requiere un bucle con MoveItem separado en lugar de una sola llamada a MassMove.
  • Selecciona el rango X/Y dentro del área disponible de tu mochila. El servidor puede cambiar la ubicación de los elementos.
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. Desplazamiento negativo relativo a la coordenada original - función de script

Parámetros y flujo de ejecución:

  • En ambas llamadas min=−2 y max=2: −2, −1, 0, 1, 2 son posibles. GetX/GetY lee las coordenadas del personaje sin argumentos.
  • x/y es solo una celda calculada en un cuadrado alrededor del personaje. Este ejemplo no comienza a moverse ni a lanzar objetos.
  • Una celda aleatoria puede ser intransitable o estar más allá del borde del mapa. Antes de la acción del juego, utilice comprobaciones apropiadas de coordenadas y rutas.
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. Compatibilidad mantenida con Random(max) - clase de escenario

Parámetros y flujo de ejecución:

  • En Random(count) solo hay max=10: sin límite superior, 0..9 posible. El número 10 no aparece.
  • En Random(0, count−1) min=0 y max=9 inclusive: el rango válido es el mismo, pero la llamada realiza una nueva elección independiente.
  • El recuento debe ser positivo para la selección del índice. El caso especial compatible Random(0)=0 no significa que la colección vacía tenga un elemento en el índice 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. Límites iguales y rango completo int - guión directo

Parámetros y flujo de ejecución:

  • min=7 y max=7 dan un único resultado 7.
  • min=−100 y max=−50 dan solo números negativos, incluidos ambos límites.
  • La última llamada cubre todo el bit 32 firmado int. Su resultado puede ser positivo, negativo o cero.
  • Los límites se pasan de más pequeños a más grandes. La llamada errónea a Random(10, 1) se detiene con el mensaje min no debe exceder max; no es necesario utilizarlo para un rango invertido.
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));

Implementación del comando

C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.

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

Parámetros: max (Integer)

Resultado: int / Integer.

Durante la llamada:

Código interno de implementación; no es un script independiente.

public int Random(int max)

        {

            lock (randomSync) return random.Next(max);

        }

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

Parámetros: min (Integer), max (Integer)

Resultado: int / Integer.

Durante la llamada:

Código interno de implementación; no es un script independiente.

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