Objetivos de Elite Script
Los objetivos son una parte central de Elite Scripts y son necesarios para que las Acciones y Zonas funcionen.
Tipos de Objetivos
Los tipos de objetivos establecen qué entidades o ubicaciones son seleccionadas por un script.
| Tipo de Objetivo | Detalles | Especial |
|---|---|---|
NEARBY_PLAYERS | Jugadores en rango | Requiere range |
NEARBY_MOBS | Criaturas en rango | Requiere range |
NEARBY_ELITES | Élites en rango | Requiere range |
WORLD_PLAYERS | Jugadores en el mundo | ❌ |
ALL_PLAYERS | Jugadores en el servidor | ❌ |
DIRECT_TARGET | Jugadores en el evento | Requiere evento compatible |
SELF | Élite usando el poder | ❌ |
SELF_SPAWN | Apunta a la ubicación de aparición del 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 | Hereda los objetivos de una acción. | ¡Solo se puede usar para condiciones de acciones y Vectores Relativos! |
LANDING_LOCATION | Apunta a la ubicación donde cayó un bloque. | ¡Solo se puede usar para la acción SPAWN_FALLING_BLOCK! |
INHERIT_SCRIPT_TARGET | Hereda el objetivo del script que ejecuta este script | ¡Solo puede ejecutarse 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. Como el objetivo está configurado como ALL_PLAYERS, enviará ese mensaje a todos los jugadores en línea.
Atributos compartidos
Los siguientes ajustes se pueden aplicar a todos los objetivos.
| Valores | Detalles | Especial |
|---|---|---|
offset | Establece el desplazamiento para la ubicación del objetivo. | ¡No puede apuntar a entidades! |
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
Esto golpea con un rayo 2 bloques por encima del jefe. Ten en cuenta que STRIKE_LIGHTNING usa ubicaciones y no afecta a las entidades, por lo que puede tener desplazamientos.
No puedes establecer un desplazamiento para enviar un mensaje, ya que los mensajes se envían a los jugadores. Sin embargo, puedes establecer un desplazamiento a una zona que luego puede apuntar a entidades.
range
Establece el rango para buscar jugadores cercanos en el tipo de objetivo NEARBY_PLAYERS.
| Valores | Detalles | Por defecto |
|---|---|---|
range | Establece el rango, en bloques, para buscar objetivos de jugadores. | 20.0 |
Ejemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"
Esto envía un mensaje a los jugadores dentro de 25 bloques del jefe cuando el jefe muere.
location
Establece la ubicación para el tipo de objetivo LOCATION.
| Valores | Detalles | Por defecto |
|---|---|---|
location | Establece la ubicación del mundo que será el objetivo. | none |
Esto usa el formato location: worldname,x,y,z,pitch,yaw para la ubicación.
Ten en cuenta que same_as_boss es un marcador de posición válido para el nombre del mundo, como 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 | Por defecto |
|---|---|---|
locations | Establece la lista de ubicaciones del mundo que serán el objetivo. | none |
Esto usa el formato worldname,x,y,z,pitch,yaw para la ubicación.
Ten en cuenta que same_as_boss es un marcador de posición válido para el nombre del mundo, como 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.
Apuntando a zonas
Las Zonas tienen múltiples objetivos, y es importante entender cómo funcionan para usar Elite Scripting en todo su potencial.
Las zonas funcionan en dos partes:
Parte 1 - Estableciendo dónde va la zona
Las zonas necesitan saber dónde se supone que deben estar, y para hacer eso usas 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
Esto genera una zona cilíndrica alrededor del jefe. Ten en cuenta que no se establecen acciones en este ejemplo todavía, eso se cubre a continuación.
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 más extensamente en la página de zonas, pero todas funcionan fundamentalmente de la misma manera.
Parte 2 - Apuntando al interior de la zona
Ahora que la zona sabe dónde está, necesitamos que la acción sepa que su objetivo es la zona que definimos. Eso es para lo que sirven targetType: ZONE_FULL y targetType:ZONE_BORDER.
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
Usando la misma zona de la primera parte, ahora agregamos la acción. El objetivo para esta acción es ZONE_FULL, lo que significa que generará partículas dentro de toda la zona.
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
Establece si la zona se moverá con el objetivo, como si la zona se moverá cuando el jefe se mueva para targetType: SELF.
| Valores | Detalles | Por defecto |
|---|---|---|
track | Establece si la zona se moverá con el objetivo. | true |
Ten en cuenta que las zonas animables no pueden seguir. Más sobre eso 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 seguir. Esto significa que la zona aparecerá en la ubicación del jefe, pero incluso cuando el jefe siga moviéndose, la zona permanecerá donde apareció por primera vez.
Finalmente, ten en cuenta que si una zona está configurada para no seguir, registrará su ubicación en el momento en que se llame al script.
Como ejemplo, si quieres tener una fase de advertencia y una fase de daño para tu script, necesitarás asegurarte de ejecutar todas las acciones al inicio y poner un tiempo de espera en todas las acciones relacionadas con el daño que deseas ejecutar más tarde individualmente. No debes retrasar un script completo que llamas a través de RUN_SCRIPT por razones técnicas.
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 inmediatamente también ejecuta el DamageCylinder al mismo tiempo que se está ejecutando el VisualCylinder.
Sin embargo, cada acción en DamageCylinder está configurada para esperar 60 ticks, o 3 segundos.
Esto significa que el jefe tiene una fase de advertencia de 3 segundos, y luego hace una fase de daño, y aunque las zonas están configuradas para no seguir, la zona de advertencia y la zona de daño estarán en la misma ubicación.
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á cuando se apunte a jugadores u otras entidades).
| Valores | Detalles | Por defecto |
|---|---|---|
coverage | Establece el porcentaje de la zona que será cubierta. Puedes aleatorizar este valor usando ~ ejemplo: 1.0~0.3. | 1.0 |
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
En este caso, solo el 50% de la zona estará cubierta con partículas.
Heredando 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.
Ejemplos de uso
- 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 un tiempo preciso.
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 Matryoshka / Filtrado de objetivos de muñeca rusa
Se pueden aplicar condiciones de filtrado a objetivos en una acción. Al pasar los objetivos a un script diferente con diferentes filtros, se hace posible superponer las condiciones y aplicar diferentes efectos al mismo conjunto de objetivos basándose en criterios cada vez más específicos.
Como ejemplo, es posible crear una zona que busque jugadores y hacer una acción que verifique si todos los jugadores en la zona tienen una etiqueta específica. Los objetivos válidos pueden luego pasarse a otro script donde otra acción puede ejecutar una condición de verificación aleatoria y aplicar un efecto basado en esa probabilidad. Los objetivos pueden luego pasarse más adelante a otro script donde otra condición puede hacer una verificación para ver si los objetivos siguen vivos y hacer algún comportamiento especial si están muertos.
Estos son, por supuesto, solo ejemplos. Es un sistema altamente flexible.
- Zonas complejas
Finalmente, es posible superponer objetivos para crear zonas complejas, opcionalmente usando condiciones si es necesario, e incluso es posible crear zonas semi-aleatorizadas usando las condiciones del script y la capacidad de ejecutar solo uno de los scripts listados de 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 herencia de objetivos, es importante examinar cuidadosamente el script padre para asegurarse de que se estén pasando los datos correctos.
INHERIT_SCRIPT_TARGET
Al usar INHERIT_SCRIPT_TARGET, los objetivos del script padre se pasarán al script heredero. Esto tiene un par de advertencias:
-
Al pasar objetivos de entidad, es posible ejecutar acciones que requieren ubicaciones (como generar partículas) ya que se usará la ubicación de las entidades. Por supuesto, también es posible usar acciones que requieren entidades.
-
Al pasar objetivos de ubicación, solo es posible usar ubicaciones. La única forma de obtener una entidad de una ubicación es creando una zona en esa ubicación y buscando entidades. Entonces, aunque no es imposible pasar una ubicación y luego obtener entidades, requerirá un poco de trabajo extra.
Heredando zonas
Al usar INHERIT_SCRIPT_ZONE_FULL o INHERIT_SCRIPT_ZONE_BORDER, es imperativo que el script padre defina una zona, o de lo contrario el script heredero no podrá ejecutarse correctamente.
Además, las zonas pueden opcionalmente seguirse. Esto también se pasará junto con la zona.
-
Una zona sin seguimiento siempre creará una zona donde la defina el script heredero. Esto significa que la configuración de la zona será usada por las acciones en los scripts herederos para crear zonas completamente nuevas cada vez que se ejecute una acción, y la ubicación de esas zonas será definida por la acción.
-
Una zona con seguimiento puede pasar la misma ubicación exacta de zona a todos los scripts herederos si el script padre está configurado para apuntar a
ZONE_FULLoZONE_BORDER. Esto significa que cada script estará actuando en las mismas ubicaciones.