ES UO Topic mobiles - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Personajes y criaturas

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

Personajes, NPC, monstruos y mascotas ya conocidos por el cliente. Serial define una criatura específica, body/type sus gráficos; estos son significados diferentes.

Secciones

Tema Comandos y explicaciones
Players UO.GetMobiles · UO.FindMobile
NPC UO.IsNpc · UO.FindMobile
Monsters UO.FindType · UO.FindMobile
Pets UO.GetPetsCurrent · UO.GetPetsMax
Followers UO.GetFollowers · UO.GetFollowersMax
Name / Serial / Body UO.GetName · UO.GetSerial · UO.GetType
Coordenadas UO.GetX · UO.GetY · UO.GetZ
Distance UO.GetDistance
Notoriety UO.Notoriety
Status UO.GetStatus · UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Paralyzed
Rename UO.Rename

Todos los comandos del tema

Jugadores / NPC / Monstruos

UO.GetMobile · UO.GetMobiles · UO.IsNpc

Mascotas / Followers

UO.Followers · UO.GetFollowers · UO.FollowersMax · UO.GetFollowersMax · UO.PetsCurrent · UO.GetPetsCurrent · UO.PetsMax · UO.GetPetsMax

Notoriety

UO.Notoriety · UO.GetNotoriety

Rename

UO.CanChangeName · UO.MobileCanBeRenamed · UO.Rename · UO.RenameMobile

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

Parámetros, resultado y todos los escenarios

var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.GetNotoriety

Parámetros, resultado y todos los escenarios

var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));

Referencia completa de comandos


UO.CanChangeName

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

Firmas de C#

int UO.CanChangeName(object? id);

Comprueba el signo conocido del cliente sobre la capacidad de cambiar el nombre de mobile.

Parámetros

  • id — Obligatorio serial/ID de un objeto específico: int, cadena hexadecimal o alias self, backpack, lasttarget, lastobject, lastcontainer, último estado, elemento de búsqueda, último cadáver o nombre AddObject. Esto no es graphic/type. El nombre no especificado se resuelve en 0; el comando no abre ningún objetivo nuevo. El argumento es necesario; para usted, pase self.

Valor devuelto

int 1 - cargado mobile tiene el atributo IsRenamable. int 0: falta el atributo, el objeto no es mobile, desconocido o eliminado. Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.

El resultado del comando es una bandera numérica: 1 significa una condición cumplida, 0 significa una condición no cumplida. Después de var resultado = comando(...) verifique si (resultado! = 0) o si (resultado == 0). Guarde el resultado de una llamada: una llamada repetida puede realizar la acción nuevamente o leer el estado que ya cambió.

Comportamiento

  • Se lee el modelo del cliente local; No hay solicitudes al servidor, ni esperas ni movimientos.
  • El resultado se refiere al momento de la lectura. Después de UO.Wait u otra acción, el objeto y sus indicadores pueden cambiar.
  • Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.

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.CanChangeName("self");
UO.Print("CanChangeName: " + Convert.ToString(result));

1. Comprueba tu propio estado - guión directo

Parámetros y flujo de ejecución:

  • El argumento self selecciona explícitamente su carácter. estado: 1/0 únicamente.
  • Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.
