Vectores relativos de Elite Script
Para qué sirven
Los vectores relativos son vectores que son relativos a una ubicación específica pero dinámica.
Por ejemplo, para atraer a un jugador hacia un jefe en movimiento, calcula un vector desde la posición del jugador hasta la del jefe. Un vector fijo no puede seguir sus posiciones cambiantes.
Los vectores relativos permiten apuntar proyectiles, lanzar bloques en caída y orientar entidades. Como desplazamientos relativos, pueden colocar un refuerzo más allá de un jugador o extender un rayo más allá de su objetivo.
Contexto de uso
Los vectores relativos se usan en contextos de acción con la clave YAML RelativeVector:. Esto incluye acciones como:
SUMMON_ENTITY- Establece la velocidad (dirección y rapidez de movimiento) de la entidad generadaSUMMON_REINFORCEMENT- Establece la velocidad del refuerzo generadoSPAWN_PARTICLE- Proporciona el vector de movimiento dentro de cada entrada departicles:; para esto no se usa el campo situado en la acciónPUSH- Establece la velocidad de empujeSPAWN_FALLING_BLOCK- Establece la velocidad del bloque en caídaSET_FACING- Establece la dirección a la que mira una entidad
Las demás acciones analizan un bloque RelativeVector: válido, pero no lo usan. Estas claves no distinguen mayúsculas y minúsculas, por lo que las entradas de partículas aceptan RelativeVector: y relativeVector:. Los valores de tipo de objetivo mantienen las mayúsculas documentadas.
En las acciones de velocidad, RelativeVector tiene prioridad sobre vValue; no se suman. PUSH calcula un único vector para todas las entidades seleccionadas y lo aplica un tick después. SET_FACING también calcula una única dirección para todas ellas.
Para contextos de objetivo (modificar posiciones), usa relativeOffset: dentro de un bloque de objetivo como Target, FinalTarget, Target2 o FinalTarget2. Un relativeOffset: situado en la acción registra Failed to read key relativeOffset .... Solo tiene efecto cuando la acción no tiene un bloque Target, porque entonces el objetivo SELF por defecto lee las claves de objetivo de la propia acción. Consulta la sección de desplazamientos relativos más abajo.
¿Cómo funcionan los vectores?
Si no sabes o no recuerdas qué son los vectores o cómo funcionan, puedes pensar en los vectores como flechas que apuntan de un punto a otro punto.
Como tal, una de las propiedades de los vectores es su longitud. Esta longitud es importante; en el caso de las flechas, esta longitud es la velocidad a la que se dispara una flecha, en el caso de intentar obtener puntos de desplazamiento desde una ubicación específica es la distancia desde ese punto. Las cosas que están más lejos tendrán longitudes de vector mayores, y las cosas más cercanas tendrán longitudes más cortas.
Para algunas mecánicas, probablemente no querrás depender de qué tan separados estén dos puntos, ya que solo quieres obtener una dirección. Afortunadamente puedes usar la normalización de vectores, que garantiza que la dirección se preserve pero cambia la longitud a 1.0. Luego puedes usar multiplicadores para modificar fácilmente el vector hasta que estés satisfecho con el desplazamiento que proporciona o la velocidad que da.
Propiedades
| Valor | Detalles | ¿Obligatorio? | Valor por defecto |
|---|---|---|---|
SourceTarget | Target en el punto desde el cual comenzará el vector | ✅ | none |
DestinationTarget | Target en el punto final para el vector | ✅ | none |
normalize | Establece si el vector debe ser normalizado | ❌ | false |
multiplier | Multiplica la longitud del vector. Puedes aleatorizar este valor usando ~. Ejemplo: 1.0~2.5. | ❌ | 1.0 |
offset | Añade un desplazamiento fijo al vector. Puedes aleatorizarlo con ~. Ejemplo: 0~5,0~2,0~10. | ❌ | 0,0,0 |
Aleatorización
Tanto multiplier como offset admiten aleatorización usando el delimitador tilde (~):
- Para multiplier: Usa
min~max, por ejemplo1.0~2.5. Este ejemplo obtiene valores desde 1.0 hasta 2.5, sin incluir 2.5. - Para offset: Usa el formato
x1~x2,y1~y2,z1~z2(por ejemplo,0~5,0~2,0~10). Cada componente (X, Y, Z) se aleatoriza independientemente.
Los valores se eligen cada vez que se calcula el vector. Los componentes aleatorios de offset siguen la misma regla: desde min hasta max, sin incluir max.
Ejemplo
eliteScript:
ShootChicken:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: CHICKEN
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
Lanza un pollo desde el jefe hacia el jugador atacante.
eliteScript:
ShootArrow:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ARROW
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
Lanza una flecha hacia el jugador atacante. Para entidades proyectil con un jefe vivo, SUMMON_ENTITY usa el lanzador de proyectiles del jefe, por lo que el proyectil sale del jefe aunque el Target de la acción indique otra posición.
eliteScript:
SpawnReinforcement:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ZOMBIE
Target:
targetType: DIRECT_TARGET
relativeOffset:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
Genera un zombi vanilla dos bloques más allá del jugador, siguiendo la línea del jefe al jugador. No es un refuerzo de EliteMobs, pese al nombre del script. relativeOffset va dentro de Target: cambia la posición de aparición, no la velocidad. La dirección usa la línea tridimensional completa, no la orientación del jugador, y no busca suelo ni comprueba colisiones.
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
Shape: SPHERE
target:
targetType: SELF_SPAWN
offset: 0,0,0
track: false
filter: PLAYER
radius: 6
Actions:
- action: SPAWN_PARTICLE
repeatEvery: 38
times: 5
Target:
targetType: ZONE_FULL
track: false
coverage: 0.9
particles:
- particle: FLAME
RelativeVector:
SourceTarget:
targetType: ACTION_TARGET
track: true
DestinationTarget:
targetType: SELF_SPAWN
offset: 0,-0.5,0
speed: 0.05
Crea ráfagas repetidas de llamas que se mueven hacia dentro de una esfera alrededor de la posición de aparición. La zona en sí no se encoge.
Cómo funciona:
- La zona proporciona puntos geométricos dentro de una esfera de seis bloques.
filter: PLAYERafecta a la selección de entidades, no a las posiciones de partículas usadas aquí. coverage: 0.9da a cada punto generado aproximadamente un 90 % de probabilidad de selección. Eltrack: falsede la acción guarda esa selección para las repeticiones de esta ejecución.- El vector de cada partícula apunta desde su posición de aparición (
ACTION_TARGET) hasta medio bloque por debajo de la posición de aparición del jefe (SELF_SPAWNconoffset: 0,-0.5,0). - El vector se calcula al generar cada partícula.
ACTION_TARGETusa directamente la posición proporcionada por la acción; sutrackanidado no dirige partículas que ya están en vuelo. - Un vector relativo de partículas reemplaza
x,y,zy fuerzaamounta cero para la emisión direccional.speedsigue pasándose a Bukkit y el tipo de partícula determina el movimiento resultante. - La acción se ejecuta cinco veces, separadas por 38 ticks, salvo que se cancele su trabajo programado. Cada golpe válido inicia otra ejecución porque este ejemplo no tiene tiempo de reutilización.
Orden de operaciones
El orden de operaciones al aplicar las propiedades es el siguiente:
Cálculo del vector -> normalize -> multiplier -> offset
Notas técnicas
Normalización de vectores: Para un vector no nulo, conserva su dirección y establece su longitud en 1.0 antes de aplicar el multiplicador y el desplazamiento.
Multiplicadores negativos: El multiplicador puede ser negativo para invertir la dirección del vector. Por ejemplo, un multiplicador de -1.0 apuntará en la dirección opuesta.
Coordenadas de desplazamiento: El desplazamiento se aplica en coordenadas mundiales, no relativas a la dirección del vector. Se agrega después de todos los demás cálculos.
Validación de mundo: Los objetivos de origen y destino deben estar en el mismo mundo. Si están en mundos diferentes, se devuelve un vector cero (0, 0, 0), lo que puede causar que las acciones fallen o se comporten inesperadamente.
Objetivos ausentes: Una colección resuelta de origen o destino vacía devuelve un vector cero antes de aplicar el multiplicador y el desplazamiento. Esto incluye un extremo DIRECT_TARGET cuando el evento no tiene objetivo directo. La ausencia de un bloque SourceTarget o DestinationTarget sigue provocando un error.
Si las posiciones válidas de origen y destino coinciden, el vector tiene longitud cero. normalize: true lo deja en cero, de modo que solo queda el offset propio del vector relativo. Si un objetivo produce varias posiciones, el vector relativo usa la primera, sin garantizar que sea la más cercana. Usa un objetivo único como DIRECT_TARGET cuando la dirección deba ser inequívoca.
ACTION_TARGET: Usa una posición proporcionada por la acción e ignora los ajustes anidados offset, relativeOffset y track. Para partículas es su posición de aparición; para entidades y bloques en caída, la posición solicitada; para la velocidad de refuerzos, la posición del refuerzo generado. Para PUSH y SET_FACING es la posición del jefe, no la de cada entidad seleccionada. En el relativeOffset de un objetivo, es la ubicación que se está desplazando, después del offset simple de ese objetivo.
Contexto de velocidad vs posición: En contextos de acción como SUMMON_ENTITY, RelativeVector establece la velocidad (movimiento) de la entidad. En contextos de objetivo, relativeOffset establece un desplazamiento de posición (ajuste de ubicación). Se usa el mismo sistema subyacente, pero la interpretación difiere según el contexto.
Aplica relativeOffset a objetivos como SELF, SELF_SPAWN, DIRECT_TARGET, LOCATION o LOCATIONS, incluso cuando definen el origen o extremo de una zona. En ZONE_FULL / ZONE_BORDER desplaza cada ubicación de zona muestreada. No tiene efecto en LANDING_LOCATION ni en INHERIT_SCRIPT_TARGET. Consulta las reglas de desplazamiento de objetivos.
Desplazamiento relativo de Elite Script
¿Para qué sirven?
Los desplazamientos relativos funcionan de manera similar a los vectores relativos, pero con el objetivo de agregar flexibilidad a los desplazamientos. Te permiten ajustar posiciones dinámicamente al hacer scripts, facilitando el ajuste fino de posiciones objetivo o efectos basados en el contexto.
¿Cómo funcionan los desplazamientos relativos?
Los desplazamientos relativos son aditivos, lo que significa que cualquier cosa a la que se resuelva el desplazamiento será agregada al valor base (como una ubicación o vector).
Desglosemos un ejemplo:
Tienes una zona de rayo:
Target 1esSELF(el jefe).Target 2esDIRECT_TARGET, el jugador proporcionado por el evento.
Supón que el jugador está a ocho bloques, ambas posiciones pertenecen al mismo mundo y no hay otros desplazamientos. Usa SELF como SourceTarget del desplazamiento relativo y DIRECT_TARGET como DestinationTarget, y coloca ese relativeOffset en Target2. Estos ejemplos describen la distancia hasta el extremo; los puntos dibujados también dependen de los ajustes del rayo.
Ahora apliquemos un desplazamiento relativo:
Caso 1: normalize = false, multiplier = 1
- La distancia original es 8.
- El valor del desplazamiento se convierte en
8 × 1 = 8. - Longitud final del rayo:
8 + 8 = 16.
El rayo pasará a través del jugador y continuará 8 bloques adicionales.
Caso 2: normalize = false, multiplier = 2
- El valor del desplazamiento se convierte en
8 × 2 = 16. - Longitud final del rayo:
8 + 16 = 24.
Caso 3: normalize = true, multiplier = 1
- La distancia se normaliza a 1.
- El valor del desplazamiento se convierte en
1 × 1 = 1. - Longitud final del rayo:
8 + 1 = 9.
Caso 4: normalize = true, multiplier = 2
- El valor del desplazamiento se convierte en
1 × 2 = 2. - Longitud final del rayo:
8 + 2 = 10.
Resumen
normalize = falseusa la distancia real entre los objetivos.normalize = trueempieza con longitud 1 para un vector válido no nulo.- El desplazamiento siempre es agregado al valor original.
- Un
multiplierde cero elimina el desplazamiento calculado solo si es finito. Eloffsetdel propio vector relativo se sigue añadiendo después, y eloffsetnormal del objetivo es independiente. Para desactivar el desplazamiento relativo, elimina su bloque.
Este sistema te permite extender o reducir distancias dinámicamente al construir lógica de habilidades más compleja en el scripting de EliteMobs.
Propiedades
| Valor | Detalles | ¿Obligatorio? | Valor por defecto |
|---|---|---|---|
SourceTarget | Target en el punto desde el cual comenzará el vector | ✅ | none |
DestinationTarget | Target en el punto final para el vector | ✅ | none |
normalize | Establece si el vector debe ser normalizado | ❌ | false |
multiplier | Multiplica la longitud del vector. Puedes aleatorizar este valor usando ~. Ejemplo: 1.0~2.5. | ❌ | 1.0 |
offset | Añade un vector fijo después de aplicar normalize y multiplier. Puedes aleatorizar este valor usando ~. Ejemplo: 0~5,0~2,0~10. | ❌ | 0,0,0 |
relativeOffset y RelativeVector se analizan con exactamente el mismo código, así que ambos aceptan las mismas cinco claves.
Ejemplo
eliteScript:
MakeStaticRay:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: STATIC_RAY
Target:
targetType: SELF
offset: 0,1,0
Target2:
targetType: DIRECT_TARGET
offset: 0,1,0
relativeOffset:
sourceTarget:
targetType: SELF
destinationTarget:
targetType: DIRECT_TARGET
multiplier: 5
normalize: true
Actions:
- action: SPAWN_PARTICLE
Target:
targetType: ZONE_FULL
particles:
- particle: ELECTRIC_SPARK
amount: 1
repeatEvery: 1
times: 400
Esto crea un rayo cuyo extremo queda cinco bloques más allá del jugador siguiendo la línea del jefe al jugador. Los desplazamientos normales elevan ambos extremos un bloque sobre sus pies; no calculan automáticamente el centro de la entidad. STATIC_RAY nombra la forma, no una captura fija de los objetivos: con el track: true predeterminado, la acción recalcula los objetivos en cada repetición. Define Target.track: false en la acción para guardar las posiciones del rayo y obtener una visualización fija. El ejemplo solicita 400 ejecuciones separadas por un tick y cada golpe válido puede iniciar otra serie.
Nota: Aunque este ejemplo usa desplazamiento relativo en una zona, ten en cuenta que los desplazamientos relativos no están limitados a zonas, también se pueden aplicar a otros objetivos.