Repository navigation
ES UO Topic combat
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Inicio · C# · IDE · UO API · A–Z · Ejemplos · Idiomas
Ataque, modo de combate, habilidades con armas y curación con vendajes. La solicitud del cliente y la acción realizada por el servidor son diferentes.
| Tema | Comandos y explicaciones |
|---|---|
| Attack | UO.Attack |
| AttackNearest | UO.AttackNearest |
| LastAttack | UO.LastAttack |
| WarMode | UO.WarMode |
| WarTarget | UO.WarTargetID |
| Habilidades de armas | UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility |
| Primary Ability | UO.UsePrimaryAbility |
| Secondary Ability | UO.UseSecondaryAbility |
| Special Moves | UO.Specmove |
| BandageSelf | UO.BandageSelf |
UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID
UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove
UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest
Los nombres de los grupos y los tipos de prendas que se usan están especificados en el guión; el orden de los nombres hasta | especifica la prioridad.
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.
Parámetros, resultado y todos los escenarios
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
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;Parámetros, resultado y todos los escenarios
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Attack(object? objID);Dirige una solicitud de ataque a un serial específico. Adecuado cuando el objetivo ya ha sido seleccionado por el usuario o encontrado por otro equipo; Aquí no existe una búsqueda independiente por ropa/distancia.
-
objID— Serie mobile: int, cadena decimal/hexadecimal o nombre de objeto resoluble (por ejemplo, lasttarget o nombre AddObject). No graphic/type ni el nombre de la clase. Argumento requerido; 0 no es una orden para detener la pelea. Para seleccionar un objetivo sin su ID utilice el objetivo de búsqueda o de juego.
void - sin valor. Escriba UO.Attack(enemy) en una línea separada, no var resultado=UO.Attack(...). Finalizar una llamada no confirma un acierto, daño o aceptación del servidor.
- El desafío en sí no derriba a muertos, distantes, self, aliados, serial vacíos ni elementos. Verifique el objetivo seleccionado; preferiblemente filtrado mobile de GetMobiles/FindMan.
- Se utiliza el estándar GameActions.Attack: es posible un ataque criminal con EnabledCriminalActionQuery. En progreso normal, LastAttack/NewTargetSystemSerial se actualizan y se envía un paquete de solicitud de ataque.
- El comando no activa WarMode, no hace doble clic, no calcula una ruta y no inicia un ciclo de ataques repetidos. El modo de combate y el combate posterior dependen del servidor.
- Puede producirse un error de resolución para una cadena con un nombre de objeto desconocido. La prueba Exists prueba la presencia de un objeto, pero no que sea mobile; GetMobiles lo dan los móviles.
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.
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.Attack");
UO.Attack(UO.LastTarget());Parámetros y flujo de ejecución:
- lasttarget puede ser un objeto o un personaje amistoso. La lista de permitidos excluye estos casos; Attack se llama como máximo una vez.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
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;Parámetros y flujo de ejecución:
- FindMan devuelve serial y no ataca. La verificación IsDead se agrega por separado porque FindMan no tiene aliveOnly.
return RunScenario();
object? RunScenario()
{
var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
if (Truth(enemy == 0))
{
return null;
}
if (Truth(UO.IsDead(enemy) == 0))
{
UO.AddObject("enemy", enemy);
UO.Attack(enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- GetMobiles ya está ordenado por el =true más cercano. Si hay una pared delante del primer objetivo, se comprueba el siguiente; la presencia de visibleOnly no reemplaza por sí sola a CheckLOS. La verificación del servidor puede variar.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(targets)))
{
var enemy = targets[i];
if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
{
UO.Attack(enemy);
return null;
}
i += 1;
}
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;
}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.
Parámetros: objID (Any/Integer/String)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;Parámetros: objID (Any/Integer/String)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
Código interno de implementación; no es un script independiente.
public void Attack(int id) => bridge.Attack(id);Parámetros: objID (Any/Integer/String)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Código interno de implementación; no es un script independiente.
public void Attack(string id) => Attack(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);Selecciona un objetivo de combate adecuado y se lo pasa al responsable del ataque. Los filtros limitan los caracteres aceptables; personalizado classMask establece la prioridad de equipo y clase, la opción más cercana dentro de una clase.
-
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. -
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. -
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 selecciona el carácter coincidente más cercano de forma predeterminada; Se permite la misma distancia con un serial más pequeño. false/0 mantiene el primer objeto coincidente en el orden de la lista de clientes, no selecciona el más alejado. Con classMask, se aplica primero la prioridad de clase y luego la distancia dentro de la clase. -
color— Tono del propio mobile: int o cadena numérica/hexadecimal. Número negativo (-1 por defecto) y 0xFFFF - cualquier hue; 0 es exactamente hue 0, y no cualquier valor. Ni el color de la franja de notoriedad ni el tono de la ropa. Este parámetro no verifica el color del artículo que se usa. -
classMask: nombres de reglas predefinidas por UO.SetClassMask en el mismo tiempo de ejecución del script. Por ejemplo, "DTMH|hunter|spare" - prioridad de izquierda a derecha; También se permite una serie de cadenas. Cualquier nombre, el caso no es importante. Separadores de línea: |, coma o ;. Cualquier nombre desconocido/elemento vacío dentro de la lista anula la selección completa: resultado 0, sin ataque. Esta no es una máscara de bits numérica: 7 no significa tres clases. Un argumento faltante, -1, "-1", "cualquiera", "todos" o la cadena vacía deshabilita por separado el filtro de clase. Mago/Tanque/Arquero no están integrados: sin registrar dichas reglas, no habrá coincidencias. -
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.
int - serial seleccionado mobile, o 0 cuando no hay un objetivo adecuado o classMask no es válido. Esta no es una bandera 1/0, ni una body/type, ni una distancia o confirmación de un ataque. ¡Comprueba enemigo! = 0; enemigo == true no es válido en C#: int no se compara con bool. Si ID es distinto de cero, el controlador ClassicUO aún puede mostrar la confirmación del ataque Inocente; el servidor puede rechazar la acción.
- 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.
- El nombre es una etiqueta personalizada, no una profesión de servidor. Puedes llamar a la regla DTMH, my_group o cualquier otra palabra. El motor no determina las habilidades/clase en el servidor por el nombre del personaje.
- En caso necesario, un type o una matriz plana significa al menos una cosa de la lista. Una variedad de grupos significa: necesitas al menos una cosa de CADA grupo. Por ejemplo, [cuero, duelas] requiere cuero Y un bastón. Este es un conjunto de alternativas y no un requisito para usar todo el guardarropa enumerado.
- Cualquier artículo usado de prohibido excluye al personaje de esta regla, incluso si se cumplen las requeridas. El cuero más una cadena prohibida no pasa la regla del cuero. Se siguen poniendo a prueba otras reglas.
- Solo se cuentan los artículos cargados que se usan en las capas 1..24, excepto la mochila 21. El contenido de la mochila/cofre, la montura 25, el cargador 26...28 y el banco 29 no se consideran ropa. Compara graphic/type; Las cosas serial, nombre y hue no se utilizan aquí.
- La lista no coincide sin el equipo adecuado cargado. La ausencia de un artículo prohibido en los datos locales no prueba su ausencia en el servidor si el servidor aún no ha enviado el equipo. El cliente no adivina datos ocultos.
- Las reglas pertenecen a un script en tiempo de ejecución, incluidas sus funciones e Incluye; no se transfieren a otros lanzamientos independientes y no se guardan en el perfil. Al comenzar de nuevo, defínalos nuevamente, por ejemplo mediante el procedimiento de configuración general. Un SetClassMask repetido reemplaza la regla con el mismo nombre, solo después de que los nuevos datos se hayan verificado por completo.
- Las matrices se copian durante el registro. Cambiar la matriz original no cambia la regla: repita SetClassMask. Varias reglas de coincidencia se resuelven según el orden de los nombres en classMask. No hay mesas de ropa para servidores estándar.
- 1..9 se admiten argumentos posicionales. Puedes saltarte la cola; para establecer classMask se deben pasar los primeros seis argumentos. Utilice el nombre var para ver el significado de cada posición.
- Se selecciona un objetivo y el ataque se envía una vez. Este no es un ciclo de combate automático. Sin classMask no se realiza el filtro del equipo ni la lectura de ítems.
- Primero los filtros generales, luego la prioridad de izquierda a derecha, luego el más cercano. near=false todavía conserva la prioridad de clase, pero dentro de la primera clase coincidente selecciona el primer mobile en la lista del cliente.
- El antiguo intento de buscar una subcadena en un nombre/título ha sido reemplazado por reglas de equipo. Mueva dichos scripts a un SetClassMask explícito; El nombre del personaje ya no lo identifica como una clase específica.
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.
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.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- body=-1, maxZ=FindVertical(), más cercano=true, color=-1, classMask deshabilitado, aliveOnly=false, visibleOnly=false. Para asegurarse de excluir a las personas fallecidas, utilice el formulario completo a continuación.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
return null;
}
UO.AddObject("combat_target", enemy);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- maxZ=0 es útil para comparaciones estrictas de altura, pero puede cortar el objetivo en el escalón. visibleOnly no revisa la pared. Los nueve argumentos están firmados; devuelve ID, no true.
return RunScenario();
object? RunScenario()
{
var status = "5|6";
var radius = 8;
var bodies = "0x0190|0x0191";
var heightTolerance = 0;
dynamic chooseNearest = true;
var bodyHue = -1;
var equipmentClasses = -1;
dynamic requireAlive = true;
dynamic requireVisible = true;
var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_same_height", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- DTMH se selecciona primero; solo si no hay DTMH adecuados - pesado, entonces cazador. DTMH en las celdas 10 tiene prioridad sobre el pesado en las celdas 2. Para invertir el orden, cambie la línea classMask. De los dos DTMH, se selecciona el más cercano.
- Gear es una función de usuario completamente reducida C#, no un comando separado UO. Las dos matrices en Gear (cuero, duelas) forman dos grupos requeridos. Agregar un tipo al cuero amplía las alternativas; No requiere usar dos prendas de cuero.
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 leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Parámetros y flujo de ejecución:
- 10 es el radio, 4 es la diferencia permitida Z, ambos -1 después de la bandera desactivan el color y classMask. El orden de la lista de clientes no está garantizado entre actualizaciones mundiales. Para una proximidad predecible, utilice true.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
return null;
}
UO.AddObject("current_enemy", target);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- Sólo cambia el orden de las etiquetas: no es necesario añadir nuevas tablas de ropa ni nombres al cliente. Para evitar recurrir a uno pesado, elimínelo de la prioridad.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var priority = "охотник|DTMH|тяжёлый";
var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("priority_enemy", enemy);
}
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;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.
Parámetros: notoriety (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))Parámetros: notoriety (Any), distance (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))Parámetros: notoriety (Any), distance (Any), body (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)
Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)
Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)
Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)
Parámetros: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
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 => new InjectionValue(CompactAttackNearest(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BandageSelf();Coloca al personaje como UO.Wait-objetivo y usa un vendaje del tipo 0x0E21 seleccionado de la mochila. La operación es enviada por el cliente y ejecutada de forma asincrónica por el servidor.
No hay parámetros.
void. El método no devuelve el estado del tratamiento y no espera a que se complete el vendaje.
- Runtime establece el objetivo
Self, luego busca en la mochila el elemento de tipo0x0E21que coincida más con cualquier hue y lo usa. Si no se encuentra el vendaje, la búsqueda lo informa en el registro del sistema; el resultado de la búsqueda no se devuelve al script de llamada. La posibilidad y el resultado del tratamiento dependen del estado servidor del personaje.
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.
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.BandageSelf");
UO.BandageSelf();Parámetros y flujo de ejecución:
- Usa el vendaje que se encuentra en la mochila sobre ti mismo una vez.
UO.BandageSelf();2. Primero verifique la conexión y luego envíe la acción; la llamada no espera al final del tratamiento. - función de guión
Parámetros y flujo de ejecución:
- Primero verifique la conexión y luego envíe la acción; la llamada no espera al final del tratamiento.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.BandageSelf();
}
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. El procedimiento sólo informa del uso del vendaje y no informa del éxito del tratamiento. - clase de guión
Parámetros y flujo de ejecución:
- El procedimiento sólo informa del uso del vendaje y no informa del éxito del tratamiento.
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()
{
ApplyBandage();
return null;
}
void ApplyBandage()
{
UO.BandageSelf();
}
}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.
Parámetros: Sin parámetros.
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
Código interno de implementación; no es un script independiente.
public void BandageSelf()
{
var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));
if (foundBandages != string.Empty)
{
WaitTargetSelf();
UseObject(foundBandages);
}
else
SystemMessage("No bandages found.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ClearClassMask();
int UO.ClearClassMask(object? name);Elimina una regla de equipo personalizada o todas las reglas del tiempo de ejecución del script actual. Útil antes de reconfigurar conjuntos o deshabilitar la prioridad temporal.
-
name: nombre opcional pasado a SetClassMask. El caso no es importante. Sin argumentos, se eliminan todas las reglas para este tiempo de ejecución. Esta no es una cadena de prioridad: "mago|tanque" no está permitido aquí; eliminar uno a la vez o llamar sin argumentos.
int: número de reglas eliminadas. Con el nombre 1 significa eliminado, 0 - no existía tal regla. Sin argumentos, se devuelve 0..N, no un indicador booleano. Por lo tanto, compare el resultado general con > 0 y no con true.
- No cancela un ataque que ya ha sido enviado y no detiene el script. No cambia el equipo del personaje.
- Una vez eliminado, el nombre permanece desconocido para el siguiente AttackNearest. Elimínelo también de classMask o regístrelo nuevamente; un nombre desconocido bloquea toda selección.
- Los tiempos de ejecución de otras personas y sus reglas no se ven afectados. Para una búsqueda normal sin clases, utilice classMask=-1 en lugar del conjunto de ropa obligatorio vacío.
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.
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.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- La eliminación no cambia de arma ni finaliza la pelea. Sólo cambia la clasificación adicional.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("main_enemy", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- eliminado: número de reglas eliminadas. Se crea un nuevo conjunto en el mismo tiempo de ejecución, sin reiniciar el cliente.
return RunScenario();
object? RunScenario()
{
UO.SetClassMask("старый_набор", 0x13B2);
var removed = UO.ClearClassMask();
UO.SetClassMask("новый_набор", 0x0F50);
var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("new_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- No pase el nombre del control remoto: el resultado sería 0. -1 desactiva solo la ropa; Otros filtros siguen funcionando.
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()
{
UO.SetClassMask("по_одежде", 0x13C4);
UO.ClearClassMask();
var classes = -1;
var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_without_classes", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
Parámetros: Sin parámetros.
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
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.
args => new InjectionValue(ClearClassMask(null))Parámetros: name (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
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.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetAbilityID(object? abilityName);Resuelve el nombre de la habilidad del arma o la cadena numérica en el directorio del cliente ID.
-
abilityName- string: nombre AbilityData, enumeración Nombre de habilidad o decimal ID. Los espacios/puntuación se eliminan al comparar nombres y no distinguen entre mayúsculas y minúsculas.
int 1..AbilityData.Abilities.Length - habilidad conocida; 0 es un nombre desconocido, una cadena normalizada vacía o un ID numérico fuera del directorio.
- ResolveClassicUOAbilityId primero analiza el int decimal, luego compara el directorio normalizado y los nombres de enumeración. El comando no activa la habilidad ni verifica la compatibilidad con el arma actual.
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.
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.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- El número representa el ID del catálogo, no el uso de la habilidad.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));Parámetros y flujo de ejecución:
- La línea 1 atraviesa la ruta numérica del solucionador.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}Parámetros y flujo de ejecución:
- Un nombre faltante devuelve 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetAbilityID("unknown-example-ability");
UO.Print(Convert.ToString(id));
return null;
}
}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.
Parámetros: abilityName (String)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
Código interno de implementación; no es un script independiente.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetAbilityName(object? abilityId);Devuelve el nombre de la habilidad de un arma desde su directorio ID.
-
abilityId- int: la indexación de ID comienza con 1; El puente dice AbilityData.Abilities[abilityId-1].
string nombre del directorio. Para ID menor que 1 o mayor que la longitud del directorio, se devuelve una cadena vacía.
- La lectura es local y no activa la habilidad. ID del catálogo no significa que la habilidad esté presente en el arma actual.
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.
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.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- ID 1 coincide con el primer elemento del directorio.
var name = UO.GetAbilityName(1);
UO.Print(name);Parámetros y flujo de ejecución:
- El nombre se devuelve según ID encontrado por el solucionador.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
UO.Print(UO.GetAbilityName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- ID 0 devuelve una cadena de longitud 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = UO.GetAbilityName(0);
UO.Print(Convert.ToString(Len(name)));
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}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.
Parámetros: abilityId (Integer)
Resultado: string / String.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
Código interno de implementación; no es un script independiente.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetActiveAbility();Lee el nombre de la habilidad de combate activada de tu personaje.
No hay parámetros.
string es el nombre en inglés de la habilidad activada, por ejemplo Armor Ignore. Cadena "0" si no hay ninguna habilidad activada o falta un personaje. Esto no es una habilidad int 0, ni una habilidad ID, ni es una confirmación de un golpe exitoso.
- Se leen las banderas PrimaryAbility/SecondaryAbility del carácter actual. Si ambas están activas, se elige la habilidad principal. La marca de actividad se elimina del número antes de buscar el nombre.
- Los datos se leen localmente; el captador en sí no activa la habilidad y no consume maná. Después del ataque, el servidor puede eliminar la activación.
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.
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.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- No hay argumentos; Se lee el carácter del cliente actual.
- Si no hay activación, se imprime la cadena 0.
var name = UO.GetActiveAbility();
UO.Print(name);Parámetros y flujo de ejecución:
- La comparación se realiza con la cadena 0. UsePrimaryAbility se llama por separado.
- Esta es una solicitud de activación, no una prueba de un ataque exitoso. La disponibilidad depende de las armas y las reglas del servidor.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetActiveAbility() == "0"))
{
UO.UsePrimaryAbility();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- GetAbilityID recibe el nombre devuelto por el captador.
- La habilidad ID no es el arma o personaje serial. En primer lugar, se descarta la ausencia de una habilidad activa.
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 name = UO.GetActiveAbility();
if (Truth(name != "0"))
{
var id = UO.GetAbilityID(name);
UO.Print("Ability ID: " + Convert.ToString(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
Parámetros: Sin parámetros.
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetActiveAbility:bridge.GetActiveAbility().
Código interno de implementación; no es un script independiente.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWeaponAbilities();Bridge lee Player.Abilities, aplica el valor ((byte) y 0x7F), almacena ID positivo en el orden original.
No hay parámetros.
Conjunto de habilidades int ID positivas del arma actual. Se elimina la bandera alta 0x80; Se excluyen los valores cero. Sin jugador: una matriz vacía.
- Bridge lee Player.Abilities, aplica el valor ((byte) y 0x7F), almacena ID positivo en el orden original. Devuelve el ID disponible, no el hecho del modo activo ni los nombres.
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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.
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.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Bridge lee Player.Abilities, aplica el valor ((byte) y 0x7F), almacena ID positivo en el orden original.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Parámetros y flujo de ejecución:
- Bridge lee Player.Abilities, aplica el valor ((byte) y 0x7F), almacena ID positivo en el orden original. Devuelve el ID disponible, no el hecho del modo activo ni los nombres.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.GetAbilityName(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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 before = UO.GetWeaponAbilities();
UO.Wait(500);
var after = UO.GetWeaponAbilities();
UO.Print(before);
UO.Print(after);
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
Código interno de implementación; no es un script independiente.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsWarMode(object? objID);Comprueba la postura de lucha mobile.
-
objID— 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.
int 1 - cargado mobile tiene el atributo InWarMode. int 0: falta el atributo, el objeto no es mobile, desconocido o eliminado. No te dice a quién está atacando el personaje ni activa el modo de combate. La lectura del modo externo se limita a los datos recibidos del servidor.
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ó.
- 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.
- No te dice a quién está atacando el personaje ni activa el modo de combate. La lectura del modo externo se limita a los datos recibidos del servidor.
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.
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.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- El argumento self selecciona explícitamente su carácter. estado: 1/0 únicamente.
- No te dice a quién está atacando el personaje ni activa el modo de combate. La lectura del modo externo se limita a los datos recibidos del servidor.
var state = UO.IsWarMode("self");
if (Truth(state))
{
UO.Print("Combat stance is active");
}
else
{
UO.Print("Combat stance is inactive");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;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 InWarMode. 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.IsWarMode(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;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.IsWarMode(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsWarMode(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;
}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.
Parámetros: objID (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
Código interno de implementación; no es un script independiente.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastAttack();Lee el serial del último objetivo del ataque.
No hay parámetros.
int — guardado serial; 0 significa serial no está instalado. No es bool ni graphic/type; Es posible que un ID distinto de cero ya no exista en el mundo.
- Fuente de campo: puente.LastAttack. El comando no selecciona, usa ni ataca el objeto.
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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.
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.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Lee el serial del último objetivo del ataque.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Parámetros y flujo de ejecución:
- Fuente de campo: puente.LastAttack. El comando no selecciona, usa ni ataca el objeto.
return RunScenario();
object? RunScenario()
{
var id = UO.LastAttack();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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 before = UO.LastAttack();
UO.Wait(500);
var after = UO.LastAttack();
UO.Print(before = after);
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Código interno de implementación; no es un script independiente.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);Crea o reemplaza una clase de equipo personalizada para classMask en UO.AttackNearest. Eliges un nombre y graphic/type cosas; No se requieren títulos de trabajo incorporados.
-
name: una cadena no vacía con su nombre, por ejemplo "DTMH", "my_group", "archer_with_shield". El caso no es importante, se eliminan los espacios alrededor de los bordes. | , ; prohibido: estos son separadores de prioridad. any/all/-1 están reservados para deshabilitar el filtro. -
required— Un type, una serie plana de alternativas o una serie de grupos obligatorios. Cada grupo es type o una matriz plana. Necesitas al menos una cosa de cada grupo; No se permiten grupos requeridos vacíos. Cada type es una int/numérica/cadena hexadecimal 1..65534. No se acepta anidar a mayor profundidad que una serie de grupos. Estas son cosas graphic, no caracteres serial ni body. -
forbidden: type opcional o matriz plana de tipos ilegales. Por defecto, no hay artículos prohibidos; También se permite una matriz vacía. Si se usa alguno de estos artículos, la regla no coincide. Los mismos límites 1..65534; -1/cualquiera no se aceptan aquí. Es imposible prohibir por completo todas las alternativas a un grupo obligatorio.
int 1: la regla ha sido verificada y registrada. Un tipo/nombre/grupo requerido vacío/inconsistencia no válido provoca un error de secuencia de comandos, que puede detectarse mediante try/CATCH; se mantiene la regla anterior. No devuelve serial ni caracteres encontrados, y no inicia un ataque.
- El nombre es una etiqueta personalizada, no una profesión de servidor. Puedes llamar a la regla DTMH, my_group o cualquier otra palabra. El motor no determina las habilidades/clase en el servidor por el nombre del personaje.
- En caso necesario, un type o una matriz plana significa al menos una cosa de la lista. Una variedad de grupos significa: necesitas al menos una cosa de CADA grupo. Por ejemplo, [cuero, duelas] requiere cuero Y un bastón. Este es un conjunto de alternativas y no un requisito para usar todo el guardarropa enumerado.
- Cualquier artículo usado de prohibido excluye al personaje de esta regla, incluso si se cumplen las requeridas. El cuero más una cadena prohibida no pasa la regla del cuero. Se siguen poniendo a prueba otras reglas.
- Solo se cuentan los artículos cargados que se usan en las capas 1..24, excepto la mochila 21. El contenido de la mochila/cofre, la montura 25, el cargador 26...28 y el banco 29 no se consideran ropa. Compara graphic/type; Las cosas serial, nombre y hue no se utilizan aquí.
- La lista no coincide sin el equipo adecuado cargado. La ausencia de un artículo prohibido en los datos locales no prueba su ausencia en el servidor si el servidor aún no ha enviado el equipo. El cliente no adivina datos ocultos.
- Las reglas pertenecen a un script en tiempo de ejecución, incluidas sus funciones e Incluye; no se transfieren a otros lanzamientos independientes y no se guardan en el perfil. Al comenzar de nuevo, defínalos nuevamente, por ejemplo mediante el procedimiento de configuración general. Un SetClassMask repetido reemplaza la regla con el mismo nombre, solo después de que los nuevos datos se hayan verificado por completo.
- Las matrices se copian durante el registro. Cambiar la matriz original no cambia la regla: repita SetClassMask. Varias reglas de coincidencia se resuelven según el orden de los nombres en classMask. No hay mesas de ropa para servidores estándar.
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.
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.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- DTMH - solo tu nombre. Los valores en myLeather/forbiddenChain son ejemplos: reemplace/complemente con el graphic real de su servidor. Una lista plana significa OR, no un conjunto completo.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("leather_enemy", enemy);
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- DTMH se selecciona primero; solo si no hay DTMH adecuados - pesado, entonces cazador. DTMH en las celdas 10 tiene prioridad sobre el pesado en las celdas 2. Para invertir el orden, cambie la línea classMask. De los dos DTMH, se selecciona el más cercano.
- Gear es una función de usuario completamente reducida C#, no un comando separado UO. Las dos matrices en Gear (cuero, duelas) forman dos grupos requeridos. Agregar un tipo al cuero amplía las alternativas; No requiere usar dos prendas de cuero.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- declarar la variable requerida[1] crea dos elementos con índices 0 y 1. Los dos grupos anidados requieren torso Y arma; plano [torsoType,weaponType] significaría torso O arma.
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()
{
dynamic[] required = new dynamic[checked((int)(1) + 1)];
dynamic[] torso = new dynamic[checked((int)(0) + 1)];
dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
torso[0] = 0x13C4;
weapon[0] = 0x0DF0;
required[0] = torso;
required[1] = weapon;
UO.SetClassMask("мой_комплект", required);
var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("outfit_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Parámetros y flujo de ejecución:
- La reinscripción reemplaza una copia de la regla. El nombre anterior sigue siendo el mismo, por lo que no es necesario volver a escribir la línea de prioridad.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("updated_outfit", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;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.
Parámetros: name (Any), required (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
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.
args => new InjectionValue(SetClassMask(args))Parámetros: name (Any), required (Any), forbidden (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
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.
args => new InjectionValue(SetClassMask(args))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWarMode(object? value);Solicita el modo combate o pacífico del personaje.
-
value- 0 - modo pacífico; cualquier número entero distinto de cero es el modo de combate.
void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.
- WarMode pasa el modo a GameActions.ToggleWarMode: 0 lo deshabilita, cualquier valor distinto de cero lo habilita. Sin Jugador no hay acción.
- Bridge envía la solicitud en la transmisión del juego. Se aplican las reglas del servidor; No hay espera de confirmación incorporada.
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.
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.SetWarMode");
UO.SetWarMode(1);Parámetros y flujo de ejecución:
- Solicita el modo combate o pacífico del personaje.
UO.SetWarMode(1);Parámetros y flujo de ejecución:
- WarMode pasa el modo a GameActions.ToggleWarMode: 0 lo deshabilita, cualquier valor distinto de cero lo habilita. Sin Jugador no hay acción.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}Parámetros y flujo de ejecución:
- Bridge envía la solicitud en la transmisión del juego. Se aplican las reglas del servidor; No hay espera de confirmación incorporada.
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()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetWarMode(mode);
}
}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.
Parámetros: value (Any)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);Envía una solicitud de un paso directamente al puente.
-
direction— int; dirección & 7 daët 0..7 N,NE,E,SE,S,SW,W,NW. -
running- Indicador numérico opcional int: 0/none - caminar, distinto de cero - correr.
void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.
- ExecuteLegacyManualAlias llama al puente.Step(dirección & 7, ejecutando!= 0) y descarta todo el código de resultado 0/2/3/4/5/7; void regresa afuera. Este es un paso/giro, no una ruta. Se mantiene la espera dentro de Step a 10000 ms, pero el script no recibe un código de confirmación, falla o tiempo de espera.
- La rama no cumple las condiciones de tiempo de ejecución MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor de UO.Step. Bridge/Player.Walk y el servidor aún verifican el movimiento.
- QueueStep en la transmisión del juego verifica el jugador, la conexión, la dirección, la cola, el tempo y el tráfico local. Antes de Player.Walk, cada llamada registra por separado las generaciones Confirmar/Denegar de su secuencia y Walker; luego devuelve el resultado junto con esta instantánea. Step y pendiente StepControlled verifican solo este par almacenado, no los campos comunes de la siguiente solicitud; el jugador sustituto/Walker finaliza la espera con una negativa general. La confirmación de otro comando regular no confirma este paso. La rotación sin movimiento sigue siendo un caso aparte.
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.
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.Specmove");
UO.Specmove(0);Parámetros y flujo de ejecución:
- Envía una solicitud de un paso directamente al puente.
UO.Specmove(0);Parámetros y flujo de ejecución:
- ExecuteLegacyManualAlias llama a bridge.Step(dirección&7,ejecutando!=0), luego descarta el 1/0 devuelto. Este es un paso, no un camino hacia una coordenada.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}Parámetros y flujo de ejecución:
- La rama no cumple las condiciones de tiempo de ejecución MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor de UO.Step. Bridge/Player.Walk y el servidor aún verifican el movimiento.
Intervalo mínimo de paso: caminar - caminar 400 ms, correr 200 ms; montar a caballo - caminar 200 ms, correr 100 ms.
Estos son límites de cliente estándar, no configuraciones definidas automáticamente para su fragmento. La velocidad del servidor y los modos de vuelo se cuentan por separado. Los temporizadores de guiones pueden ralentizar el movimiento, pero no reducen estos límites.
Los pasos, las rutas, Follow, los controles del mouse/teclas y el mapa utilizan la cola compartida del personaje. Reemplazar la ruta, girar o ajustar la posición por parte del servidor no cancela la pausa restante después de la solicitud del paso. Después del retraso, no hay una ráfaga rápida para compensar los fotogramas perdidos. La espera de confirmación, los obstáculos y la mala comunicación pueden ralentizar el movimiento.
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 before = UO.GetX();
UO.Specmove(2, 0);
UO.Wait(500);
UO.Print(UO.GetX() - before);
return null;
}
}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.
Parámetros: direction (Any)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Parámetros: direction (Any), running (Any)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseAbility(object? abilityId);Solicita la habilidad disponible para el arma actual.
-
abilityId— Nombre de la habilidad o int ID 1..AbilityData.Abilities.Length. Los nombres están normalizados: solo se almacenan y comparan letras/números en mayúsculas. El texto numérico significa ID.
Bandera numérica int: 1 - ID coincide con la habilidad primaria/secundaria del jugador actual y se llama el GameActions correspondiente; 0: ningún jugador, desconocido ID/nombre o habilidad no pertenece al arma actual.
- La forma de cadena usa ResolveAbility; puente numérico inmediato.UseAbility. Enmascara a 0x80 de dos habilidades actuales y combina ID, luego llama a UsePrimaryAbility o UseSecondaryAbility.
- Esto es una aceptación de una solicitud local, no una confirmación de un golpe, gasto de maná o activación por parte del servidor. Los ID disponibles se leen GetWeaponAbilities, el nombre activo es GetActiveAbility.
- GameActions alterna el bit de selección de habilidad 0x80. Una habilidad ya seleccionada envía ID 0 y la deselecciona; de lo contrario, ambos bits de selección se borran, se envía el ID seleccionado y luego su bit se establece localmente. Por lo tanto, volver a llamarlo puede desactivar la capacidad. Un cambio local no significa un acceso exitoso o una confirmación del servidor.
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.
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.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Solicita la habilidad disponible para el arma actual.
UO.Print(UO.UseAbility("Armor Ignore"));Parámetros y flujo de ejecución:
- La forma de cadena usa ResolveAbility; puente numérico inmediato.UseAbility. Enmascara a 0x80 de dos habilidades actuales y combina ID, luego llama a UsePrimaryAbility o UseSecondaryAbility.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.UseAbility(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- Esto es una aceptación de una solicitud local, no una confirmación de un golpe, gasto de maná o activación por parte del servidor. Los ID disponibles se leen GetWeaponAbilities, el nombre activo es GetActiveAbility.
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 id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.UseAbility(id);
UO.Print(accepted);
UO.Print(UO.GetActiveAbility());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
Parámetros: abilityId (Integer/String)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Código interno de implementación; no es un script independiente.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);Parámetros: abilityId (Integer/String)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Código interno de implementación; no es un script independiente.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UsePrimaryAbility();Invoca la habilidad principal del arma.
No hay parámetros.
void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.
- UsePrimaryAbility transmite GameActions.UsePrimaryAbility(_world) a través de Invoke. No se devuelve ningún cartel de aceptación; La capacidad activa se comprueba por separado.
- En los ejemplos, UO.Wait especifica solo una pausa del script; el final de la pausa no prueba que el servidor haya completado la solicitud.
- GameActions alterna el bit de selección de habilidad 0x80. Una habilidad ya seleccionada envía ID 0 y la deselecciona; de lo contrario, ambos bits de selección se borran, se envía el ID seleccionado y luego su bit se establece localmente. Por lo tanto, volver a llamarlo puede desactivar la capacidad. Un cambio local no significa un acceso exitoso o una confirmación del servidor.
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.
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.UsePrimaryAbility");
UO.UsePrimaryAbility();Parámetros y flujo de ejecución:
- Invoca la habilidad principal del arma.
UO.UsePrimaryAbility();Parámetros y flujo de ejecución:
- UsePrimaryAbility transmite GameActions.UsePrimaryAbility(_world) a través de Invoke. No se devuelve ningún cartel de aceptación; La capacidad activa se comprueba por separado.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}Parámetros y flujo de ejecución:
- En los ejemplos, UO.Wait especifica solo una pausa del script; el final de la pausa no prueba que el servidor haya completado la solicitud.
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()
{
UO.UsePrimaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
Código interno de implementación; no es un script independiente.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSecondaryAbility();Invoca una habilidad de arma adicional.
No hay parámetros.
void - sin valor. Llame en una línea separada; la finalización no confirma la acción del servidor.
- UseSecondaryAbility transmite GameActions.UseSecondaryAbility(_world) a través de Invoke. No se devuelve ningún cartel de aceptación; La capacidad activa se comprueba por separado.
- En los ejemplos, UO.Wait especifica solo una pausa del script; el final de la pausa no prueba que el servidor haya completado la solicitud.
- GameActions alterna el bit de selección de habilidad 0x80. Una habilidad ya seleccionada envía ID 0 y la deselecciona; de lo contrario, ambos bits de selección se borran, se envía el ID seleccionado y luego su bit se establece localmente. Por lo tanto, volver a llamarlo puede desactivar la capacidad. Un cambio local no significa un acceso exitoso o una confirmación del servidor.
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.
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.UseSecondaryAbility");
UO.UseSecondaryAbility();Parámetros y flujo de ejecución:
- Invoca una habilidad de arma adicional.
UO.UseSecondaryAbility();Parámetros y flujo de ejecución:
- UseSecondaryAbility transmite GameActions.UseSecondaryAbility(_world) a través de Invoke. No se devuelve ningún cartel de aceptación; La capacidad activa se comprueba por separado.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}Parámetros y flujo de ejecución:
- En los ejemplos, UO.Wait especifica solo una pausa del script; el final de la pausa no prueba que el servidor haya completado la solicitud.
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()
{
UO.UseSecondaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
Código interno de implementación; no es un script independiente.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WarMode();
void UO.WarMode(object? mode);Lee o consulta el modo de combate del personaje.
-
mode- Opcional int: 0 lo deshabilita, cualquier valor distinto de cero lo habilita. El formulario sin argumentos solo lee.
Sin argumentos Bandera numérica int: 1 - Jugador actual en modo combate, 0 - modo pacífico/sin jugador. Con el modo - null, no hay resultado.
- WarMode() lee Player.InWarMode localmente. WarMode(modo) llama a GameActions.ToggleWarMode con el modo seleccionado; sin Jugador la solicitud no se ejecuta.
- No asigne el resultado de un formulario con un argumento a una variable. La relectura inmediata no es una confirmación en línea.
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.
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.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Lee o consulta el modo de combate del personaje.
var active = UO.WarMode();
UO.Print(active);Parámetros y flujo de ejecución:
- WarMode() lee Player.InWarMode localmente. WarMode(modo) llama a GameActions.ToggleWarMode con el modo seleccionado; sin Jugador la solicitud no se ejecuta.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
return null;
}Parámetros y flujo de ejecución:
- No asigne el resultado de un formulario con un argumento a una variable. La relectura inmediata no es una confirmación en línea.
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 before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
Código interno de implementación; no es un script independiente.
public int WarMode() => bridge.WarMode();Parámetros: mode (Integer)
Resultado: void / Unit.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
Código interno de implementación; no es un script independiente.
public void WarMode(int mode) => bridge.WarMode(mode);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WarTargetID();Lee el serial del último objetivo del ataque.
No hay parámetros.
int — guardado serial; 0 significa serial no está instalado. No es bool ni graphic/type; Es posible que un ID distinto de cero ya no exista en el mundo.
- Fuente de campo: puente.LastAttack. El comando no selecciona, usa ni ataca el objeto.
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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.
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.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Lee el serial del último objetivo del ataque.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Parámetros y flujo de ejecución:
- Fuente de campo: puente.LastAttack. El comando no selecciona, usa ni ataca el objeto.
return RunScenario();
object? RunScenario()
{
var id = UO.WarTargetID();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Parámetros y flujo de ejecución:
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
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 before = UO.WarTargetID();
UO.Wait(500);
var after = UO.WarTargetID();
UO.Print(before = after);
return null;
}
}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.
Parámetros: Sin parámetros.
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Código interno de implementación; no es un script independiente.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ClassicUO — Bad Newbie & C# Scripts IDE