ES UO Topic world geometry Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Inicio · C# · IDE · UO API · A–Z · Ejemplos · Idiomas
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetZ();
int UO.GetZ(object? id);Lee el campo Z del objeto cargado o carácter actual.
-
ides el Serie/ID del objeto, no graphic/type. Número, cadena hexadecimal, nombre estándar self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse o nombre AddObject. Se debe establecer el alias; La existencia se verifica mediante Exists. El formulario registrado sin argumentos utiliza self.
int es la altura de Z. Para un objeto desconocido, se devuelve 0. El cero también es una coordenada válida. Height can be negative; Esta no es una capa de equipo ni un índice estático.
- Se leen los últimos datos ya conocidos por el cliente; la solicitud de actualización no se envía al servidor.
- Un objeto desconocido y una propiedad que aún no se ha recuperado pueden tener un valor nulo/vacío. Marque Exists y las condiciones de una acción en particular.
- Para un personaje u objeto en tierra, esta es la coordenada mundial. El artículo dentro del contenedor tiene una posición X/Y dentro del chicle; el comando no los traduce a las coordenadas mundiales del propietario.
- Se lee la coordenada actual del objeto. Los pasos en espera de confirmación no se convierten en cálculos de ruta mediante este comando.
int z = UO.GetZ();
UO.Print($"Z = {z}");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.GetZ();
UO.Print("GetZ: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- El formulario sin argumento selecciona self, el carácter actual.
- La posición contiene la altura de Z, no serial.
var position = UO.GetZ();
UO.Print("Z: " + Convert.ToString(position));Parámetros y flujo de ejecución:
- lasttarget debe apuntar al personaje o elemento cargado en el suelo.
- delta: diferencia a lo largo de un eje. No es la longitud del recorrido; el valor puede ser negativo.
return RunScenario();
object? RunScenario()
{
var other = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(other)))
{
var delta = UO.GetZ(other) - UO.GetZ();
UO.Print("Difference: " + Convert.ToString(delta));
}
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="self" es una forma explícita de selección de caracteres. UO.Wait=500 milisegundos.
- La comparación muestra el cambio únicamente en el eje Z. Aquí no se tienen en cuenta los cambios en el otro eje ni la rotación.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.GetZ("self");
await Delay(500);
var after = UO.GetZ("self");
if (Truth(before != after))
{
UO.Print("Coordinate changed");
}
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: Sin parámetros.
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ("self").
Código interno de implementación; no es un script independiente.
public int GetZ() => GetZ("self");Parámetros: id (Any/Integer/String)
Resultado: int / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Código interno de implementación; no es un script independiente.
case "getz": return new InjectionValue(bridge.GetZ(Arg(0, bridge.Self)));Parámetros: id (Any/Integer/String)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id).
Código interno de implementación; no es un script independiente.
public int GetZ(int id) => bridge.GetZ(id);Parámetros: id (Any/Integer/String)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Código interno de implementación; no es un script independiente.
public int GetZ(string id) => GetZ(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsMineTile(object? x, object? y);Comprueba las características de una celda con los datos del mapa local.
-
x— int X celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla. -
y— int Y celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla.
Indicador numérico int: 1: se encontró un objeto que coincidía con la condición; 0 - no existe tal objeto o la celda/tarjeta es inaccesible.
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsMineTile: Estática/Multi con StaticFilters.IsRock o un nombre que contenga cueva, montaña o roca, sin distinguir entre mayúsculas y minúsculas.
- La verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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.IsMineTile(UO.GetX(), UO.GetY());
UO.Print("IsMineTile: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Comprueba las características de una celda con los datos del mapa local.
UO.Print(UO.IsMineTile(UO.GetX(), UO.GetY()));Parámetros y flujo de ejecución:
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsMineTile: Estática/Multi con StaticFilters.IsRock o un nombre que contenga cueva, montaña o roca, sin distinguir entre mayúsculas y minúsculas.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsMineTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
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 verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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 x = UO.GetX();
var y = UO.GetY();
var before = UO.IsMineTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsMineTile(x, y));
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: x (Any), y (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.IsMineTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMineTile:bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Código interno de implementación; no es un script independiente.
public int IsMineTile(InjectionValue x, InjectionValue y) => bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsTreeTile(object? x, object? y);Comprueba las características de una celda con los datos del mapa local.
-
x— int X celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla. -
y— int Y celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla.
Indicador numérico int: 1: se encontró un objeto que coincidía con la condición; 0 - no existe tal objeto o la celda/tarjeta es inaccesible.
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsTreeTile: Estática/Multi reconocida por StaticFilters.IsTree.
- La verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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.IsTreeTile(UO.GetX(), UO.GetY());
UO.Print("IsTreeTile: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Comprueba las características de una celda con los datos del mapa local.
UO.Print(UO.IsTreeTile(UO.GetX(), UO.GetY()));Parámetros y flujo de ejecución:
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsTreeTile: Estática/Multi reconocida por StaticFilters.IsTree.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsTreeTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
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 verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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 x = UO.GetX();
var y = UO.GetY();
var before = UO.IsTreeTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsTreeTile(x, y));
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: x (Any), y (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.IsTreeTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTreeTile:bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Código interno de implementación; no es un script independiente.
public int IsTreeTile(InjectionValue x, InjectionValue y) => bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsWaterTile(object? x, object? y);Comprueba las características de una celda con los datos del mapa local.
-
x— int X celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla. -
y— int Y celdas de la tarjeta actual; coordenada mundial, no un píxel de pantalla.
Indicador numérico int: 1: se encontró un objeto que coincidía con la condición; 0 - no existe tal objeto o la celda/tarjeta es inaccesible.
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsWaterTile: Aterrizar con TileData.IsWet o un objeto con estática válida graphic y bandera IsWet.
- La verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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.IsWaterTile(UO.GetX(), UO.GetY());
UO.Print("IsWaterTile: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Comprueba las características de una celda con los datos del mapa local.
UO.Print(UO.IsWaterTile(UO.GetX(), UO.GetY()));Parámetros y flujo de ejecución:
- AnyTileAt omite la cadena TNext de la celda cargada. Condición IsWaterTile: Aterrizar con TileData.IsWet o un objeto con estática válida graphic y bandera IsWet.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsWaterTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
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 verificación describe los filtros/datos de mosaico locales. No promete la disponibilidad de un recurso minado, capacidad para cruzar el país, alcance o permiso del servidor para minar.
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 x = UO.GetX();
var y = UO.GetY();
var before = UO.IsWaterTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsWaterTile(x, y));
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: x (Any), y (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.IsWaterTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWaterTile:bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Código interno de implementación; no es un script independiente.
public int IsWaterTile(InjectionValue x, InjectionValue y) => bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.IsWorldCellPassable(object? currX, object? currY, object? currZ, object? destX, object? destY, object? destZ, object? worldNum);Comprueba una transición a una celda del mundo adyacente y devuelve la bandera transitable junto con la altura.
-
currX— Coordenada mundial X obligatoria de la celda de origen. Entero 0..65535 dentro del mapa cargado; esta no es una coordenada gump. -
currY— Coordenada mundial Y obligatoria de la celda de origen. Entero 0..65535 dentro del mapa cargado; esta no es una coordenada gump. -
currZ— Altura inicial obligatoria −128...127. Esta es la altura del mundo, no el número del piso. La altura no válida se rechaza y no se recorta. -
destX— Coordenada mundial X obligatoria de la celda objetivo. Entero 0..65535 dentro del mapa cargado; esta no es una coordenada gump. -
destY— Coordenada mundial Y obligatoria de la celda objetivo. Entero 0..65535 dentro del mapa cargado; esta no es una coordenada gump. -
destZ— Entrada obligatoria Z de repuesto, normalmente CurrZ. Esto no es una var: la variable no cambia y no establece el mínimo requerido. Lea la altura calculada del resultado [1]. Este puente siempre vuelve a su altura; el argumento es necesario para la compatibilidad con la forma Pascal. -
worldNum— Número de tarjeta obligatorio: UO.WorldNum(). Sólo se comprueba el mapa actual con dimensiones conocidas; El otro mapa no se carga.
Conjunto de dos int: [0] - transitabilidad, 1 (condición cumplida), 0 (condición no cumplida); [1] - calculado Z. Sólo el primer elemento es lógico. La matriz en sí no se puede comparar con true. La altura 0/negativa es aceptable; para [0]=0 la altura no prueba la accesibilidad. Rechazar argumentos devuelve [0, CurrZ].
- Sin movimiento, puertas que se abren, puntos de mira o paquetes de red. Se lee la geometría local existente; el servidor puede posteriormente rechazar el paso. Dos solicitudes pueden ver estados diferentes.
- Se acepta la celda adyacente (la diferencia X/Y no es mayor que 1). Un objetivo más lejano, ir más allá del mapa, ausencia de un personaje/tarjeta y IsDestroyed dar un rechazo antes del cálculo. Para una ruta completa, utilice GetPathArray o NewMoveXY.
- El mismo X/Y válido da [1, CurrZ] sin verificación de colisión: no se necesita ningún paso. Esta no es una prueba de la capacidad de escapar de la jaula. La condición del personaje y las reglas actuales de Pathfinder afectan el paso adyacente; sin geometría cargada puede ser rechazado.
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.IsWorldCellPassable(UO.GetX(), UO.GetY(), UO.GetZ(), UO.GetX() + 1, UO.GetY(), UO.GetZ(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- x/y/z es la posición inicial, x+1/y es la celda adyacente, el sexto parámetro z es la Z de repuesto, el último es la tarjeta actual. El resultado [0] se verifica antes de usar el resultado [1].
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
UO.Print("Blocked");
}
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:
- proposedZ permanece 0 después de llamar. targetZ se toma del resultado[1], no del argumento. En caso de fallo, el ejemplo no hace inferencias sobre la altura.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var proposedZ = 0;
var result = UO.IsWorldCellPassable(x, y, z, x, y + 1, proposedZ, UO.WorldNum());
if (Truth(result[0] == 1))
{
var targetZ = result[1];
UO.Print("Input=" + Convert.ToString(proposedZ) + "; result=" + Convert.ToString(targetZ));
}
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:
- El asistente completo debajo de Principal acepta la fuente X/Y/Z, el destino X/Y y el mapa. Agrega el sexto argumento requerido y devuelve solo int 1/0, no una matriz. Por tanto, el resultado de IsCellOpen se puede comparar con true. El código no mueve el personaje.
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 x = UO.GetX();
var y = UO.GetY();
var openCell = IsCellOpen(x, y, UO.GetZ(), x + 1, y + 1, UO.WorldNum());
if (Truth(Truth(openCell) == true))
{
UO.Print("Diagonal cell is locally passable");
}
return null;
}
dynamic IsCellOpen(dynamic x, dynamic y, dynamic z, dynamic toX, dynamic toY, dynamic map)
{
var cellResult = UO.IsWorldCellPassable(x, y, z, toX, toY, z, map);
if (Truth(ArrayLength(cellResult) != 2))
{
return 0;
}
return cellResult[0];
}
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.
UO.IsWorldCellPassable(currX, currY, currZ, destX, destY, destZ, worldNum) — UO.IsWorldCellPassable(Any,Any,Any,Any,Any,Any,Any)
Parámetros: currX (Any), currY (Any), currZ (Any), destX (Any), destY (Any), destZ (Any), worldNum (Any)
Resultado: dynamic / Array.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(5). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(6)).
Código interno de implementación; no es un script independiente.
case "isworldcellpassable":
{
int destinationZFallback = Arg(5);
int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(6));
int passable = step.Length > 0 ? step[0] : 0;
int destinationZ = step.Length > 1 ? step[1] : destinationZFallback;
return new InjectionValue(new[] { new InjectionValue(passable), new InjectionValue(destinationZ) });
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LOSOptions();
dynamic UO.LOSOptions(object? value);Lee o guarda la máscara de parámetro local LOS tiempo de ejecución.
-
value- Opcional int; sin argumento solo lectura. En este hilo, el rango y los bits individuales no se verifican. El menor byte (valor & 0xFF) selecciona el algoritmo 1..4; otros valores del menor byte en CheckLosCell usan el algoritmo 3. Los algoritmos 1/2 bloquean Muro e Intransitable, 3 bloquean adicionalmente NoShoot y 4 habilitan NoShoot solo con 0x200 y permiten obstáculos de ventana solo con 0x400. El bit 0x100 comprueba además ambas celdas laterales de cada paso del haz diagonal para detectar cualquier algoritmo seleccionado. value=0 desactiva las comprobaciones adicionales CheckLosCell/diagonal, pero BadLocations y CheckWorldStep permanecen. Por ejemplo, 4+0x100+0x200+0x400 selecciona personalizado con tres indicadores; setter conserva el algoritmo int original, no normalizado.
int - estado.LosOptions después de una posible escritura. Este es un código/máscara de parámetro, no un bool ni el resultado de una verificación de visibilidad.
- ExecuteClientApiCompatibility asigna estado. LosOptions se le da un argumento y devuelve el mismo campo. La llamada no ejecuta CheckLOS y no verifica las paredes.
- La configuración pertenece al tiempo de ejecución. No garantiza la visibilidad del servidor y no es una forma de sortear obstáculos.
- En un host de cliente normal, estos datos de estado se toman del administrador GetPersistentState y son comunes a los scripts/chat/macros del mismo mundo/perfil, y no pertenecen a un solo script. Otro proceso o un InjectionRuntimeState aparentemente separado tiene un estado diferente. Cargar/borrar un perfil puede reemplazarlo; guardados serial todavía se comparan con el mundo cargado.
- Menor byte (valor & 0xFF) selecciona el algoritmo 1..4; otros valores del menor byte en CheckLosCell usan el algoritmo 3. Los algoritmos 1/2 bloquean Muro e Intransitable, 3 además NoShoot y 4 habilita NoShoot solo con 0x200 y permite obstáculos de ventana solo con 0x400. El bit 0x100 además verifica ambas celdas laterales de cada paso de haz diagonal para cualquier algoritmo seleccionado. value=0 desactiva las comprobaciones adicionales CheckLosCell/diagonal, pero BadLocations y CheckWorldStep permanecen. Por ejemplo, 4+0x100+0x200+0x400 selecciona personalizado con tres indicadores; setter conserva el algoritmo int original, no normalizado.
- Un haz de longitud distinta de cero lee solo el _world.Map/World.Map actualmente cargado: a través de CheckWorldStep necesitas WorldNum == _world.MapIndex y un Player.Pathfinder en vivo. Otra faceta no se carga ni se solicita; no hay mapa/personaje/buscatrazos o el paso no está disponible - 0. Excluir X/Y idéntico omite todo el ciclo de celdas: con X/Y en 0..65535, WorldNum en 0..255 y abs(Zfrom-Zto)<=20 devuelve 1 incluso sin una tarjeta cargada o con un número de tarjeta diferente. Esta no es una prueba de geometría o accesibilidad. El resultado es una solución de servidor local, no LOS.
- CheckLosCell omite el Land/Static/Multi/Item cargado de una celda. Bloques de tierra intransitables con abs(rayZ-land.Z)<=20. Los indicadores Estático/Multi/Elemento solo son válidos en el rango mosaico.Z-2 .. mosaico.Z+max(1,Height)+2; La ventana personalizada permitida se omite hasta que se marca Muro/Intransitable/NoShoot. El haz X/Y utiliza Bresenham, pasos máximos de 4096; Z se toma de las superficies CheckWorldStep, no se interpola a Zto, la tolerancia de altura final es 20.
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.LOSOptions();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Lee o guarda la máscara de parámetro local LOS tiempo de ejecución.
UO.Print(UO.LOSOptions());Parámetros y flujo de ejecución:
- ExecuteClientApiCompatibility asigna estado. LosOptions se le da un argumento y devuelve el mismo campo. La llamada no ejecuta CheckLOS y no verifica las paredes.
return RunScenario();
object? RunScenario()
{
var before = UO.LOSOptions();
UO.Print(UO.LOSOptions(0));
UO.LOSOptions(before);
return null;
}Parámetros y flujo de ejecución:
- La configuración pertenece al tiempo de ejecución. No garantiza la visibilidad del servidor y no es una forma de sortear obstáculos.
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 original = UO.LOSOptions();
UO.LOSOptions(original);
UO.Print(Convert.ToString(UO.LOSOptions() == original));
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. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);Parámetros: value (Any)
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.PrivateGetTile(object? x, object? y, object? unknown, object? minTile, object? maxTile);Busca el primer graphic en el rango dado en la celda local.
-
x— coordenadas mundiales int del mapa actual. -
y— coordenadas mundiales int del mapa actual. -
unknown: el parámetro heredado int se conserva en la sintaxis, pero el puente no lo utiliza. -
minTile- int límites inclusivos graphic. El orden no cambia automáticamente; minTile>maxTile no coincide. -
maxTile- int límites inclusivos graphic. El orden no cambia automáticamente; minTile>maxTile no coincide.
string "0xXXXX" del primer graphic coincidente; "0x0000": no hay coincidencias o el mapa no está cargado. El graphic=0 real también tiene esta representación.
- PrivateGetTile atraviesa la cadena TNext de todos los objetos de celda en el orden del mapa y compara graphic>=minTile && graphic<=maxTile. Solo Estático no filtra y no tiene en cuenta hue/altura.
- Sin solicitud de Pathfinder/servidor. Para una geometría estructurada precisa, utilice GetWorldCell/ReadStaticsXY. El guardia de una carta faltante devuelve el centinela anterior que no coincidió.
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.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
UO.Print("PrivateGetTile: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Busca el primer graphic en el rango dado en la celda local.
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535));Parámetros y flujo de ejecución:
- PrivateGetTile atraviesa la cadena TNext de todos los objetos de celda en el orden del mapa y compara graphic>=minTile && graphic<=maxTile. Solo Estático no filtra y no tiene en cuenta hue/altura.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0x0E21, 0x0E21));
return null;
}Parámetros y flujo de ejecución:
- Sin solicitud de Pathfinder/servidor. Para una geometría estructurada precisa, utilice GetWorldCell/ReadStaticsXY. El guardia de una carta faltante devuelve el centinela anterior que no coincidió.
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 tile = UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
if (Truth(tile != "0x0000"))
{
UO.Print(tile);
}
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.
UO.PrivateGetTile(x, y, unknown, minTile, maxTile) — UO.PrivateGetTile(Integer,Integer,Integer,Integer,Integer)
Parámetros: x (Integer), y (Integer), unknown (Integer), minTile (Integer), maxTile (Integer)
Resultado: string / String.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.PrivateGetTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PrivateGetTile:bridge.PrivateGetTile(x, y, unknown, minTile, maxTile).
Código interno de implementación; no es un script independiente.
public string PrivateGetTile(int x, int y, int unknown, int minTile, int maxTile)
=> bridge.PrivateGetTile(x, y, unknown, minTile, maxTile);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ReadStaticsXY(object? x, object? y, object? worldNum);Lee registros estáticos planos de la tarjeta actual en la celda.
-
x— coordenadas mundiales int de la celda. -
y— coordenadas mundiales int de la celda. -
worldNum— número int de la tarjeta actual. Otro mapa no se carga y muestra una matriz vacía.
Matriz int, triples [graphic, Z, hue, graphic, Z, hue, ...]. Sin mapa/no coincide WorldNum es una matriz vacía.
- Puente.GetStaticTiles incluye Estático, Multi y Elemento de la cadena TNext de la celda; La tierra está excluida. Este no es un registro Pascal ni una matriz de registros anidados de tres elementos.
- Número de registros = ArrayLength(resultado)/3. Sólo se leen los datos descargados; no hay solicitudes de geometría desconocida al 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.
object? result = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Lee registros estáticos planos de la tarjeta actual en la celda.
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(UO.GetArrayLength(records) / 3);Parámetros y flujo de ejecución:
- Puente.GetStaticTiles incluye Estático, Multi y Elemento de la cadena TNext de la celda; La tierra está excluida. Este no es un registro Pascal ni una matriz de registros anidados de tres elementos.
return RunScenario();
object? RunScenario()
{
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(UO.GetArrayLength(records) >= 3))
{
UO.Print(records[0]);
UO.Print(records[1]);
UO.Print(records[2]);
}
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:
- Número de registros = ArrayLength(resultado)/3. Sólo se leen los datos descargados; no hay solicitudes de geometría desconocida al servidor.
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 map = UO.WorldNum();
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), map);
var i = 0;
while (Truth(i + 2 < UO.GetArrayLength(records)))
{
UO.Print(Convert.ToString(records[i]) + " " + Convert.ToString(records[i + 1]) + " " + Convert.ToString(records[i + 2]));
i = i + 3;
}
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: x (Any), y (Any), worldNum (Any)
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Código interno de implementación; no es un script independiente.
case "readstaticsxy":
return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.RemoveUserStatic(object? id);Elimina el registro estático del usuario en ID.
-
id- int ID, devuelto AddUserStatic; no graphic/type.
Indicador numérico int: 1: el registro se eliminó, 0: faltaba ID.
- Primer estado.UserStatics.Remove; solo si la eliminación se realiza correctamente, se llama a bridge.RemoveUserStatic(id). La eliminación no se aplica a los archivos de mapas estáticos estándar.
- La geometría personalizada local se elimina del estado actual. Los elementos del servidor y otros elementos ID no cambian.
- En un host de cliente normal, estos datos de estado se toman del administrador GetPersistentState y son comunes a los scripts/chat/macros del mismo mundo/perfil, y no pertenecen a un solo script. Otro proceso o un InjectionRuntimeState aparentemente separado tiene un estado diferente. Cargar/borrar un perfil puede reemplazarlo; guardados serial todavía se comparan con el mundo cargado.
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.RemoveUserStatic(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- Elimina el registro estático del usuario en ID.
UO.Print(UO.RemoveUserStatic(1));Parámetros y flujo de ejecución:
- Primer estado.UserStatics.Remove; solo si la eliminación se realiza correctamente, se llama a bridge.RemoveUserStatic(id). La eliminación no se aplica a los archivos de mapas estáticos estándar.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.UserStaticExists(1)))
{
UO.Print(UO.RemoveUserStatic(1));
}
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 geometría personalizada local se elimina del estado actual. Los elementos del servidor y otros elementos ID no cambian.
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 records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
var id = records[0][0];
UO.Print(UO.RemoveUserStatic(id));
UO.Print(UO.UserStaticExists(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: id (Any)
Resultado: dynamic / Any.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RemoveUserStatic:bridge.RemoveUserStatic(id).
Código interno de implementación; no es un script independiente.
case "removeuserstatic":
{
int id = Arg(0);
bool removed = state.UserStatics.Remove(id);
if (removed) bridge.RemoveUserStatic(id);
return new InjectionValue(removed ? 1 : 0);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UserStaticExists(object? id);Comprueba la presencia de ID en los registros estáticos del usuario.
-
id— int ID AddUserStatic; no graphic/type y no serial.
Bandera numérica int: 1: la clave está en el estado. UserStatics, 0 - ausente.
- Sólo ContainsKey está marcado en el diccionario de tiempo de ejecución. No se verifican la visibilidad de un objeto en el mapa, la creación exitosa de un objeto puente y el mundo del servidor.
- Lee el estado local actual. No hay paquete, objetivo o actualización automática; las lecturas individuales pueden ver diferentes estados.
- En un host de cliente normal, estos datos de estado se toman del administrador GetPersistentState y son comunes a los scripts/chat/macros del mismo mundo/perfil, y no pertenecen a un solo script. Otro proceso o un InjectionRuntimeState aparentemente separado tiene un estado diferente. Cargar/borrar un perfil puede reemplazarlo; guardados serial todavía se comparan con el mundo cargado.
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.UserStaticExists(1);
UO.Print("UserStaticExists: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- Comprueba la presencia de ID en los registros estáticos del usuario.
UO.Print(UO.UserStaticExists(1));Parámetros y flujo de ejecución:
- Sólo ContainsKey está marcado en el diccionario de tiempo de ejecución. No se verifican la visibilidad de un objeto en el mapa, la creación exitosa de un objeto puente y el mundo del servidor.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.UserStaticExists(1)))
{
UO.Print(UO.GetUserStatic(1));
}
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 records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
UO.Print(UO.UserStaticExists(records[0][0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue 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: id (Any)
Resultado: int / Integer.
Durante la llamada:
-
InjectionScript.Runtime.InjectionApiUO.UserStaticExists. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
Código interno de implementación; no es un script independiente.
public int UserStaticExists(InjectionValue id)
=> state.UserStatics.ContainsKey(NumberConversions.ToInt(id)) ? 1 : 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WorldNum();Lee el número de tarjeta actual del modelo del cliente.
No hay parámetros.
int — índice de la tarjeta actual del cliente, normalmente 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. El servidor de usuario puede utilizar un juego de tarjetas diferente. 0 es un mapa completo, no una señal de error.
- Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
- C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
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.WorldNum();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parámetros y flujo de ejecución:
- La llamada sin argumentos hace referencia a self. El número de tarjeta actual se almacena en valor.
- Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.WorldNum();
UO.Print("WorldNum: " + Convert.ToString(value));Parámetros y flujo de ejecución:
- El valor se lee una vez sin ningún argumento. El número de tarjeta actual se utiliza en el cálculo o condición que se muestra.
- Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return RunScenario();
object? RunScenario()
{
var value = UO.WorldNum();
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Parámetros y flujo de ejecución:
- Ambas llamadas sin argumento leen su valor actual. UO.Wait(1000) da una pausa de milisegundos entre disparos.
- El cambio comparado es el número de la tarjeta actual. Un ejemplo no cambia nada en el mundo y no espera sin cesar. Es posible que se pierdan los eventos ocurridos dentro de este segundo.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.WorldNum();
await Delay(1000);
var after = UO.WorldNum();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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.WorldNumber:bridge.WorldNumber.
Código interno de implementación; no es un script independiente.
case "worldnum": return new InjectionValue(bridge.WorldNumber);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.X();Lee la coordenada X del modelo del cliente.
No hay parámetros.
int es la coordenada X del objeto cargado. Para un personaje/elemento mundial, esta es la celda del mundo; para un artículo en la bolsa, esta es la coordenada dentro del contenedor. Un objeto desconocido da 0, pero X=0 también es válido.
- Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
- C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
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.X();
UO.Print("X: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- La llamada sin argumentos hace referencia a self. La coordenada x se almacena en valor.
- Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.X();
UO.Print("X: " + Convert.ToString(value));Parámetros y flujo de ejecución:
- El valor se lee una vez sin ningún argumento. La coordenada x se utiliza en el cálculo o condición que se muestra.
- Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return RunScenario();
object? RunScenario()
{
var value = UO.X();
UO.Print("Two tiles east would be X=" + Convert.ToString(value + 2));
return null;
}Parámetros y flujo de ejecución:
- Ambas llamadas sin argumento leen su valor actual. UO.Wait(1000) da una pausa de milisegundos entre disparos.
- Se compara el cambio: la coordenada X. El ejemplo no cambia nada en el mundo y no espera indefinidamente. Es posible que se pierdan los eventos ocurridos dentro de este segundo.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.X();
await Delay(1000);
var after = UO.X();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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.RegisterCharacterGetterAliases [X]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.
Código interno de implementación; no es un script independiente.
() => bridge.GetX(bridge.Self)Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Y();Lee la coordenada Y del modelo del cliente.
No hay parámetros.
int: coordenada Y del objeto cargado. Para un personaje/elemento mundial, esta es la celda del mundo, para un elemento en la bolsa, esta es la posición dentro del contenedor. Un objeto desconocido da 0.
- Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
- C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
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.Y();
UO.Print("Y: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- La llamada sin argumentos hace referencia a self. La coordenada y se almacena en valor.
- Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.Y();
UO.Print("Y: " + Convert.ToString(value));Parámetros y flujo de ejecución:
- El valor se lee una vez sin ningún argumento. La coordenada y se utiliza en el cálculo o condición que se muestra.
- Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return RunScenario();
object? RunScenario()
{
var value = UO.Y();
UO.Print("Two tiles south would be Y=" + Convert.ToString(value + 2));
return null;
}Parámetros y flujo de ejecución:
- Ambas llamadas sin argumento leen su valor actual. UO.Wait(1000) da una pausa de milisegundos entre disparos.
- Se compara el cambio: la coordenada Y. El ejemplo no cambia nada en el mundo y no espera indefinidamente. Es posible que se pierdan los eventos ocurridos dentro de este segundo.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Y();
await Delay(1000);
var after = UO.Y();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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.RegisterCharacterGetterAliases [Y]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.
Código interno de implementación; no es un script independiente.
() => bridge.GetY(bridge.Self)Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Z();Lee la altura Z del modelo del cliente.
No hay parámetros.
int es la altura del objeto en unidades mundiales, generalmente -128...127. Este no es un número de piso ni una capa de equipo. 0 puede ser la altura real o el resultado de la ausencia de un objeto.
- Se leen los datos locales ya recibidos. La solicitud no abre el estado y no obliga al servidor a enviar una actualización. Después de la muerte, la transición del mapa o la eliminación de un objeto, los valores pueden cambiar entre dos llamadas.
- C# distingue mayúsculas y minúsculas. Use el nombre UO exacto. Compare indicadores numéricos con 0; use bool solo si la firma devuelve bool.
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.Z();
UO.Print("Z: " + Convert.ToString(result));Parámetros y flujo de ejecución:
- La llamada sin argumentos hace referencia a self. La altura z se almacena en valor.
- Convertir.ToString convierte el número que se generará y no cambia el significado del resultado.
var value = UO.Z();
UO.Print("Z: " + Convert.ToString(value));Parámetros y flujo de ejecución:
- El valor se lee una vez sin ningún argumento. La altura z se utiliza en el cálculo o condición que se muestra.
- Los umbrales numéricos son ejemplos de condiciones de script y no de límites de nuevos clientes. El campo almacena las unidades de servidor y las restricciones descritas anteriormente.
return RunScenario();
object? RunScenario()
{
var value = UO.Z();
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
UO.Print("Height above land: " + Convert.ToString(value - land[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;Parámetros y flujo de ejecución:
- Ambas llamadas sin argumento leen su valor actual. UO.Wait(1000) da una pausa de milisegundos entre disparos.
- El cambio comparado es la altura Z. El ejemplo no cambia nada en el mundo y no espera indefinidamente. Es posible que se pierdan los eventos ocurridos dentro de este segundo.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Z();
await Delay(1000);
var after = UO.Z();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}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.RegisterCharacterGetterAliases [Z]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
La llamada ejecuta el delegate del controlador guardado. El método de registro crea ese delegate al construir la API.
Código interno de implementación; no es un script independiente.
() => bridge.GetZ(bridge.Self)Creación de API: Estas funciones registran la API. No se ejecutan de nuevo en cada llamada al comando.