var state = UO.CanChangeName("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Marque seleccionado mobile - función de script

Parámetros y flujo de ejecución:

  • IsNpc excluye sujeto y objeto desconocido. El objetivo almacena un único serial en lugar de una referencia activa a un lasttarget cambiante.
  • El resultado se refiere al campo IsRenamable. Los datos se actualizan solo después de que el cliente recibe el estado apropiado.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.CanChangeName(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comparar el estado antes y después de la pausa - clase de script

Parámetros y flujo de ejecución:

  • UO.Wait(500): pausa en milisegundos. Después, se comprueba por separado que mobile todavía existe.
  • Se comparan dos fotografías. Es posible que se pierdan los cambios intermedios y esta no es una suscripción continua a los eventos del servidor.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.CanChangeName(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.CanChangeName(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

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.CanChangeName(id) — UO.CanChangeName(Any)

Parámetros: id (Any)

Resultado: int / Integer.

Durante la llamada:

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

public int CanChangeName(InjectionValue id) => bridge.CanChangeName(GetObject(id));

UO.Followers

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

Firmas de C#

int UO.Followers();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios de control de mascotas ocupados.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios de control de mascotas ocupados, 0...255 en el modelo del cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.Followers si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsCurrent/Followers informa espacios de control ocupados desde su estado type >= 3. Una mascota puede ocupar varios espacios; Las reglas para las criaturas convocadas y domesticadas las establece el servidor. Este no es el número de mobile visibles, ni la lista de mascotas ID, ni el número de animales cercanos.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.Followers();
UO.Print("Followers: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Followers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.Followers() — UO.Followers()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.Followers

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.FollowersMax

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

Firmas de C#

int UO.FollowersMax();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios máximos de control de mascotas.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios máximos de control de mascotas, 0...255 en el modelo cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.FollowersMax si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsMax/FollowersMax informa el límite total de espacios permitidos por el servidor desde el estado type >= 3, no espacios libres. Puede haber más espacios ocupados que el límite. Considere la capacidad libre como máxima - corriente, reemplazando el resultado negativo por 0. El equipo no suelta nada, no domestica ni invoca nada.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.FollowersMax();
UO.Print("FollowersMax: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.FollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.FollowersMax() — UO.FollowersMax()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.FollowersMax

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.GetFollowers

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

Firmas de C#

int UO.GetFollowers();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios de control de mascotas ocupados.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios de control de mascotas ocupados, 0...255 en el modelo del cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.Followers si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsCurrent/Followers informa espacios de control ocupados desde su estado type >= 3. Una mascota puede ocupar varios espacios; Las reglas para las criaturas convocadas y domesticadas las establece el servidor. Este no es el número de mobile visibles, ni la lista de mascotas ID, ni el número de animales cercanos.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.GetFollowers();
UO.Print("GetFollowers: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetFollowers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetFollowers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetFollowers() — UO.GetFollowers()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.Followers

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.GetFollowersMax

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

Firmas de C#

int UO.GetFollowersMax();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios máximos de control de mascotas.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios máximos de control de mascotas, 0...255 en el modelo cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.FollowersMax si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsMax/FollowersMax informa el límite total de espacios permitidos por el servidor desde el estado type >= 3, no espacios libres. Puede haber más espacios ocupados que el límite. Considere la capacidad libre como máxima - corriente, reemplazando el resultado negativo por 0. El equipo no suelta nada, no domestica ni invoca nada.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.GetFollowersMax();
UO.Print("GetFollowersMax: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetFollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetFollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetFollowersMax() — UO.GetFollowersMax()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.FollowersMax

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.GetMobile

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

Firmas de C#

dynamic UO.GetMobile(object? id);

Recopila un registro compacto de propiedades una por una ID.

Parámetros

  • id — Serie/ID de un objeto específico: int, cadena decimal/hexadecimal o alias de conjunto self, backpack, lasttarget, lastobject o nombre AddObject. Esto no es graphic/type.

Valor devuelto

Matriz de campos 9: [0] int serial, [1] string nombre, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int notoriedad, [8] int dirección 0..7. Para el ID desconocido, la matriz también tiene campos 9: el ID pasado se almacena, el nombre está vacío, las propiedades numéricas no disponibles son 0. Este no es un registro Pascal completo de TMobile.

Comportamiento

  • Se leen los datos ya descargados por el cliente. El comando no abre el contenedor, no mueve elementos ni descarga objetos de todo el servidor.
  • Matriz: matriz con índices que comienzan desde 0. Guárdalo en var, marca ArrayLength antes de acceder. Los elementos pueden desaparecer del mundo después de tomar una instantánea: marque Exists(serial) antes de actuar.
  • Tener nueve campos no confirma la existencia del personaje; utilice Exists. El comando en sí no verifica que ID pertenezca a Mobile. Se pueden devolver el nombre/coordenadas del elemento y las propiedades de cero caracteres.
  • HP/MaxHP de otro carácter depende de la escala enviada por el servidor. Z es la altura, no la capa de equipo.

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.GetMobile("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Lee el nombre y la salud de tu personaje - guión directo

Parámetros y flujo de ejecución:

  • ID=self. [1] es el nombre, [5]/[6] son ​​el HP actual y máximo, no Mana.
  • La matriz ha arreglado nueve campos. El nombre vacío y 0/0 son posibles antes de ingresar al mundo.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));

2. Leer las coordenadas del personaje seleccionado - función de script

Parámetros y flujo de ejecución:

  • lasttarget debe apuntar al personaje. [2]/[3]/[4] - X/Y/Z del mundo.
  • Primero se comprueba la presencia del objeto. Si el objetivo es un objeto de la bolsa, las coordenadas se refieren a su goma.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        var mobile = UO.GetMobile(target);
        UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Verifique el estado del Móvil seleccionado - clase de script

Parámetros y flujo de ejecución:

  • [7] - que significa notoriedad, [8] - dirección 0..7. Ningún campo es type.
  • El comando lee datos conocidos, no dirige al personaje ni cambia el modo de combate.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(target)))
        {
            var mobile = UO.GetMobile(target);
            UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
            UO.Print("Direction: " + Convert.ToString(mobile[8]));
        }

        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.GetMobile(id) — UO.GetMobile(Any)

Parámetros: id (Any)

Resultado: dynamic / Any.

Durante la llamada:

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

case "getmobile":

                {

                    int id = Arg(0);

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),

                        new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),

                        new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))

                    });

                }

UO.GetMobiles

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

Firmas de C#

dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);

Obtiene una matriz ID de caracteres cargados coincidentes/NPC. Es necesario cuando el script necesita verificar varios objetivos, seleccionar el suyo propio, calcular el entorno o agregar su propia condición antes de una acción.

