Alvos de Elite Script
Os alvos são uma parte central dos Elite Scripts e são necessários para o funcionamento das Ações e das Zonas.
Tipos de alvo
Os tipos de alvo definem que entidades ou localizações são visadas por um script.
| Tipo de alvo | Detalhes | Especial |
|---|---|---|
NEARBY_PLAYERS | Jogadores no alcance | Requer range |
NEARBY_MOBS | Mobs no alcance | Requer range |
NEARBY_ELITES | Elites no alcance | Requer range |
WORLD_PLAYERS | Jogadores no mundo | ❌ |
ALL_PLAYERS | Jogadores no servidor | ❌ |
DIRECT_TARGET | Jogadores no evento | Requer um evento compatível |
SELF | Elite que usa o poder | ❌ |
SELF_SPAWN | Visa a localização de spawn de um boss | ❌ |
LOCATION | Localização específica | Requer location |
LOCATIONS | Várias localizações específicas | Requer locations |
ZONE_FULL | Alvos dentro da zona | Requer Zone |
ZONE_BORDER | Alvos na borda da zona | Requer Zone |
ACTION_TARGET | Herda os alvos de uma ação. | Só pode ser usado para condições de ações e Vetores Relativos!! |
LANDING_LOCATION | Visa a localização onde um bloco ou entidade aterrou. | Só pode ser usado nos landingScripts das ações SPAWN_FALLING_BLOCK e SUMMON_ENTITY! |
INHERIT_SCRIPT_TARGET | Herda o alvo do script que executa este script | Só pode ser executado se o script tiver sido chamado por outro script! |
INHERIT_SCRIPT_ZONE_FULL | Alvos dentro da zona herdada do script que executa este script | Requer Zone no script que chama este script! |
INHERIT_SCRIPT_ZONE_BORDER | Alvos na borda da zona herdada do script que executa este script | Requer Zone no script que chama este script! |
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: ALL_PLAYERS
sValue: "&2Hello World!"
Isto envia uma mensagem ao alvo. Uma vez que o alvo está definido como ALL_PLAYERS, enviará essa mensagem a todos os jogadores online.
Atributos partilhados
As seguintes definições podem ser aplicadas a todos os alvos.
| Valores | Detalhes | Especial |
|---|---|---|
offset | Define o deslocamento (offset) para a localização do alvo. | Não pode visar entidades! |
relativeOffset | Define um deslocamento relativo para a localização do alvo. Aceita um modelo de vetor relativo, permitindo que o deslocamento seja calculado em relação à direção para onde o boss está virado. | Não pode visar entidades! |
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
Isto faz cair um relâmpago 2 blocos acima do boss. Note que STRIKE_LIGHTNING usa localizações e não afeta entidades, pelo que pode ter deslocamentos.
Não pode definir um deslocamento para enviar uma mensagem, uma vez que as mensagens são enviadas aos jogadores. Pode, no entanto, definir um deslocamento numa zona que possa depois visar entidades.
range
Define o alcance para procurar jogadores próximos no tipo de alvo NEARBY_PLAYERS.
| Valores | Detalhes | Predefinição |
|---|---|---|
range | Define o alcance, em blocos, para procurar alvos de jogadores. | 20.0 |
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"
Isto envia uma mensagem aos jogadores num raio de 25 blocos do boss quando o boss morre.
location
Define a localização para o tipo de alvo LOCATION.
| Valores | Detalhes | Predefinição |
|---|---|---|
location | Define a localização no mundo que será visada. | none |
Isto usa o formato location: worldname,x,y,z,pitch,yaw para a localização.
Note que same_as_boss é um marcador de posição (placeholder) válido para o nome do mundo, por exemplo same_as_boss,100,64,100,0,0 seria uma localização válida que visaria o mesmo mundo onde o boss se encontra.
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATION
location: "myWorld,100,64,200,0,0"
Isto faz surgir um relâmpago na localização x=100, y=64, z=200 de um mundo chamado myWorld.
locations
Define as localizações para o tipo de alvo LOCATIONS.
| Valores | Detalhes | Predefinição |
|---|---|---|
locations | Define a lista de localizações no mundo que serão visadas. | none |
Isto usa o formato worldname,x,y,z,pitch,yaw para a localização.
Note que same_as_boss é um marcador de posição (placeholder) válido para o nome do mundo, por exemplo same_as_boss,100,64,100,0,0 seria uma localização válida que visaria o mesmo mundo onde o boss se encontra.
Exemplo
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"
Isto faz surgir um relâmpago na localização x=100, y=64, z=200 de um mundo chamado myWorld e outro relâmpago no mesmo mundo do boss na localização x=-100, y=12 e z=130.
Visar zonas
As Zonas têm múltiplos alvos, e é importante compreender como funcionam para utilizar o Elite Scripting em todo o seu potencial.
As zonas funcionam em duas partes:
Parte 1 - Definir onde a zona fica
As zonas precisam de saber onde devem estar e, para isso, usa-se o sistema de alvos da mesma forma que faria para qualquer outro efeito baseado em localização, como um relâmpago.
Exemplo
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Isto faz surgir uma zona cilíndrica em torno do boss. Note que ainda não estão definidas ações neste exemplo; isso é abordado mais abaixo.
Algumas zonas, como STATIC_RAY, têm dois ou mais alvos. Isto deve-se ao facto de os raios serem linhas, e as linhas serem definidas por dois pontos. Isto é abordado mais extensivamente na página das zonas, mas, fundamentalmente, todas funcionam da mesma forma.
Parte 2 - Visar o interior da zona
Agora que a zona sabe onde está, precisamos que a ação saiba que o seu alvo é a zona que definimos. É para isso que servem targetType: ZONE_FULL e targetType:ZONE_BORDER.
Exemplo
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 a mesma zona da primeira parte, adicionamos agora a ação. O alvo desta ação é ZONE_FULL, o que significa que fará surgir partículas dentro de toda a zona.
Note que ZONE_BORDER não está disponível para todas as zonas. Mais sobre isso na página das zonas de script.
Acompanhamento da zona (track)
Define se a zona se moverá com o alvo, por exemplo se a zona se moverá quando o boss se mover no caso de targetType: SELF.
| Valores | Detalhes | Predefinição |
|---|---|---|
track | Define se a zona se moverá juntamente com o alvo. | true |
Note que as zonas animáveis não podem acompanhar (track). Mais sobre isso aqui.
Exemplo
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 o mesmo exemplo da parte 1 e da parte 2, a zona está agora definida para não acompanhar. Isto significa que a zona surgirá na localização do boss, mas mesmo que o boss continue a afastar-se, a zona permanecerá onde surgiu inicialmente.
Por fim, note que, se uma zona estiver definida para não acompanhar, registará a sua localização no momento em que o script é chamado.
Como exemplo, se quiser ter uma fase de aviso e uma fase de dano para o seu script, terá de garantir que executa todas as ações no início e colocar um tempo de espera em todas as ações relacionadas com dano que quer executar mais tarde individualmente. Não deve atrasar um script inteiro que chame através de RUN_SCRIPT por razões técnicas.
O seguinte é um exemplo correto de um poder com uma fase de aviso e uma fase de dano, retirado do Frost Palace Sanctum.
Exemplo
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 faz muitas coisas, mas está separado em dois scripts claros: VisualCylinder e DamageCylinder.
O VisualCylinder é executado primeiro e tem a ação RUN_SCRIPT, que imediatamente também executa o DamageCylinder ao mesmo tempo que o VisualCylinder está a ser executado.
No entanto, cada uma das ações em DamageCylinder está definida para esperar 60 ticks, ou 3 segundos.
Isto significa que o boss tem uma fase de aviso de 3 segundos e depois faz uma fase de dano, e mesmo que as zonas estejam definidas para não acompanhar, a zona de aviso e a zona de dano ficarão na mesma localização.
Propriedades de alvo específicas das zonas
As zonas têm as seguintes propriedades específicas:
coverage
Define a percentagem da zona que será efetivamente usada para a ação. Só funciona para alvos de localização (não funciona ao visar jogadores ou outras entidades).
| Valores | Detalhes | Predefinição |
|---|---|---|
coverage | Define a percentagem da zona que será coberta. Pode aleatorizar este valor usando ~, por exemplo: 1.0~0.3. | 1.0 |
Exemplo
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
Neste caso, apenas 50% da zona ficará coberta de partículas.
Herdar alvos
Quando um script executa outro script (ou "chama" esse script), é possível passar informação de zona e de alvo do primeiro script para o segundo.
Exemplos de utilização
- Executores de scripts melhorados
Os executores de scripts são scripts cuja única função é executar muitos outros scripts. São usados para facilitar a gestão de scripts, especialmente ao lidar com vários scripts que requerem temporização precisa.
Com a herança de alvos, vários scripts podem usar a mesma zona ou alvo, reduzindo potencialmente centenas de linhas de scripting repetitivo.
- Filtragem de alvos em matriosca / boneca russa
Podem ser aplicadas condições de filtragem aos alvos numa ação. Ao passar os alvos para um script diferente com filtros diferentes, torna-se possível estratificar as condições e aplicar efeitos diferentes ao mesmo conjunto de alvos com base em critérios cada vez mais específicos.
Como exemplo, é possível criar uma zona que procura jogadores e fazer uma ação que verifica se todos os jogadores na zona têm uma etiqueta específica. Os alvos válidos podem depois ser passados para outro script, onde outra ação pode executar uma condição de verificação aleatória e aplicar um efeito com base nessa probabilidade. Os alvos podem depois ser passados para outro script, onde outra condição pode fazer uma verificação para ver se os alvos ainda estão vivos e executar um comportamento especial caso estejam mortos.
Estes são, claro, apenas exemplos. É um sistema altamente flexível.
- Zonas complexas
Por fim, é possível estratificar alvos para criar zonas complexas, opcionalmente usando condições se necessário, e é até possível criar zonas semialeatorizadas usando as condições de script e a capacidade de executar apenas um dos scripts listados nas ações do script.
Nota: Nesta secção, "script pai" refere-se ao script que executa o "script herdeiro", que é o script que usará os alvos herdados.
Ao usar a herança de alvos, é importante analisar cuidadosamente o script pai para garantir que os dados corretos estão a ser passados.
INHERIT_SCRIPT_TARGET
Ao usar INHERIT_SCRIPT_TARGET, os alvos do script pai serão passados para o script herdeiro. Isto tem algumas ressalvas:
-
Ao passar alvos de entidade, é possível executar ações que requerem localizações (como fazer surgir partículas), pois será usada a localização das entidades. É também possível, claro, usar ações que requerem entidades.
-
Ao passar alvos de localização, só é possível usar localizações. A única forma de obter uma entidade a partir de uma localização é criando uma zona nessa localização e procurando entidades. Por isso, embora não seja impossível passar uma localização e depois obter entidades, isso exigirá um pouco de trabalho extra.
Herdar zonas
Ao usar INHERIT_SCRIPT_ZONE_FULL ou INHERIT_SCRIPT_ZONE_BORDER, é imperativo que o script pai defina uma zona, caso contrário o script herdeiro não conseguirá ser executado corretamente.
Além disso, as zonas podem ser opcionalmente acompanhadas (tracked). Isto também será passado juntamente com a zona.
-
Uma zona não acompanhada (untracked) criará sempre uma zona no local definido pelo script herdeiro. Isto significa que as definições da zona serão usadas pelas ações nos scripts herdeiros para criar zonas totalmente novas sempre que uma ação é executada, e a localização dessas zonas será definida pela ação.
-
Uma zona acompanhada (tracked) pode passar exatamente a mesma localização de zona a todos os scripts herdeiros se o script pai estiver definido para visar
ZONE_FULLouZONE_BORDER. Isto significa que todos os scripts atuarão sobre as mesmas localizações.