Ir para conteúdo
  • 0

Dúvida: ignoreCancelled / isCancelled


Ygor

Pergunta

Olá,

Estou desenvolvendo um plugin e preciso checar se o evento foi cancelado, vou dar um exemplo:

Eu utilizo o evento de checar se um jogador colocou quebrou um bloco (BlockBreakEvent) e cada vez que ele quebrar um bloco vá tal item para o inventário dele.

Porém, utilizando o exemplo do PlotMe, caso o jogador quebre o bloco e o bloco não esteja no seu terreno, o item virá para o inventário dele e o bloco continuará lá.

Ou seja, o evento é cancelado, o bloco volta para o PlotMe e o item é adicionado no inventário do jogador.

Então, gostaria de saber como verificar se o evento foi cancelado, caso seja eu retorno o código e o algoritmo para por alí.

Queria também que vocês caracterizassem a função do ignoreCancelled e do isCancelled, há diferença? Qual prioridade eu devo usar nesses eventos?

 

Espero que tenha ficado claro.

Agradeço à ajuda de todos desde já, abraços.

Editado por JoaoY
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Se o ignoreCancelled estiver em true e o evento for cancelado, o método nem é chamado. Por exemplo:

@EventHandler(priority = EventPriority.LOWEST)
public void onBreak(BlockBreakEvent e) {
	e.setCancelled(true);
}

Como este código tem uma prioridade baixa, ele será chamado primeiro.

@EventHandler(ignoreCancelled = true)
public void onBreak2(BlockBreakEvent e) {
	System.out.println("Método chamado");
}

Esse método acima é chamado depois do método anterior, no entanto o ignoreCancelled está em true. O método anterior cancelou o evento, então ele nem é chamado.

public void onBreak3(BlockBreakEvent e) {
	if (e.isCancelled()) {
		System.out.println("Evento cancelado");
		return;
	}
	
	System.out.println("Evento não cancelado");
}

Já o método isCancelled(); retorna se o evento foi cancelado ou não.

 

Então seria melhor utilizar o ignoreCancelled, pois o seu código ficaria menor e evitaria chamada de métodos desnecessários.

Link para o comentário
Compartilhar em outros sites

  • 0

Fiquei intrigado: Se o código têm a prioridade baixa ele será chamado primeiro ou depois? Está me dizendo que se eu colocar uma prioridade HIGH ele vai ser demorado mais a ser chamado?

 

Então no caso eu deveria utilizar para o BlockBreakEvent com uma prioridade baixa, certo?

Por lógica o código identificaria primeiro o método que verifica se o evento foi cancelado, se foi, ele ignora.

Depois disso que ele chamaria o BlockBreakEvent que tem por função dar o item ao jogador.

 

Estou seguindo a linha de raciocínio correto?

Outra dúvida, caso eu não queira cancelar o evento, apenas verificar se ele foi cancelado por outro plugin, no caso o PlotMe, basta eu adicionar "ignoreCancelled = true" e nada mais?

 

Obrigado pela atenção no tópico.

Editado por JoaoY
Link para o comentário
Compartilhar em outros sites

  • 0

Fiquei intrigado: Se o código têm a prioridade baixa ele será chamado primeiro ou depois? Está me dizendo que se eu colocar uma prioridade HIGH ele vai ser demorado mais a ser chamado?

 

Então no caso eu deveria utilizar para o BlockBreakEvent com uma prioridade baixa, certo?

Por lógica o código identificaria primeiro o método que verifica se o evento foi cancelado, se foi, ele ignora.

Depois disso que ele chamaria o BlockBreakEvent que tem por função dar o item ao jogador.

 

Estou seguindo a linha de raciocínio correto?

Outra dúvida, caso eu não queira cancelar o evento, apenas verificar se ele foi cancelado por outro plugin, no caso o PlotMe, basta eu adicionar "ignoreCancelled = true" e nada mais?

 

Obrigado pela atenção no tópico.

EventPriority funciona assim:

 

  • LOWEST - Mais baixa
  • LOW - Baixa
  • NORMAL - Padrão
  • HIGH - Alta
  • HIGHEST - Mais alta
  • MONITOR - Acima de todas

 

Isso significa que um método com prioridade LOWEST sempre será chamado primeiro, depois o LOW e assim por diante.

O HIGHEST serve para dar a palavra final, entende? Ele é chamado por último, mas nada que afete a performance. Por exemplo:

 

Um plugin X tem um listener para o evento PlayerJoinEvent. Esse método está com a prioridade normal e altera a mensagem de login para "Alguém entrou".

 

Mas nesse mesmo servidor tem o plugin Y, com prioridade HIGHEST e altera a mensagem para "Fulano logou". Como HIGHEST > NORMAL, a mensagem que será mostrada é "Fulano logou".

 

Já a prioridade MONITOR serve literalmente para monitorar. Você não deve fazer alterações no evento com ele, tais como mudar drops na morte, mudar a mensagem de saída ou até mesmo cancelar o evento. Ele é muito usado em plugins de log, que precisa pegar o "evento final", que foi modificado por outros plugins.

 

Não sei qual a prioridade o PlotMe usa, talvez seja a NORMAL. Então você pode usar a HIGHEST com o ignoreCancelled. Daí o evento será chamado depois do método do PlotMe, e se tiver sido cancelado seu método não será chamado.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...