Parámetros

  • distance — Radio horizontal en celdas inclusive: 5 permite la distancia 0..5. La distancia es máxima (abs (dx), abs (dy)), por lo que la diagonal adyacente también es 1. De forma predeterminada o si el número es negativo, se toma UO.FindDistance() en lugar de una búsqueda ilimitada. 0 sale de la misma celda X/Y. No la longitud de la ruta; Los obstáculos y los suelos no se controlan con este parámetro.
  • notoriety — Estado de relación con el personaje recibido del servidor: 0 — desconocido, 1 — Inocente, 2 — Aliado, 3 — Gris, 4 — Criminal, 5 — Enemigo, 6 — Asesino, 7 - Invulnerable. El número significa un estado; "5|6" o una serie de números: cualquiera de los anteriores. No es el color de la ropa ni la clase. Un número negativo (normalmente -1), 0xFFFF, "cualquiera", una cadena vacía o una matriz vacía desactivan este filtro por separado. Una cadena no válida sin números válidos no encuentra a nadie. El orden de los estados no establece prioridad. El filtro 5 selecciona Enemigo en lugar de seleccionar automáticamente cualquier NPC/monstruo; Los valores reales dependen del servidor.
  • body - Gráfico del cuerpo del personaje/NPC, no ID de un personaje específico y no type de la armadura usada. Un número, una cadena hexadecimal, la cadena "0x0190|0x0191" o una matriz de números. 0x0190 (400) - hombre humano; 0x0191 (401) - humana femenina. La máscara une ambos cuerpos. La lista no incluye automáticamente otras razas, fantasmas o transformaciones; tabla de tipos de cuerpos gráficos estándar. Un número negativo (-1 por defecto), 0xFFFF, "cualquiera", una cadena vacía o una matriz vacía sola: cualquier cuerpo. El texto desconocido sin un número válido produce un resultado vacío.
  • maxZ — Abs máximos (Z del objetivo - Z del propio personaje), inclusive, en unidades Z del mundo. Este no es el número de pisos o celdas X/Y. maxZ=4 con el jugador Z 10 permite el objetivo Z 6..14; 0 requiere exactamente la misma altura. De forma predeterminada/para un número negativo, se toma UO.FindVertical(). En las escaleras, una Z igual puede eliminar el objetivo deseado. Incluso una pequeña diferencia en Z no demuestra la accesibilidad del suelo.
  • nearest - true/1 ordena la matriz de cerca a lejos, luego por serial si es igual. false/0 conserva el orden del cliente de forma predeterminada. Este no es un radio adicional ni una selección de un objeto.
  • includeSelf - true/1 le permite habilitar self si todos los demás filtros y Ignore lo permiten. false/0 excluye self de forma predeterminada. La inclusión no garantiza la presencia de self en el resultado.
  • aliveOnly - true/1 excluye móviles con IsDead != 0; false/0 no agrega esta condición de forma predeterminada. No comparar HP con cero, no buscar elementos del cadáver y no garantizar que el objetivo permanecerá vivo después de ser convocado.
  • visibleOnly - true/1 requiere IsVisible=1 según el estado actual ClassicUO; false/0 no agrega una condición de forma predeterminada. Esta es la visibilidad del objeto cargado para el cliente, no una verificación de la pared/línea de visión. Para la verificación geométrica hay un UO.CheckLOS separado con coordenadas; el servidor aún puede rechazar la acción.

Valor devuelto

Matriz - serial móviles. Una matriz vacía significa que no hay coincidencias; marque ArrayLength antes de los objetivos[0]. No body/type, no total HP, no 1/0. La forma sin argumentos todavía se aplica FindDistance/FindVertical/Ignore y excluye self.

Comportamiento

  • Búsqueda local: sólo móviles ya descargados. se tiene en cuenta Ignore; self está excluido, excepto el includeSelf=true explícito en los comandos que lo admiten. Los contenedores y artículos no son móviles.
  • Las condiciones se aplican juntas (AND). Las alternativas válidas dentro de body/notoriedad se combinan a través de OR. La búsqueda no cambia FindItem, FindCount y GetFoundItems.
  • En body/notoriedad, la máscara con números válidos usa estos: "cualquier|5" todavía la limita a 5. Los elementos en blanco/no válidos junto a números válidos se ignoran. Sin restricciones, pase -1 por separado. No lleve esta regla a classMask: el nombre de clase desconocido rechaza la lista completa.
  • Los equipos no abren una zona del mundo, no corren hacia la meta y no comprueban la transitabilidad de la ruta. Entre la selección y el procesamiento del servidor, el estado del mundo puede cambiar.
  • La transmisión de true y 1 es equivalente para las banderas, false y 0 también. Otros números distintos de cero también se convierten a true, pero 8/9 no son modos separados; use claro true/false.
  • 0..8 se admiten argumentos posicionales. classMask y el color no están presentes en este comando; no transfiera el orden de los argumentos AttackNearest aquí.
  • Matriz - instantánea ID. El objetivo puede desaparecer más tarde; Vuelva a verificar Exists si hubo una espera entre la búsqueda y la acción. Nada ataca por sí solo.

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.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Seleccione el aliado más cercano y habilite el seguimiento: secuencia de comandos directa

