Ir para conteúdo

ERRO Could not pass event BlockPlaceEvent


S0_Dev

Posts Recomendados

Denovo como sempre pedindo ajuda ?

então dessa vez é sobre meu plugin de maquina

ele deveria funcionar botei ele para setar uma meta no bloco no event blockplaceevent

mas quando eu boto o bloco e o combustivel nada acontece a unica coisa que aparece é o seguinte erro

Could not pass event BlockPlaceEvent

 

SE PRECISAR DO CODIGO É SO FALAR QUE EU MANDO

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, SrBlecaute disse:

ItemStack hand = p.getItemInHand();

 

verifica se o item na mão não é nulo e nem é AR, pode dar erro de NullPointer

e envia o erro para ver aonde ta o erro. 

então  eu basicamente eu faria

if(hand.Material.AIR) ?

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, SrBlecaute disse:

...
hand == null || hand.getType() == Material.AIR

@EventHandler
    public void aoColocarBloco(BlockPlaceEvent e) {
        Player p = e.getPlayer();
        if (e.getPlayer() instanceof Player) {
            ItemStack hand = p.getItemInHand();
            if (hand == null || hand.getType() == Material.AIR) {
                if (hand.hasItemMeta()) {
                    if (hand.getItemMeta().hasDisplayName()) {
                        if (hand.getItemMeta().getDisplayName().equals("§cMaquina sangrenta")) {
                            Block bloco = e.getBlockPlaced();
                            bloco.setMetadata("Maquina", new FixedMetadataValue(main, 10));
                        } // verificação de nome
                    }
                }
            }
        }
    }

   Dessa forma?

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, S0_Dev disse:

@EventHandler
    public void aoColocarBloco(BlockPlaceEvent e) {
        Player p = e.getPlayer();
        if (e.getPlayer() instanceof Player) {
            ItemStack hand = p.getItemInHand();
            if (hand == null || hand.getType() == Material.AIR) {
                if (hand.hasItemMeta()) {
                    if (hand.getItemMeta().hasDisplayName()) {
                        if (hand.getItemMeta().getDisplayName().equals("§cMaquina sangrenta")) {
                            Block bloco = e.getBlockPlaced();
                            bloco.setMetadata("Maquina", new FixedMetadataValue(main, 10));
                        } // verificação de nome
                    }
                }
            }
        }
    }

   Dessa forma?

ai tu me lasca, aconselho fortemente a aprender lógica e java, depois aprender sobre a API da bukkit.

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, SrBlecaute disse:

ai tu me lasca, aconselho fortemente a aprender lógica e java, depois aprender sobre a API da bukkit.

Ok ok, eu irei estudar mais java, meu colegio havia curso mas minha professora vazou pode ajeitar o codigo pra mim então?

Link para o comentário
Compartilhar em outros sites

26 minutos atrás, SrBlecaute disse:

ai tu me lasca, aconselho fortemente a aprender lógica e java, depois aprender sobre a API da bukkit.

Porfavor, preciso desse plugin quanto antes, tenho que finalizar meu servidor.

Link para o comentário
Compartilhar em outros sites

4 horas atrás, S0_Dev disse:

@EventHandler
    public void aoColocarBloco(BlockPlaceEvent e) {
        Player p = e.getPlayer();
        if (e.getPlayer() instanceof Player) {
            ItemStack hand = p.getItemInHand();
            if (hand == null || hand.getType() == Material.AIR) {
                if (hand.hasItemMeta()) {
                    if (hand.getItemMeta().hasDisplayName()) {
                        if (hand.getItemMeta().getDisplayName().equals("§cMaquina sangrenta")) {
                            Block bloco = e.getBlockPlaced();
                            bloco.setMetadata("Maquina", new FixedMetadataValue(main, 10));
                        } // verificação de nome
                    }
                }
            }
        }
    }

   Dessa forma?

Amigo, seguinte.

o "if (e.getPlayer instanceof Player)" não é necessário. Pois, você já está pegando o jogador. Não é necessário verificar se ele é realmente uma entidade jogador. Você só faria essa checagem caso pegasse uma entidade que não deixa explícito que é um jogador. Exemplo: "e.getEntity()", "e.getWhoClicked()", "e.getDamager()", entre outros. 

Nesse código onde você verifica o item do jogador se é nulo, você tem que fazer um return. Não é para continuar o código se o item em questão for nulo.
O código ficaria assim:

@EventHandler
public void aoColocarBloco(BlockPlaceEvent e) {
    Player p = e.getPlayer();
    ItemStack hand = p.getItemInHand();
    if (hand == null || hand.getType == Material.AIR) // linha 5
        return;
    
    if (hand.hasItemMeta() && hand.getItemMeta().hasDisplayName()) {
        if (hand.getItemMeta().getDisplayName().equalsIgnoreCase("§cMaquina sangrenta")) { // linha 9
            Block block = e.getBlockPlaced();
            block.setMetadata("Maquina", new FixedMetadataValue(main, 10));
        }
    }
}

Agora vamos revisar as modificações no código que eu fiz.

Na "linha 5" eu implementei corretamente a checagem do item, caso o item da mão do jogador fosse nulo ou ar, na linha seguinte eu desse um return e não seguisse mais adiante no código. Você colocaste para verificar se o item for nulo ou ar, continuasse o código. Isso está errado. Pois logo adiante ele faria uma verificação se aquele item na mão do jogador tivesse uma ItemMeta e um nome de Display.  E não tem como verificar algo de uma coisa inexistente né? Então... seguindo a lógica, você tem que entender um pouco das verificações e o que o código tá escrito e o que ele irá fazer. Não adianta colocar ele e rodar para funcionar, sendo que você não entendeu ele. 

Essa linha de código que o moderador enviou, faz com que se a condição for verdadeira (que está dentro dos parênteses e dentro de um if), ele irá fazer o que estará dentro daquele if. Caso eu fosse arrumar o seu código mudando apenas essa parte da condição, ficaria assim a nova linha: "if (hand != null && hand.getType == Material.BRICK)", onde na primeira verificação, ele irá ver se o item não é nulo, e seguindo da 2º verificação, se o material é do tipo BRICK (tijolo).

Na "linha 9" eu coloquei um "equalsIgnoreCase" pois a verificação fica até mais prática se houver alguma caractere maiúscula ou diferente. O "equals" é usado para caso você queira realmente que tenha todas as caracteres iguais. O nome da primeira no qual eu mencionei já até fala. Ele ignora os caps-lock da String e faz com que toda a String verificada será em minúscula. Assim, não ocorrendo erros de verificação caso você digite alguma caractere maiúscula.

Recomendo para você dar uma revisada nos seus códigos e ter uma aulinha prática de alguns tutoriais no YouTube! Você tá errando muito em lógica de programação e análise de algoritmos... E isso é um problema futuramente para você amigo. Abraços!

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

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