Alvos de Elite Script
Os alvos selecionam as entidades ou localizações usadas por ações, condições e zonas. Escreva Target como um mapa YAML. As predefinições são SELF para targetType, 20.0 para range e true para track. Os nomes dos campos não distinguem maiúsculas de minúsculas; os valores enumerados de tipo de alvo devem estar em maiúsculas.
Tipos de alvo
Os tipos de alvo definem que entidades ou localizações são visadas por um script.
DIRECT_TARGET é a entidade do evento: pode ser uma elite atacante, uma entidade a atravessar uma zona ou um jogador. Use-o apenas com um evento compatível; sem alvo direto, não seleciona nada. Não é automaticamente o alvo de combate atual do boss. Os tipos de proximidade pesquisam numa caixa alinhada com os eixos em torno do boss, sem ordenar por distância.
Alvos de entidade podem fornecer a localização atual dos pés a ações de localização. O inverso não é automático: LOCATION, LOCATIONS e LANDING_LOCATION não selecionam entidades presentes nessas posições. Crie uma zona para as encontrar. Os seletores de jogadores não excluem por si só espectadores ou jogadores de outros encontros; uma ação pode aplicar regras adicionais.
| Tipo de alvo | Detalhes | Especial |
|---|---|---|
NEARBY_PLAYERS | Jogadores no alcance | range opcional, predefinição 20.0 |
NEARBY_MOBS | Entidades vivas que não sejam jogadores no alcance, excluindo o boss | range opcional, predefinição 20.0 |
NEARBY_ELITES | Elites acompanhadas no alcance, excluindo o boss | range opcional, predefinição 20.0 |
WORLD_PLAYERS | Jogadores no mundo | ❌ |
ALL_PLAYERS | Jogadores no servidor | ❌ |
DIRECT_TARGET | Entidade fornecida pelo evento | Requer um evento compatível |
SELF | Elite que usa o poder | ❌ |
SELF_SPAWN | Localização de spawn guardada do boss para ações de localização | As ações de entidade continuam a receber o próprio 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 | Usa o contexto do alvo da ação envolvente | Apenas para condições de ação com FILTERING e vetores relativos; não é um alvo de ação autónomo |
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
Estas definições aplicam-se ao resolver localizações de alvo. Não movem entidades nem alteram qual entidade recebe uma ação.
| Valores | Detalhes | Especial |
|---|---|---|
offset | Define o deslocamento (offset) para a localização do alvo. | Não pode visar entidades! |
relativeOffset | Desloca localizações usando uma definição de vetor relativo. Os seus alvos de origem e destino determinam a direção. | Não pode visar entidades! |
Os deslocamentos aplicam-se a localizações derivadas de alvos de entidade, como SELF e DIRECT_TARGET, a SELF_SPAWN, LOCATION e LOCATIONS, e a cada localização amostrada de uma zona por ZONE_FULL, ZONE_BORDER e as suas variantes herdadas. Para mover a zona inteira, aplique o deslocamento ao Target da própria zona, como nos exemplos abaixo. As mesmas regras aplicam-se aos utilitários de scripts Lua.
offset usa os eixos X/Y/Z do mundo, não a direção para onde a entidade olha. Aplica-se antes de relativeOffset. Os resultados de LANDING_LOCATION e INHERIT_SCRIPT_TARGET ignoram estes deslocamentos adicionais. Dentro de um vetor relativo, ACTION_TARGET usa diretamente a localização de ação fornecida e ignora as suas próprias definições de deslocamento.
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
O relâmpago cai 2 blocos acima do boss. STRIKE_LIGHTNING seleciona localizações, por isso o seu alvo aceita um deslocamento. O relâmpago é apenas visual e não causa dano a entidades.
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 metade da largura da caixa de pesquisa para NEARBY_PLAYERS, NEARBY_MOBS e NEARBY_ELITES. O valor aplica-se aos eixos X, Y e Z; não é um limite esférico de distância. As pesquisas de mobs e elites excluem o boss que executa o poder.
Use um número fixo não negativo para uma caixa consistente. Um intervalo com ~ pode ser amostrado separadamente em cada eixo e usa a amostragem decimal descrita em coverage abaixo; não garante um cubo com um único raio sorteado.
| Valores | Detalhes | Predefinição |
|---|---|---|
range | Metade da largura em blocos para pesquisas de jogadores, mobs e elites próximos. | 20.0 |
Exemplo
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"
Quando o boss morre, envia uma mensagem aos jogadores na caixa que se estende 25 blocos ao longo de cada eixo a partir da sua posição.
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,yaw,pitch para a localização. worldname,x,y,z também é aceite (yaw e pitch assumem então 0), tal como a forma sem mundo x,y,z,yaw,pitch, embora esta última deixe a localização sem mundo associado e raramente seja o que se pretende. Um simples x,y,z com três valores não é válido e é rejeitado com Attempted to deserialize an invalid location! na consola.
Use um mundo carregado ou same_as_boss. A análise não carrega mundos; dados mal formatados ou um mundo não resolvido podem falhar ao usar o alvo. As coordenadas são absolutas, mesmo com same_as_boss, que apenas altera o mundo.
Se o mundo configurado não estiver carregado e o boss estiver num mundo chamado <configuredWorld>_<number>, o alvo usa esse mundo de instância. Isto não substitui um mundo configurado que já esteja carregado.
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,yaw,pitch para cada localização, com as mesmas variantes aceites que em location.
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 separam os alvos de origem das ações que usam a sua geometria. Zone.Target fornece as origens; ZONE_FULL ou ZONE_BORDER numa ação seleciona a partir das formas resultantes. Várias origens podem gerar várias formas. As entidades são deduplicadas; formas sobrepostas podem continuar a fornecer localizações de partículas duplicadas.
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
Este fragmento descreve um cilindro de raio 10 e altura 1, a partir dos pés do boss para cima. Ainda não tem ações; um script executável precisa das Actions abaixo. filter: PLAYER aplica-se às consultas de entidades, não às localizações geométricas das partículas.
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
Use targetType: ZONE_FULL para a forma completa ou targetType: ZONE_BORDER para a borda. Ações de localização recebem pontos geométricos amostrados; ações de entidade recebem entidades conforme o filtro e as verificações de inclusão da zona. Não recebem o mesmo tipo de coleção.
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
As partículas surgem em posições amostradas por todo o cilindro, não nas posições dos jogadores. Há 12 execuções separadas por 5 ticks. As ações de partículas em zonas usam cerca de 30% de cobertura se coverage não estiver definido explicitamente. filter: PLAYER não limita estas partículas aos jogadores.
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)
Defina track no Target da ação, como abaixo. Com true, as formas normalmente voltam a resolver as origens móveis quando solicitadas. Com false, a ação guarda as formas antes do seu wait, mantendo a origem fixa; consultas posteriores continuam a encontrar as entidades presentes na forma nesse momento. Não fixa a lista de jogadores presentes no lançamento.
| Valores | Detalhes | Predefinição |
|---|---|---|
track | Volta a resolver o alvo em vez de guardar a origem da zona e as localizações amostradas. | true |
Com um animationDuration positivo, a ação guarda as formas animadas quando começa, seja qual for a sua definição de track. Guarda as formas, não uma lista estática das suas posições, por isso a animação continua. Mais informação 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.
A cache é preparada ao iniciar a ação, antes da sua espera. Atrasar RUN_SCRIPT também atrasa o início e a cache do script chamado.
Para um aviso seguido de dano na posição original, inicie ambos os scripts imediatamente e coloque wait nas ações de dano. Use origens fixas coincidentes se as posições tiverem de permanecer idênticas independentemente de movimento ou ações anteriores.
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.
O aviso dura 3 segundos antes dos efeitos atrasados. Ambos os scripts capturam a mesma posição horizontal do boss quando iniciados imediatamente. Os volumes diferem: o cilindro visual tem altura 1 aos pés, enquanto o de dano começa 1 bloco abaixo e tem altura 10. DAMAGE repete-se quatro vezes a intervalos de 10 ticks; SET_ON_FIRE executa-se uma vez após a espera e pede 80 ticks de fogo. A animação precisa de um modelo personalizado compatível com fire_zone.
Cada execução de uma ação mantém a sua própria cache. Lançamentos sobrepostos do mesmo script não substituem as localizações guardadas uns dos outros, e um novo lançamento nunca reutiliza localizações guardadas por um anterior.
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 | Fração das localizações da zona a conservar; 0.5 conserva aproximadamente metade. Prefira um valor fixo de 0 a 1. | 1.0 |
Um intervalo como 0.3~1.0 sorteia um valor desde 0.3 até 1.0, sem incluir 1.0, e a cobertura pode ser sorteada separadamente para cada ponto. Use uma fração fixa para uma cobertura previsível. coverage: 1.0 explícito conserva todas as posições; a omissão numa ação de zona SPAWN_PARTICLE usa 0.3. A cobertura não reduz consultas de entidades. Com track: false, a seleção de localizações de uma zona estática é guardada e reutilizada, sem novo sorteio em cada repetição.
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
Cada posição amostrada tem 50% de probabilidade de ser conservada para partículas. A contagem resultante é aproximada, não exatamente metade.
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
Uma ação pai que realmente resolve e filtra entidades pode passar o resultado guardado ao filho através da sua lista scripts. Mantenha os tipos de alvo compatíveis. RUN_SCRIPT não executa por si só a filtragem individual; acrescentar-lhe uma condição FILTERING não produz uma lista filtrada para herdar.
Para verificar etiquetas, use ACTION_TARGET com FILTERING na ação de entidade. Uma probabilidade aleatória requer condições de script ou BLOCKING; não é um sorteio individual por entidade durante a filtragem. isAlive verifica a validade Bukkit, pelo que invertê-lo não é uma forma fiável de ativar comportamento quando um jogador morre.
- 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
INHERIT_SCRIPT_TARGET lê o seletor ou a cache da ação pai concreta que chamou o filho, não a união de todos os alvos do script pai. Coloque-o nas ações ou origens de zona do filho, não nas suas Conditions de nível superior: essas são avaliadas antes de existirem os dados de ação herdados, e o alvo herdado falha aí com um erro.
O pai só passa os seus alvos resolvidos e filtrados pelas condições quando o seu Target tem track: false. Com o track: true predefinido, o filho volta a resolver o alvo do pai, sem a filtragem do pai. Um pai RUN_SCRIPT nunca resolve os seus próprios alvos, pelo que o seu filho volta sempre a resolver as entidades. Com track: false, o filho reutiliza as localizações que esse pai guardou quando a sua ação começou. Há algumas ressalvas:
-
Ao passar alvos de entidade, o filho pode usá-los com ações de entidades ou com ações de localização. As ações de localização recebem as localizações das entidades.
-
Ao passar alvos de localização, só é possível usar localizações. Uma ação de entidades que herde localizações falha com um erro. 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.
Uma ação com track: false guarda as formas da zona antes da sua espera. Uma ação com acompanhamento normalmente volta a resolver as origens móveis sem as guardar. Os dados da ação pai podem reutilizar formas guardadas; track: true não fixa uma localização partilhada.
Os alvos de zona herdados usam a própria Zone do script pai e as formas guardadas pela ação que fez a chamada, se as tiver guardado. As consultas de entidades de INHERIT_SCRIPT_ZONE_FULL usam a verificação do volume completo, tal como ZONE_FULL. Se o script pai não tiver uma zona válida, ou se o script não tiver sido chamado por outro script, a ação falha com um erro.
Para partilhar uma origem fixa, dê track: false ao Target da ação que faz a chamada. O filho reutiliza então as formas que o pai guardou quando a sua ação começou, mesmo que as ações do próprio filho esperem.