Parámetros y flujo de ejecución:

  • nearestFirst=true convierte a los aliados[0] en los aliados más cercanos. Follow incluye caminar en segundo plano; detiene UO.Follow(0). El nombre/clase del aliado no está determinado por este comando.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Cuente objetivos peligrosos y seleccione una acción según su número: función de script

Parámetros y flujo de ejecución:

  • Aquí el más cercano=false es apropiado: el contador es importante. ArrayLength es la cantidad de móviles, no la cantidad de elementos en la pila. Alarm imprime un aviso en el registro.
return  RunScenario();
 object? RunScenario()
{
    var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
    var count = ArrayLength(enemies);
    if (Truth(count == 1))
    {
        UO.Attack(enemies[0]);
    }
    else if (Truth(count > 1))
    {
        UO.Alarm();
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Lista en la misma celda y altura, incluyéndose a sí misma - clase de script

Parámetros y flujo de ejecución:

  • distancia=0 - idéntico X/Y, maxZ=0 - idéntico Z. body está limitado a dos graphic. includeSelf=true permite self, pero aún debe coincidir con body y aliveOnly. El ejemplo muestra otros personajes en el mismo cuadrado.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
        var i = 0;
        var others = 0;
        while (Truth(i < ArrayLength(sameCell)))
        {
            if (Truth(sameCell[i] != UO.GetSerial("self")))
            {
                others += 1;
            }

            i += 1;
        }

        if (Truth(others > 0))
        {
            UO.Alarm();
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

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.GetMobiles() — UO.GetMobiles()

Parámetros: Sin parámetros.

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance) — UO.GetMobiles(Any)

Parámetros: distance (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety) — UO.GetMobiles(Any,Any)

Parámetros: distance (Any), notoriety (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body) — UO.GetMobiles(Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ) — UO.GetMobiles(Any,Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any), maxZ (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest) — UO.GetMobiles(Any,Any,Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf) — UO.GetMobiles(Any,Any,Any,Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)

Parámetros: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

Resultado: dynamic / Any.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

values => CompactGetMobiles(values)

UO.GetNotoriety

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

Firmas de C#

int UO.GetNotoriety();
int UO.GetNotoriety(object? id);

Lee la reputación del personaje desde el modelo del cliente.

Parámetros

  • id: objeto opcional solo en los formatos de parámetro único especificados: serial número/cadena hexadecimal, "self", "lasttarget" o nombre AddObject. Esto no es graphic/type. Sin argumentos, se lee el propio carácter. Antes de leer otro objeto, marque UO.Exists; un nombre desconocido no abre el alcance.

Valor devuelto

int — 0=desconocido, 1=inocente, 2=aliado, 3=gris, 4=criminal, 5=enemigo, 6=asesino, 7=invulnerable. Este es un código de estado, no hue, karma o fama. Desconocido mobile da 0.

Comportamiento

  • Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
  • 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.

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.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(result));

1. Muestra el valor actual de tu personaje - script directo

Parámetros y flujo de ejecución:

  • La llamada sin argumentos hace referencia a self. La reputación del personaje se almacena en valor.
  • Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));

2. Usar valor en la validación de la aplicación: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • El valor se lee una vez sin ningún argumento. La reputación del personaje se utiliza en el cálculo o condición mostrada.
  • Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetNotoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Leer propiedad del objeto seleccionado - clase de script

Parámetros y flujo de ejecución:

  • El argumento único selecciona el objeto lasttarget; su serial debe ser conocido por el cliente. El gráfico/type no se transfiere aquí.
  • Los datos de otro objeto pueden ser desconocidos incluso si Exists es positivo. Para las coordenadas de un artículo en una bolsa, se obtiene la posición del contenedor, no el punto mundial.
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()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetNotoriety("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

        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.GetNotoriety() — UO.GetNotoriety()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.GetNotoriety(bridge.Self)

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.

UO.GetNotoriety(id) — UO.GetNotoriety(Any)

Parámetros: id (Any/Integer/String)

Resultado: int / Any.

Durante la llamada:

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

case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));

UO.GetNotoriety(id) — UO.GetNotoriety(Integer)

Parámetros: id (Any/Integer/String)

Resultado: int / Integer.

Durante la llamada:

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

public int GetNotoriety(int id) => bridge.GetNotoriety(id);

UO.GetNotoriety(id) — UO.GetNotoriety(String)

Parámetros: id (Any/Integer/String)

Resultado: int / Integer.

Durante la llamada:

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

public int GetNotoriety(string id) => GetNotoriety(GetObject(id));

UO.GetPetsCurrent

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

Firmas de C#

