Objetivos de Elite Script
Los objetivos seleccionan las entidades o ubicaciones que usan las acciones, condiciones y zonas. Escribe Target como un mapa YAML. Los valores predeterminados son SELF para targetType, 20.0 para range y true para track. Los nombres de campo no distinguen mayúsculas de minúsculas, pero los valores enumerados de tipo de objetivo deben estar en mayúsculas.
Tipos de objetivo
Los tipos de objetivo establecen qué entidades o ubicaciones son seleccionadas por un script.
DIRECT_TARGET es la entidad del evento: puede ser una élite atacante, una entidad que cruza una zona o un jugador. Úsalo solo con un evento compatible; sin un objetivo directo no selecciona nada. No es automáticamente el objetivo de combate actual del jefe. Los tipos cercanos buscan en una caja alineada con los ejes alrededor del jefe y no ordenan por distancia.
Los objetivos de entidad pueden proporcionar la ubicación actual de sus pies a las acciones de ubicación. La conversión inversa no es automática: LOCATION, LOCATIONS y LANDING_LOCATION no seleccionan las entidades presentes allí. Crea una zona para encontrarlas. Los selectores de jugadores no excluyen por sí mismos a espectadores ni a jugadores de otros encuentros; cada acción puede aplicar reglas adicionales.
| Tipo de objetivo | Detalles | Especial |
|---|---|---|
NEARBY_PLAYERS | Jugadores dentro del rango | range opcional, predeterminado 20.0 |
NEARBY_MOBS | Entidades vivas que no son jugadores dentro del rango, excluyendo al jefe | range opcional, predeterminado 20.0 |
NEARBY_ELITES | Élites registradas dentro del rango, excluyendo al jefe | range opcional, predeterminado 20.0 |
WORLD_PLAYERS | Jugadores en el mundo | ❌ |
ALL_PLAYERS | Jugadores en el servidor | ❌ |
DIRECT_TARGET | La entidad proporcionada por el evento | Requiere un evento compatible |
SELF | Elite que usa el poder | ❌ |
SELF_SPAWN | Ubicación de aparición guardada del jefe para acciones de ubicación | Las acciones de entidad siguen recibiendo al propio jefe |
LOCATION | Ubicación específica | Requiere location |
LOCATIONS | Varias ubicaciones específicas | Requiere locations |
ZONE_FULL | Objetivos dentro de la zona | Requiere Zone |
ZONE_BORDER | Objetivos en el borde de la zona | Requiere Zone |
ACTION_TARGET | Usa el contexto del objetivo de la acción que lo contiene | Solo para condiciones de acción con FILTERING y vectores relativos; no es un objetivo de acción independiente |
LANDING_LOCATION | Selecciona la ubicación donde aterrizó un bloque o entidad. | ¡Solo se puede usar en los landingScripts de las acciones SPAWN_FALLING_BLOCK y SUMMON_ENTITY! |
INHERIT_SCRIPT_TARGET | Hereda el objetivo del script que ejecuta este script | ¡Solo se puede ejecutar si el script fue llamado por otro script! |
INHERIT_SCRIPT_ZONE_FULL | Objetivos dentro de la zona heredada del script que ejecuta este script | Requiere Zone ¡en el script que llama a este script! |
INHERIT_SCRIPT_ZONE_BORDER | Objetivos en el borde de la zona heredada del script que ejecuta este script | Requiere Zone ¡en el script que llama a este script! |
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: ALL_PLAYERS
sValue: "&2Hello World!"
Esto envía un mensaje al objetivo. Dado que el objetivo está establecido en ALL_PLAYERS, enviará ese mensaje a todos los jugadores en línea.
Atributos compartidos
Estos ajustes se aplican al resolver ubicaciones de destino. No mueven entidades ni cambian qué entidad recibe una acción.
| Valores | Detalles | Especial |
|---|---|---|
offset | Establece el desplazamiento para la ubicación del objetivo. | ¡No puede seleccionar entidades! |
relativeOffset | Desplaza las ubicaciones mediante una definición de vector relativo. Sus objetivos de origen y destino determinan la dirección. | ¡No puede seleccionar entidades! |
Los desplazamientos se aplican a las ubicaciones derivadas de objetivos de entidad, como SELF y DIRECT_TARGET, a SELF_SPAWN, LOCATION y LOCATIONS, y a cada ubicación muestreada de una zona mediante ZONE_FULL, ZONE_BORDER y sus variantes heredadas. Para mover la zona completa, aplica el desplazamiento al Target de la propia zona, como en los ejemplos de abajo. Las mismas reglas se aplican en las utilidades de scripts de Lua.
offset usa los ejes X/Y/Z del mundo, no la dirección de mirada. Se aplica antes de relativeOffset. Los resultados de LANDING_LOCATION e INHERIT_SCRIPT_TARGET omiten estos desplazamientos adicionales. Dentro de un vector relativo, ACTION_TARGET usa directamente la ubicación de acción recibida e ignora sus propios ajustes de desplazamiento.
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
Esto lanza un rayo 2 bloques por encima del jefe. STRIKE_LIGHTNING selecciona ubicaciones, por lo que admite un desplazamiento. El rayo es solo visual y no daña a las entidades.
No puedes establecer un desplazamiento para enviar un mensaje, ya que los mensajes se envían a los jugadores. Sin embargo, sí puedes establecer un desplazamiento a una zona que luego pueda seleccionar entidades.
range
Define la mitad del ancho de la caja de búsqueda para NEARBY_PLAYERS, NEARBY_MOBS y NEARBY_ELITES. Se usa en los ejes X, Y y Z; no es un límite esférico de distancia. Las búsquedas de mobs y élites excluyen al jefe que ejecuta el poder.
Usa un número fijo no negativo para obtener una caja consistente. Un intervalo con ~ puede muestrearse por separado en cada eje y usa el muestreo decimal descrito en coverage; no garantiza un cubo con un único radio aleatorio.
| Valores | Detalles | Predeterminado |
|---|---|---|
range | Mitad del ancho en bloques para búsquedas de jugadores, mobs y élites cercanos. | 20.0 |
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"
Al morir el jefe, envía un mensaje a los jugadores de la caja que se extiende 25 bloques en cada eje desde su posición.
location
Establece la ubicación para el tipo de objetivo LOCATION.
| Valores | Detalles | Predeterminado |
|---|---|---|
location | Establece la ubicación del mundo que será seleccionada. | none |
El formato es location: worldname,x,y,z,yaw,pitch. También admite worldname,x,y,z, con yaw y pitch predeterminados a 0, y x,y,z,yaw,pitch sin mundo, aunque este último deja la ubicación sin mundo y rara vez resulta útil. Solo tres valores x,y,z no son válidos y generan Attempted to deserialize an invalid location! en consola.
Usa un mundo cargado o same_as_boss. El análisis no carga mundos; un formato incorrecto o un mundo sin resolver pueden fallar al usar el objetivo. Las coordenadas son absolutas, incluso con same_as_boss: ese marcador solo cambia el mundo.
Si el mundo configurado no está cargado y el jefe está en uno llamado <configuredWorld>_<number>, el objetivo usa ese mundo de instancia. Esto no sustituye a un mundo configurado que ya esté cargado.
Ten en cuenta que same_as_boss es un marcador de posición válido para el nombre del mundo; por ejemplo, same_as_boss,100,64,100,0,0 sería una ubicación válida que apuntaría al mismo mundo donde está el jefe.
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATION
location: "myWorld,100,64,200,0,0"
Esto genera un rayo en la ubicación x=100, y=64, z=200 de un mundo llamado myWorld.
locations
Establece las ubicaciones para el tipo de objetivo LOCATIONS.
| Valores | Detalles | Predeterminado |
|---|---|---|
locations | Establece la lista de ubicaciones del mundo que serán seleccionadas. | none |
Cada ubicación usa worldname,x,y,z,yaw,pitch, con las mismas variantes admitidas por location.
Ten en cuenta que same_as_boss es un marcador de posición válido para el nombre del mundo; por ejemplo, same_as_boss,100,64,100,0,0 sería una ubicación válida que apuntaría al mismo mundo donde está el jefe.
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATIONS
locations:
- "myWorld,100,64,200,0,0"
- "same_as_boss,-100,12,130,0,0"
Esto genera un rayo en la ubicación x=100, y=64, z=200 de un mundo llamado myWorld y otro rayo en el mismo mundo que el jefe en la ubicación x=-100, y=12 y z=130.
Selección de zonas como objetivo
Las zonas separan sus objetivos de origen de las acciones que usan su geometría. Zone.Target proporciona los orígenes; ZONE_FULL o ZONE_BORDER en una acción selecciona a partir de las formas resultantes. Varios orígenes pueden generar varias formas. Las entidades se deduplican; las formas superpuestas pueden aportar ubicaciones de partículas duplicadas.
Las zonas funcionan en dos partes:
Parte 1 - Establecer dónde va la zona
Las zonas necesitan saber dónde se supone que deben estar, y para eso utilizas el sistema de objetivos de la misma manera que lo harías para cualquier otro efecto basado en ubicación, como un rayo.
Ejemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Este fragmento define un cilindro de radio 10 y altura 1, desde los pies del jefe hacia arriba. Todavía no tiene acciones; para ejecutarse necesita las Actions del siguiente ejemplo. filter: PLAYER afecta a las consultas de entidades, no a las ubicaciones geométricas de las partículas.
Algunas zonas, como STATIC_RAY, tienen dos o más objetivos. Esto se debe a que los rayos son líneas, y las líneas se definen por dos puntos. Esto se cubre con más detalle en la página de zonas, pero fundamentalmente todas funcionan de la misma manera.
Parte 2 - Seleccionar el interior de la zona como objetivo
Usa targetType: ZONE_FULL para toda la forma o targetType: ZONE_BORDER para su borde. Las acciones de ubicación reciben puntos geométricos muestreados; las de entidad reciben entidades según el filtro y las comprobaciones de inclusión de la zona. No reciben el mismo tipo de colección.
Ejemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
Añade partículas en posiciones muestreadas del cilindro, no en las posiciones de los jugadores. Hay 12 ejecuciones separadas por 5 ticks. Las acciones de partículas en zonas usan aproximadamente un 30% de cobertura si no se define coverage. filter: PLAYER no limita estas partículas a los jugadores.
Ten en cuenta que ZONE_BORDER no está disponible para todas las zonas. Más sobre eso en la página de zonas de script.
Seguimiento de zona (track)
Define track en el Target de la acción, como se muestra abajo. Con true, normalmente se vuelven a resolver los orígenes móviles al solicitar las formas. Con false, la acción guarda las formas antes de wait: el origen queda fijo, pero las consultas posteriores siguen buscando las entidades que estén dentro en ese momento. No congela la lista de jugadores presentes al lanzar el poder.
| Valores | Detalles | Predeterminado |
|---|---|---|
track | Vuelve a resolver el objetivo en vez de guardar el origen de la zona y sus ubicaciones muestreadas. | true |
Con un animationDuration positivo, la acción guarda en caché las formas animadas al empezar, sea cual sea su ajuste track. Guarda las formas, no una lista fija de sus posiciones, así que la animación continúa. Más información aquí.
Ejemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
Usando el mismo ejemplo de la parte 1 y la parte 2, la zona ahora está configurada para no hacer seguimiento. Esto significa que la zona aparecerá en la ubicación del jefe, pero incluso a medida que el jefe se siga alejando, la zona permanecerá donde apareció por primera vez.
La caché se prepara al iniciar la acción, antes de su espera. Retrasar RUN_SCRIPT también retrasa el inicio y la preparación de la caché del script llamado.
Para una advertencia seguida de daño en la posición original, inicia ambos scripts inmediatamente y añade wait a las acciones de daño. Usa orígenes fijos coincidentes si deben conservar la misma posición independientemente del movimiento o de acciones anteriores.
El siguiente es un ejemplo correcto de un poder con una fase de advertencia y una fase de daño tomado del Frost Palace Sanctum.
Ejemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
- action: SPAWN_PARTICLE
wait: 60
times: 13
repeatEvery: 3
particles:
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: -0.5
speed: 0.2
Target:
targetType: ZONE_FULL
track: false
- action: RUN_SCRIPT
scripts:
- DamageCylinder
- action: PLAY_ANIMATION
sValue: fire_zone
Target:
targetType: SELF
- action: SET_MOB_AI
duration: 100
bValue: false
Target:
targetType: SELF
Cooldowns:
local: 1200
global: 300
DamageCylinder:
Zone:
radius: 10.0
shape: CYLINDER
height: 10
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
offset: 0,-1,0
Actions:
- action: DAMAGE
wait: 60
repeatEvery: 10
times: 4
multiplier: 4
Target:
targetType: ZONE_FULL
track: false
- action: SET_ON_FIRE
wait: 60
duration: 80
Target:
targetType: ZONE_FULL
track: false
Este script hace muchas cosas, pero está separado en dos scripts claros: VisualCylinder y DamageCylinder.
VisualCylinder se ejecuta primero y tiene la acción RUN_SCRIPT, que también ejecuta inmediatamente DamageCylinder al mismo tiempo que se está ejecutando VisualCylinder.
Sin embargo, cada acción individual en DamageCylinder está configurada para esperar 60 ticks, o 3 segundos.
La advertencia dura 3 segundos antes de los efectos retrasados. Al iniciarse inmediatamente, ambos scripts capturan la misma posición horizontal del jefe. Sus volúmenes difieren: el cilindro visual tiene altura 1 a los pies, mientras que el de daño empieza 1 bloque más abajo y tiene altura 10. DAMAGE se repite cuatro veces cada 10 ticks; SET_ON_FIRE se ejecuta una vez después de la espera y solicita 80 ticks de fuego. La animación requiere un modelo personalizado compatible con fire_zone.
Cada ejecución de una acción mantiene su propia caché. Los lanzamientos superpuestos del mismo script no sobrescriben las ubicaciones guardadas de los demás, y un lanzamiento nuevo nunca reutiliza las ubicaciones guardadas por uno anterior.
Propiedades de objetivo específicas de zona
Las zonas tienen las siguientes propiedades específicas:
coverage
Establece el porcentaje de la zona que realmente se usará para la acción. Solo funciona para objetivos de ubicación (no funcionará al seleccionar jugadores u otras entidades como objetivo).
| Valores | Detalles | Predeterminado |
|---|---|---|
coverage | Fracción de ubicaciones de la zona que se conserva; 0.5 conserva aproximadamente la mitad. Prefiere un valor fijo de 0 a 1. | 1.0 |
Un rango como 0.3~1.0 elige un valor desde 0.3 hasta 1.0, sin incluir 1.0, y la cobertura puede evaluarse por separado para cada punto. Usa una fracción fija si quieres una cobertura predecible. coverage: 1.0 explícito conserva todos los puntos; si se omite en una acción SPAWN_PARTICLE de zona, usa 0.3. La cobertura no reduce consultas de entidades. Con track: false, la selección de posiciones de una zona estática se guarda y reutiliza, sin sortearla de nuevo en cada repetición.
Ejemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
coverage: 0.5
Cada posición muestreada tiene un 50% de probabilidad de conservarse para las partículas. El número resultante es aproximado, no exactamente la mitad.
Heredar objetivos
Cuando un script ejecuta otro script (o "llama" a ese script), es posible pasar información de zona y objetivo del primer script al segundo.
Usos de ejemplo
- Ejecutores de scripts mejorados
Los ejecutores de scripts son scripts cuya única función es ejecutar muchos otros scripts. Se usan para facilitar la gestión de scripts, especialmente cuando se manejan varios scripts que requieren una sincronización precisa.
Con la herencia de objetivos, varios scripts pueden usar la misma zona u objetivo, reduciendo potencialmente cientos de líneas de scripting repetitivo.
- Filtrado de objetivos tipo matrioska / muñeca rusa anidada
Una acción padre que realmente resuelve y filtra entidades puede pasar su resultado guardado al hijo mediante su lista scripts. Mantén compatibles los tipos de objetivo del padre y del hijo. RUN_SCRIPT no ejecuta por sí mismo el filtrado individual: añadirle una condición FILTERING no produce una lista filtrada para heredar.
Para comprobar etiquetas, usa ACTION_TARGET con FILTERING en la acción de entidad. La probabilidad aleatoria requiere condiciones de script o BLOCKING; no es un sorteo individual por entidad. isAlive comprueba la validez de Bukkit, por lo que invertirlo no es una forma fiable de activar un comportamiento al morir un jugador.
- Zonas complejas
Finalmente, es posible apilar objetivos para crear zonas complejas, opcionalmente usando condiciones si se requiere, e incluso es posible crear zonas semialeatorias usando las condiciones de script y la capacidad de ejecutar solo uno de los scripts listados desde las acciones del script.
Nota: Para esta sección, "script padre" se refiere al script que ejecuta el "script heredero", que es el script que usará los objetivos heredados.
Al usar la herencia de objetivos, es importante examinar cuidadosamente el script padre para asegurarse de que se están pasando los datos correctos.
INHERIT_SCRIPT_TARGET
INHERIT_SCRIPT_TARGET lee el selector o la caché de la acción padre concreta que llamó al hijo, no la unión de todos los objetivos del script padre. Úsalo en las acciones o los orígenes de zona del hijo, no en sus Conditions de nivel superior: esas se evalúan antes de disponer de los datos heredados, y ahí el objetivo heredado falla con un error.
El padre solo pasa sus objetivos resueltos y filtrados por condiciones cuando su Target tiene track: false. Con el valor por defecto track: true, el hijo vuelve a resolver el objetivo del padre, sin el filtrado del padre. Un padre RUN_SCRIPT nunca resuelve sus propios objetivos, así que su hijo siempre vuelve a resolver las entidades. Con track: false, el hijo sí reutiliza las ubicaciones que el padre guardó al empezar su acción. Hay varias salvedades:
-
Al pasar objetivos de entidad, el hijo puede usarlos con acciones de entidad o con acciones de ubicación. Las acciones de ubicación reciben las ubicaciones de las entidades.
-
Al pasar objetivos de ubicación, solo es posible usar ubicaciones. Una acción de entidad que hereda ubicaciones falla con un error. La única forma de obtener una entidad a partir de una ubicación es creando una zona en esa ubicación y buscando entidades. Por lo tanto, aunque no es imposible pasar una ubicación y luego obtener entidades, requerirá un poco de trabajo adicional.
Heredar zonas
Al usar INHERIT_SCRIPT_ZONE_FULL o INHERIT_SCRIPT_ZONE_BORDER, es imprescindible que el script padre defina una zona, de lo contrario el script heredero no podrá ejecutarse correctamente.
Una acción con track: false guarda las formas de su zona antes de empezar la espera. Una acción con seguimiento normalmente vuelve a resolver los orígenes móviles sin guardarlos. Los datos de la acción padre pueden reutilizar formas guardadas; track: true no fija una ubicación compartida.
Los objetivos de zona heredados usan la propia Zone del script padre y las formas que guardó la acción que llama, si guardó alguna. Las consultas de entidades de INHERIT_SCRIPT_ZONE_FULL usan la prueba del volumen completo, igual que ZONE_FULL. Si el script padre no tiene una zona válida, o el script no fue llamado por otro script, la acción falla con un error.
Para compartir un origen fijo, pon track: false en el Target de la acción que llama. El hijo reutiliza entonces las formas que el padre guardó al empezar su acción, aunque las acciones del propio hijo esperen.