Objetivos de Elite Script
Los objetivos son una parte central de los Elite Scripts, y son necesarios para que funcionen las Acciones y las Zonas.
Tipos de objetivo
Los tipos de objetivo establecen qué entidades o ubicaciones son seleccionadas por un script.
| Tipo de objetivo | Detalles | Especial |
|---|---|---|
NEARBY_PLAYERS | Jugadores dentro del rango | Requiere range |
NEARBY_MOBS | Mobs dentro del rango | Requiere range |
NEARBY_ELITES | Elites dentro del rango | Requiere range |
WORLD_PLAYERS | Jugadores en el mundo | ❌ |
ALL_PLAYERS | Jugadores en el servidor | ❌ |
DIRECT_TARGET | Jugadores en el evento | Requiere un evento compatible |
SELF | Elite que usa el poder | ❌ |
SELF_SPAWN | Selecciona la ubicación de aparición de un 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 acción y Vectores Relativos!! |
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
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 seleccionar entidades! |
relativeOffset | Establece un desplazamiento relativo para la ubicación del objetivo. Acepta un esquema de vector relativo, permitiendo que el desplazamiento se calcule en relación con la dirección a la que mira el jefe. | ¡No puede seleccionar entidades! |
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. 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, sí puedes establecer un desplazamiento a una zona que luego pueda seleccionar entidades.
range
Establece el rango para escanear en busca de jugadores cercanos en el tipo de objetivo NEARBY_PLAYERS.
| Valores | Detalles | Predeterminado |
|---|---|---|
range | Establece el rango, en bloques, para escanear en busca de objetivos 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 que estén a menos de 25 bloques del jefe cuando el jefe muere.
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 |
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; 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 |
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; 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 tienen múltiples objetivos, y es importante entender cómo funcionan para usar Elite Scripting al máximo de su potencial.
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
Esto genera una zona cilíndrica alrededor del jefe. Ten en cuenta que en este ejemplo aún no se establecen acciones; eso se cubre más abajo.
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
Ahora que la zona sabe dónde está, necesitamos que la acción sepa que su objetivo es la zona que definimos. Para eso 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 añadimos la acción. El objetivo de 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 (track)
Establece si la zona se moverá con el objetivo, como si la zona se moverá cuando el jefe se mueva en el caso de targetType: SELF.
| Valores | Detalles | Predeterminado |
|---|---|---|
track | Establece si la zona se moverá junto con el objetivo. | true |
Ten en cuenta que las zonas animables no pueden hacer seguimiento. 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 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.
Finalmente, ten en cuenta que si una zona está configurada para no hacer seguimiento, registrará su ubicación en el momento en que se llama al script.
Como ejemplo, si quieres tener una fase de advertencia y una fase de daño para tu script, deberás asegurarte de ejecutar todas las acciones al principio y poner un tiempo de espera en todas las acciones relacionadas con el daño que quieras ejecutar más tarde individualmente. No debes retrasar todo un script que llamas mediante 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 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.
Esto significa que el jefe tiene una fase de advertencia de 3 segundos, y luego realiza una fase de daño, y aunque las zonas están configuradas para no hacer seguimiento, 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á al seleccionar jugadores u otras entidades como objetivo).
| Valores | Detalles | Predeterminado |
|---|---|---|
coverage | Establece el porcentaje de la zona que será cubierto. Puedes aleatorizar este valor usando ~, por 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 se cubrirá de partículas.
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
Las condiciones de filtrado se pueden aplicar a los objetivos en una acción. Al pasar los objetivos a un script diferente con filtros diferentes, se hace posible apilar las condiciones y aplicar diferentes efectos al mismo conjunto de objetivos en función de criterios cada vez más específicos.
Como ejemplo, es posible crear una zona que busque jugadores y hacer una acción que compruebe si todos los jugadores en la zona tienen una etiqueta específica. Los objetivos válidos pueden entonces pasarse a otro script donde otra acción puede ejecutar una condición de comprobación aleatoria y aplicar un efecto basado en esa probabilidad. Los objetivos pueden entonces pasarse a otro script donde otra condición puede hacer una comprobación para ver si los objetivos siguen vivos y realizar algún comportamiento especial si están muertos.
Estos son, por supuesto, solo ejemplos. Es un sistema sumamente flexible.
- 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
Al usar INHERIT_SCRIPT_TARGET, los objetivos del script padre se pasarán al script heredero. Esto tiene un par de salvedades:
-
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 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.
Además, las zonas pueden opcionalmente hacer seguimiento. 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 las acciones de los scripts herederos usarán los ajustes de la zona 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 exactamente la misma ubicación de zona a todos los scripts herederos si el script padre está configurado para apuntar a
ZONE_FULLoZONE_BORDER. Esto significa que cada script actuará sobre las mismas ubicaciones.