int UO.GetPetsCurrent();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios de control de mascotas ocupados.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios de control de mascotas ocupados, 0...255 en el modelo del cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.Followers si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsCurrent/Followers informa espacios de control ocupados desde su estado type >= 3. Una mascota puede ocupar varios espacios; Las reglas para las criaturas convocadas y domesticadas las establece el servidor. Este no es el número de mobile visibles, ni la lista de mascotas ID, ni el número de animales cercanos.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.GetPetsCurrent();
UO.Print("GetPetsCurrent: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetPetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetPetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetPetsCurrent() — UO.GetPetsCurrent()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.Followers

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.GetPetsMax

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

Firmas de C#

int UO.GetPetsMax();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios máximos de control de mascotas.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios máximos de control de mascotas, 0...255 en el modelo cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.FollowersMax si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsMax/FollowersMax informa el límite total de espacios permitidos por el servidor desde el estado type >= 3, no espacios libres. Puede haber más espacios ocupados que el límite. Considere la capacidad libre como máxima - corriente, reemplazando el resultado negativo por 0. El equipo no suelta nada, no domestica ni invoca nada.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.GetPetsMax();
UO.Print("GetPetsMax: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetPetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetPetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetPetsMax() — UO.GetPetsMax()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.FollowersMax

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.IsNPC

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

Firmas de C#

int UO.IsNPC(object? objID);

Comprueba el mobile cargado con el serial pasado explícitamente.

Parámetros

  • objID - Obligatorio serial/ID de un objeto específico: int, cadena hexadecimal o alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse o nombre AddObject. Esto no es graphic/type. El nombre no especificado se resuelve en 0; el comando no abre ningún objetivo nuevo. Sólo IsNpc también tiene un formulario sin argumentos registrado: se utiliza self.

Valor devuelto

int 1 - cargado, no eliminado mobile. int 0: un objeto desconocido serial o un objeto remoto. El nombre IsNPC no significa "solo personaje no jugador": tu propio personaje y otros jugadores también dan 1.

El resultado del comando es una bandera numérica: 1 significa una condición cumplida, 0 significa una condición no cumplida. Después de var resultado = comando(...) verifique si (resultado! = 0) o si (resultado == 0). Guarde el resultado de una llamada: una llamada repetida puede realizar la acción nuevamente o leer el estado que ya cambió.

Comportamiento

  • Se lee el modelo del cliente local; No hay solicitudes al servidor, ni esperas ni movimientos.
  • El resultado se refiere al momento de la lectura. Después de UO.Wait u otra acción, el objeto y sus indicadores pueden cambiar.
  • El administrador del juego trata a IsNpc e IsNPC como variantes del mismo nombre; en el código fuente C#, utilice la ortografía exacta del formulario público. Este resultado no puede distinguir de manera confiable al jugador de NPC; Las reglas para esta distinción dependen del servidor.

En C# los caracteres del nombre distinguen entre mayúsculas y minúsculas: UO.IsNPC requiere un argumento; el formulario UO.IsNpc() sin argumentos selecciona self. Ambos nombres buscan mobile, incluidos los jugadores, en lugar de exclusivamente NPC.

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.IsNPC(UO.Self());
UO.Print("IsNPC: " + Convert.ToString(result));

1. Comprueba serial de tu propio personaje - guión directo

Parámetros y flujo de ejecución:

  • Esta forma C# requiere un argumento. El propio personaje también da 1; esta es una prueba de mobile y no exclusivamente de NPC.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");

2. Seleccione el objetivo cargado antes de leer las coordenadas: función de script

Parámetros y flujo de ejecución:

  • La serie se toma de lasttarget. Las coordenadas se leen solo si el cliente conoce mobile.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.IsNPC(target) == 0)
        return false;
    UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
    return true;
    return null;
}

3. Comparar personaje y mochila - Clase de escenario

Parámetros y flujo de ejecución:

  • El personaje que entra al mundo es mobile y la mochila es un objeto. El resultado se refiere al momento de la lectura local.
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()
    {
        int character = UO.IsNPC(UO.Self());
        int bag = UO.IsNPC(UO.Backpack());
        UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
        return null;
    }
}

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.IsNPC(objID) — UO.IsNPC(Any)

Parámetros: objID (Any)

Resultado: int / Integer.

Durante la llamada:

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

case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));

UO.IsNpc

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

Firmas de C#

int UO.IsNpc();
int UO.IsNpc(object? id);

Parámetros

  • id - Obligatorio serial/ID de un objeto específico: int, cadena hexadecimal o alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse o nombre AddObject. Esto no es graphic/type. El nombre no especificado se resuelve en 0; el comando no abre ningún objetivo nuevo. Sólo IsNpc también tiene un formulario sin argumentos registrado: se utiliza self.

Valor devuelto

int 1 - cargado, no eliminado mobile. int 0: un objeto desconocido serial o un objeto remoto. El nombre IsNPC no significa "solo personaje no jugador": tu propio personaje y otros jugadores también dan 1.

El resultado del comando es una bandera numérica: 1 significa una condición cumplida, 0 significa una condición no cumplida. Después de var resultado = comando(...) verifique si (resultado! = 0) o si (resultado == 0). Guarde el resultado de una llamada: una llamada repetida puede realizar la acción nuevamente o leer el estado que ya cambió.

Comportamiento

  • Se lee el modelo del cliente local; No hay solicitudes al servidor, ni esperas ni movimientos.
  • El resultado se refiere al momento de la lectura. Después de UO.Wait u otra acción, el objeto y sus indicadores pueden cambiar.
  • El administrador del juego trata a IsNpc e IsNPC como variantes del mismo nombre; en el código fuente C#, utilice la ortografía exacta del formulario público. Este resultado no puede distinguir de manera confiable al jugador de NPC; Las reglas para esta distinción dependen del servidor.

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.IsNpc();
UO.Print("IsNpc: " + Convert.ToString(result));

