Configuration Résolu Java : BlockPlaceEvent, setCancelled non fonctionnel

Pourquoi chercher à savoir quel bloc il a dans la main?
Tu vérifie juste si le bloc placé est une torche ou etc.. Avec l'event BlockPlaceEvent
Exemple:
Code:
    @EventHandler
    public void OnBlockPlace(BlockPlaceEvent e){
        if(e.getBlock().getType() != Material.TORCH
                || e.getBlock().getType() != Material.LEVER){
            e.setCancelled(true);
        }
    }
Peut-être que j'ai mal interprété tes intentions mais ceci me parait plus convenable :)
Yop ! :D J'avais essayé un truc comme ça à la base. Je vais essayer avec ta syntaxe mais il me semble que c'est ce que j'avais essayé au départ :/

AlexFatta

EDIT : Surprise surprise !! Ca fonctionne pas xDD

Code:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
     
        final Player player = event.getPlayer();
        final Material block = event.getBlock().getType();
     
        System.out.println(player.getInventory().getItemInMainHand());
     
        if (event.getHand() == EquipmentSlot.HAND) {
            if (block != Material.TORCH || block != Material.LEVER || block != Material.WOOD_BUTTON || block != Material.STONE_BUTTON) {
                event.setCancelled(true);
                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
                        ChatColor.RED + "Erreur : tu ne peux pas poser ce block.");
            }
        }
    }

EDIT 2 :

J'ai changé et essayé ceci mais ca ne fonctionne pas non plus :
Code:
@EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
       
        final Player player = event.getPlayer();
        final Material block = event.getBlock().getType();
        Block block_to_replace = event.getBlockPlaced(); //Ici j'ai modifié
       
        System.out.println(player.getInventory().getItemInMainHand());
       
        if (event.getHand() == EquipmentSlot.HAND) {
            if (block != Material.TORCH || block != Material.LEVER || block != Material.WOOD_BUTTON || block != Material.STONE_BUTTON) {
                
                block_to_replace.setType(Material.AIR); //et ici j'ai modifié

                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
                        ChatColor.RED + "Erreur : tu ne peux pas poser ce block.");
            }
        }
    }
 
Dernière édition:
Salut,

vu que ce problème devenait incompréhensible, j'y ait réfléchis à tête reposé :)
J'ai d'abord pris ta place : je me suis mis en tête de Dev un plugin pour interdire le placement des blocks. Ce que j’ai fait sans soucis en une minute trente :
1501165001-cc.png

Il écrit "Coucou ..." quand mon event est annulé ;)
Main.java:
Code:
package plagia;

import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import plagia.events.BlockPlace;

public class Main extends JavaPlugin {
   
    @Override
    public void onEnable() {
        PluginManager pm = Bukkit.getServer().getPluginManager();
        pm.registerEvents(new BlockPlace(), this);
        super.onEnable();
    }
   
    @Override
    public void onDisable() {
        super.onDisable();
    }

}

BlockPlace.java
Code:
package plagia.events;

import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;

public class BlockPlace implements Listener {
   
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        Material block = event.getBlock().getType();
     
        if(block != Material.TORCH || block != Material.LEVER || block != Material.WOOD_BUTTON || block != Material.STONE_BUTTON){
            System.out.println("Coucou le forum minecraft.fr :)");
            event.setCancelled(true);
        }
    }

}

Note: D'ailleurs le
Code:
event.setCancelled(true);
peut etre remplacer par
Code:
event.setBuild(false);


Ensuite, j'ai donc décider de poursuivre dans le plagia et j'ai donc salement ctrl c/v ton code, voir si c'est moi qui suit aveugle ou s'y il y a bien un soucis quelque part xD
J'ai repris la base du plugin que j'avais fait avant et j'ai remplacer mon BlockPlace par ton code (mis en Edit 2) ;)

Ton code ci plus haut fonctionne très bien et je te le confirme.
Code:
@EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
     
        final Player player = event.getPlayer();
        final Material block = event.getBlock().getType();
        Block block_to_replace = event.getBlockPlaced(); //Ici j'ai modifié
     
        System.out.println(player.getInventory().getItemInMainHand());
     
        if (event.getHand() == EquipmentSlot.HAND) {
            if (block != Material.TORCH || block != Material.LEVER || block != Material.WOOD_BUTTON || block != Material.STONE_BUTTON) {
               
                block_to_replace.setType(Material.AIR); //et ici j'ai modifié
            }
        }
    }


-> Résultat: Ton problème vient bien d'un problème pour register l'event vu qu'il n'est pas détecté sur le serveur, or il l'est chez moi :/

Maintenant qu'on est sur que le problème ne vient pas du code mais bien de l'event, il faut trouver pourquoi :/ J'ai regardé ton code des dizaines de fois, et dans ma tête, ça devrait fonctionner xDD

Du coup, je te propose quelques pistes :
  • Change ta version de spigot associé à ton plugin (met une version clean, on sait jamais) (Tu dev pour quelle version là ?),
  • Assure toi d'avoir bien
    Code:
    implements Listener
    même si on a déjà vérifier :/
  • Essaye de remplacer ton
    Code:
    getServer().register...
    par
    Code:
    Bukkit.getServer().getPluginManager().registerEvents...
  • Assure toi de ne pas avoir d'erreurs consoles,

Très honnêtement je doute que ces petites astuces changement quelques chose mais, même à tête reposé je ne vois rien qui pose problème, donc on peut toujours essayer :/
 
>>>>>AMENO<<<<

Bon ca fonctionne enfin ! J'ai effectué ceci :

- J'ai rajouté "Bukkit." devant mon getServer().getPluginManager().machin.
- J'ai changé de serveur (j'en ai crée un autre sur lequel ca fonctionne, attention le plugin seul, mais je pense qu'avec d'autre aussi). Donc pour les curieux, le code ressemble à ça (il a été modifié sinon tous les blocks étaient refusés à la pose je ne sais pas pourquoi xD) Visiblement le plugin n'aimait pas la négation dans le if. Donc j'ai "feinté" le système xDD

Code:
@EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        final Player player = event.getPlayer();
        Block block_to_replace = event.getBlockPlaced();
        
        if (event.getHand() == EquipmentSlot.HAND) {
            if (player.getInventory().getItemInMainHand().getType() == Material.TORCH || player.getInventory().getItemInMainHand().getType() == Material.LEVER || player.getInventory().getItemInMainHand().getType() == Material.WOOD_BUTTON || player.getInventory().getItemInMainHand().getType() == Material.STONE_BUTTON) {
                
            } else {
                block_to_replace.setType(Material.AIR);
            }
        }
    }

Voilà voilà !

Je vais continuer ce fuck*** plugin qui me prend la tête, mais quand il sera fini je serais bien content :p

Sujet passé en résolu, merci @DiscowZombie et lucas ;)

AlexFatta