1. Pon a prueba tu propio personaje - guión directo

Parámetros y flujo de ejecución:

  • La forma sin argumentos selecciona self. El resultado 1/0 no es serial y no distingue a NPC del jugador.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");

2. Distinguir entre mobile, objeto y objetivo desconocido es una función del script

Parámetros y flujo de ejecución:

  • Preseleccione lasttarget. Primero se comprueba la carga del objeto; la clasificación mobile no define su hostilidad.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.Exists(target) == 0)
        UO.Print("Target is not loaded");
    else
        UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
    return null;
}

3. Leer visitas conocidas por el cliente solo desde mobile - clase de script

Parámetros y flujo de ejecución:

  • El servidor puede normalizar los accesos de otras personas. El cheque no solicita el estado completo.
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()
    {
        string target = UO.GetSerial("lasttarget");
        if (UO.IsNpc(target) != 0)
            UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
        return null;
    }
}

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.IsNpc() — UO.IsNpc()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

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

public int IsNpc() => IsNpc(bridge.Self);

UO.IsNpc(id) — UO.IsNpc(Integer)

Parámetros: id (Integer/String)

Resultado: int / Integer.

Durante la llamada:

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

public int IsNpc(int id) => bridge.IsNpc(id);

UO.IsNpc(id) — UO.IsNpc(String)

Parámetros: id (Integer/String)

Resultado: int / Integer.

Durante la llamada:

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

public int IsNpc(string id) => IsNpc(GetObject(id));

UO.MobileCanBeRenamed

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

Firmas de C#

int UO.MobileCanBeRenamed(object? mobID);

Comprueba el signo conocido del cliente sobre la capacidad de cambiar el nombre de mobile.

Parámetros

  • mobID — Obligatorio serial/ID de un objeto específico: int, cadena hexadecimal o alias self, backpack, lasttarget, lastobject, lastcontainer, último estado, elemento de búsqueda, último cadáver o nombre AddObject. Esto no es graphic/type. El nombre no especificado se resuelve en 0; el comando no abre ningún objetivo nuevo. El argumento es necesario; para usted, pase self.

Valor devuelto

int 1 - cargado mobile tiene el atributo IsRenamable. int 0: falta el atributo, el objeto no es mobile, desconocido o eliminado. Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.

El resultado del comando es una bandera numérica: 1 significa una condición cumplida, 0 significa una condición no cumplida. Después de var resultado = comando(...) verifique si (resultado! = 0) o si (resultado == 0). Guarde el resultado de una llamada: una llamada repetida puede realizar la acción nuevamente o leer el estado que ya cambió.

Comportamiento

  • Se lee el modelo del cliente local; No hay solicitudes al servidor, ni esperas ni movimientos.
  • El resultado se refiere al momento de la lectura. Después de UO.Wait u otra acción, el objeto y sus indicadores pueden cambiar.
  • Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.

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.MobileCanBeRenamed("self");
UO.Print("MobileCanBeRenamed: " + Convert.ToString(result));

1. Comprueba tu propio estado - guión directo

Parámetros y flujo de ejecución:

  • El argumento self selecciona explícitamente su carácter. estado: 1/0 únicamente.
  • Este es el último permiso del servidor, por ejemplo para una mascota. El comando no cambia el nombre del objeto y no garantiza que el servidor acepte una solicitud posterior.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Marque seleccionado mobile - función de script

Parámetros y flujo de ejecución:

  • IsNpc excluye sujeto y objeto desconocido. El objetivo almacena un único serial en lugar de una referencia activa a un lasttarget cambiante.
  • El resultado se refiere al campo IsRenamable. Los datos se actualizan solo después de que el cliente recibe el estado apropiado.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.MobileCanBeRenamed(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comparar el estado antes y después de la pausa - clase de script

Parámetros y flujo de ejecución:

  • UO.Wait(500): pausa en milisegundos. Después, se comprueba por separado que mobile todavía existe.
  • Se comparan dos fotografías. Es posible que se pierdan los cambios intermedios y esta no es una suscripción continua a los eventos del servidor.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.MobileCanBeRenamed(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.MobileCanBeRenamed(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

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.MobileCanBeRenamed(mobID) — UO.MobileCanBeRenamed(Any)

Parámetros: mobID (Any)

Resultado: int / Integer.

Durante la llamada:

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

case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));

UO.Notoriety

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

Firmas de C#

int UO.Notoriety();

Lee la reputación del personaje desde el modelo del cliente.

Parámetros

No hay parámetros.

Valor devuelto

int — 0=desconocido, 1=inocente, 2=aliado, 3=gris, 4=criminal, 5=enemigo, 6=asesino, 7=invulnerable. Este es un código de estado, no hue, karma o fama. Desconocido mobile da 0.

Comportamiento

  • Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
  • 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.

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.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(result));

1. Muestra el valor actual de tu personaje - script directo

Parámetros y flujo de ejecución:

  • La llamada sin argumentos hace referencia a self. La reputación del personaje se almacena en valor.
  • Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(value));

2. Usar valor en la validación de la aplicación: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • El valor se lee una vez sin ningún argumento. La reputación del personaje se utiliza en el cálculo o condición mostrada.
  • Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Notoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Mira el cambio en un segundo - clase de guión

Parámetros y flujo de ejecución:

  • Ambas llamadas sin argumento leen su valor actual. UO.Wait(1000) da una pausa de milisegundos entre disparos.
  • El cambio que se compara es la reputación del personaje. Un ejemplo no cambia nada en el mundo y no espera sin cesar. Es posible que se pierdan los eventos ocurridos dentro de este segundo.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Notoriety();
        await Delay(1000);
        var after = UO.Notoriety();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

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.Notoriety() — UO.Notoriety()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.

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

() => bridge.GetNotoriety(bridge.Self)

Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.


UO.PetsCurrent

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

Firmas de C#

int UO.PetsCurrent();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios de control de mascotas ocupados.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios de control de mascotas ocupados, 0...255 en el modelo del cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.Followers si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsCurrent/Followers informa espacios de control ocupados desde su estado type >= 3. Una mascota puede ocupar varios espacios; Las reglas para las criaturas convocadas y domesticadas las establece el servidor. Este no es el número de mobile visibles, ni la lista de mascotas ID, ni el número de animales cercanos.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.PetsCurrent();
UO.Print("PetsCurrent: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.PetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.PetsCurrent() — UO.PetsCurrent()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

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

case "petscurrent": return new InjectionValue(bridge.Followers);

UO.PetsMax

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

Firmas de C#

int UO.PetsMax();

Ayuda a decidir de antemano si el personaje tiene suficiente espacio para la siguiente criatura domesticada o convocada. Followers muestra las ranuras de control ocupadas, FollowersMax es su límite total. Este no es el número de animales cercanos ni el comando de movimiento Follow. Lee el contador de estado de tu personaje: espacios máximos de control de mascotas.

Parámetros

No hay parámetros.

Valor devuelto

int - espacios máximos de control de mascotas, 0...255 en el modelo cliente. 0 puede ser un valor real, sin datos o un jugador perdido/destruido. Esta es una cantidad, no bool, ID o type: 1 significa una unidad, no éxito. El comando no itera sobre objetos y no devuelve una matriz.

Comportamiento

  • Por ejemplo, 3 de 5 está ocupado; el espacio 2 está libre. El valor 4 puede significar cuatro criaturas para un espacio, una para cuatro o alguna otra combinación. Para una criatura en 2, el espacio de verificación “ocupado <máximo” no es suficiente: necesitas máximo - actual >= 2. El costo de una criatura específica y el límite los determina el servidor; no sustituya la constante 5 por FollowersMax.
  • 0 no prueba que la mascota esté perdida, fallecida o liberada: puede estar vacía o el estado aún no ha sido actualizado. Un aumento en el contador es sólo una señal adicional de un cambio de control; no determina qué criatura es domesticada. Consulta también los mensajes del servidor y de la propia mascota. Estos espacios no son iguales a los lugares en el establo.
  • El comando no acepta argumentos. Utilice las firmas exactas anteriores.
  • La lectura del hilo del juego requiere Jugador.FollowersMax si el Jugador actual existe y no ha sido destruido; en caso contrario 0. El equipo no se clasifica, las bonificaciones no se recalculan, no se solicita el estado y no hay que esperar actualizaciones. Un fantasma presente no es igual a un Jugador destruido.
  • PetsMax/FollowersMax informa el límite total de espacios permitidos por el servidor desde el estado type >= 3, no espacios libres. Puede haber más espacios ocupados que el límite. Considere la capacidad libre como máxima - corriente, reemplazando el resultado negativo por 0. El equipo no suelta nada, no domestica ni invoca nada.
  • CharacterStatus verifica el cuerpo requerido antes de actualizar. Weight está disponible en su propio estado extendido, ranuras - desde type 3, Luck - desde type 4, servidor WeightMax - desde type 5. Un paquete compacto/antiguo sin contador opcional deja su caché anterior. El nuevo Jugador empieza desde cero; la llamada no prueba la recepción de un estado nuevo.
  • Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al 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.
  • Cada llamada lee los datos locales de nuevo. La variable almacena la instantánea; las lecturas individuales pueden recibir diferentes actualizaciones del servidor. Un resultado distinto de cero no prueba la conexión. Cero puede ser un valor o ningún dato.

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.PetsMax();
UO.Print("PetsMax: " + Convert.ToString(result));

1. Calcule los espacios disponibles antes de salir: guión directo

Parámetros y flujo de ejecución:

  • actual - ocupado, máximo - límite, freeSlots - diferencia. Con un límite desconocido/cero o datos inconsistentes, el ejemplo termina sin afirmar que el espacio está libre. El comando solo lee el estado más reciente, no solicita una nueva actualización.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Verificar la capacidad antes de domesticar animales: función de secuencia de comandos

Parámetros y flujo de ejecución:

  • Primero seleccione el animal deseado para que su ID esté en lasttarget. requiredSlots=2 - configuración de ejemplo, reemplázala con el costo real de esta criatura en tu servidor. Si no hay suficiente espacio, no se establece el objetivo y no se solicita la habilidad. De lo contrario, la cola del objetivo se prepara ANTES del argumento único UseSkill("Domesticación de animales"). Iniciar un intento no garantiza el éxito: la habilidad, el alcance, la domesticación y la respuesta del servidor son importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.PetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Comprobación de reutilización para criaturas de diferentes costos - clase de escenario

Parámetros y flujo de ejecución:

  • CanAddFollower es un ayudante de usuario completamente declarado, no un nuevo comando UO. Devuelve 1/true si hay un límite de caché suficiente; en caso contrario, 0/false. El parámetro extraSlots es el costo de la criatura que se AGREGA, no su type/ID. 2 - ejemplo; La función no domestica ni convoca. La verificación debe repetirse inmediatamente antes de actuar.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.PetsMax() — UO.PetsMax()

Parámetros: Sin parámetros.

Resultado: int / Integer.

Durante la llamada:

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

case "petsmax": return new InjectionValue(bridge.FollowersMax);

UO.Rename

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

Firmas de C#

void UO.Rename(object? mobile, object? newName);

Solicita un cambio de nombre de personaje/mascota.

Parámetros

  • mobile — Objeto serial/ID: int, cadena numérica/hexadecimal o alias establecido, por ejemplo "lasttarget". Esto no es graphic/type. Verifique el objeto cargado antes de actuar.
  • newName — Texto a través de ToString; guardado como transmitido.

Valor devuelto

void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.

Comportamiento

  • El orden es serial, luego el nuevo nombre. Puente.RenameMobile llama a GameActions.Rename(serial, nombre). API no verifica CanChangeName ni cambia el Name local.
  • El servidor verifica el permiso para cambiar el nombre. Para mascota, primero marque MobileCanBeRenamed; la solicitud no garantiza la aceptación del nombre.

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 comando es una instrucción independiente. El mensaje anterior indica el inicio de la llamada y no confirma una acción del servidor.

UO.Print("Calling UO.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");

1. Llamada directa - guión directo

Parámetros y flujo de ejecución:

  • Solicita un cambio de nombre de personaje/mascota.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.Rename(id, "Companion");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Opción explícita: función de script

Parámetros y flujo de ejecución:

  • El orden es serial, luego el nuevo nombre. Puente.RenameMobile llama a GameActions.Rename(serial, nombre). API no verifica CanChangeName ni cambia el Name local.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.Rename(id, "Guardian");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Función auxiliar completa: clase de script

Parámetros y flujo de ejecución:

  • El servidor verifica el permiso para cambiar el nombre. Para mascota, primero marque MobileCanBeRenamed; la solicitud no garantiza la aceptación del nombre.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.Rename(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
    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.Rename(mobile, newName) — UO.Rename(Any,Any)

Parámetros: mobile (Any), newName (Any)

Resultado: void / Unit.

Durante la llamada:

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

case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;

UO.RenameMobile

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

Firmas de C#

void UO.RenameMobile(object? mobID, object? newName);

Solicita un cambio de nombre de personaje/mascota.

Parámetros

  • mobID — Objeto serial/ID: int, cadena numérica/hexadecimal o alias establecido, por ejemplo "lasttarget". Esto no es graphic/type. Verifique el objeto cargado antes de actuar.
  • newName — Texto a través de ToString; guardado como transmitido.

Valor devuelto

void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.

Comportamiento

  • El orden es serial, luego el nuevo nombre. Puente.RenameMobile llama a GameActions.Rename(serial, nombre). API no verifica CanChangeName ni cambia el Name local.
  • El servidor verifica el permiso para cambiar el nombre. Para mascota, primero marque MobileCanBeRenamed; la solicitud no garantiza la aceptación del nombre.

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 comando es una instrucción independiente. El mensaje anterior indica el inicio de la llamada y no confirma una acción del servidor.

UO.Print("Calling UO.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");

1. Llamada directa - guión directo

Parámetros y flujo de ejecución:

  • Solicita un cambio de nombre de personaje/mascota.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.RenameMobile(id, "Companion");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Opción explícita: función de script

Parámetros y flujo de ejecución:

  • El orden es serial, luego el nuevo nombre. Puente.RenameMobile llama a GameActions.Rename(serial, nombre). API no verifica CanChangeName ni cambia el Name local.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.RenameMobile(id, "Guardian");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Función auxiliar completa: clase de script

Parámetros y flujo de ejecución:

  • El servidor verifica el permiso para cambiar el nombre. Para mascota, primero marque MobileCanBeRenamed; la solicitud no garantiza la aceptación del nombre.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.RenameMobile(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
    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.RenameMobile(mobID, newName) — UO.RenameMobile(Any,Any)

Parámetros: mobID (Any), newName (Any)

Resultado: void / Unit.

Durante la llamada:

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

case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;
⚠️ **GitHub.com Fallback** ⚠️