Configuration Résolu Java : BlockPlaceEvent, setCancelled non fonctionnel

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Wohiohio !

Eh oui encore moi !

Je cherche cette fois-ci à faire en sorte que le joueur ne puisse pas poser autre block que torche, levier, boutons en bois et en pierre. Seulement voilà vous l'aurez devinez, le code ne fonctionne pas. Je vous le met à la suite @DiscowZombie ou même @Detobel36 si vous avez des idées je suis preneur x) Je n'ai aucune erreur dans les logs et il ne se passe rien en jeu. Je pose un block quelconque et il se pose normalement.

Code:
     @Override
    public void onEnable() {
         saveDefaultConfig();
         PluginFile();
         setRayon(getConfig().getInt("Rayon"));
         setBase_count(getConfig().getInt("base_count"));
         for (String s : getConfig().getStringList("Bases")){
             new LocationManager(s).add(getConfig().getString("Bases."+s+".world"), getConfig().getInt("Bases."+s+".x1"), getConfig().getInt("Bases."+s+".x2"),
                     getConfig().getInt("Bases."+s+".z1"), getConfig().getInt("Bases."+s+".z2"));
         }
         getServer().getPluginManager().registerEvents(new BlockPlaceManager(this), this);

Bon je vous squize ce qui est inutile dans le onEnable.

Et voici ma classe concernée :

Code:
package fr.alexfatta.fallenkingdoms.managers;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;

import fr.alexfatta.fallenkingdoms.main;

public class BlockPlaceManager implements Listener {
    
    public main main;
    
    public BlockPlaceManager(main main) {
        this.main = main;
    }
    
    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        
        Player player = event.getPlayer();
        Block block = event.getBlock();
        
        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)) {
            player.sendMessage(main.getGamePrefix() +
                    ChatColor.RED + "Erreur : tu ne peux pas poser ce block : "+ChatColor.LIGHT_PURPLE+block);
            event.setCancelled(true);
        }
    }
    
    public void playerInArea(Player player) {
        int x1, x2, z1, z2;
        String world;
        
        for (String s : main.getConfig().getStringList("Bases")) {
            x1 = main.getConfig().getInt("Bases."+s+".x1");
            x2 = main.getConfig().getInt("Bases."+s+".x2");
            z1 = main.getConfig().getInt("Bases."+s+".z1");
            z2 = main.getConfig().getInt("Bases."+s+".z2");
            world = main.getConfig().getString("Bases."+s+".world");
            
            if (!(player.getLocation().getX() > x1) && !(player.getLocation().getX() < x2) &&
                    !(player.getLocation().getZ() > z1) && !(player.getLocation().getZ() < z2) && !(player.getWorld().getName() == world)) {
                player.sendMessage(main.getGamePrefix() +
                        ChatColor.RED + "Erreur : tu ne peux pas poser ce block !");
            }
        }
    }
    
}

Voilà voilà ! Des idées ? Des choses que j'ai mal faites ? :p (Au passage si vous voyez d'autre erreurs ne vous retenez pas hein dites le) :p

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Salut,

dit moi dans ton onEnable ça ressemble beaucoup à mon code xD
Non, plus sérieusement, content si je peut t'aider ;)

Pour ton problème, je ne vois rien de spécial qui fait que ça ne fonctionne pas, as tu bien register ton event dans ton plugin manager? :) (c'est 'bête' comme erreur, mais ça arrive parfois d'oublier, donc vérifie ça ;)). Ensuite, si ça marche toujours pas, je t'invite à écrire un message dans la console (avec le Sysout par exemple), avec le nom du block qu'à le joueur dans sa main (System.out.println(player.getInventory().getItemInMainHand())); ça t'aidera à y voir plus clair ;)

Si ça ne marche toujours pas, je regarderais plus en détail ton code ! ;) (Je suis sur mobile donc pas simple de le lire là).

D'ailleurs le player.getInventory().getItemInHand(); est deprecated dans les versions post 1.9, il doit être remplacé par player.getInventory().getItemInMainHand();.
 
Dernière édition:

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Re !

dit moi dans ton onEnable ça ressemble beaucoup à mon code xD
Noooooon c'est pas vréééé xDD

Bon sinon quand tu parles de plugin manager, tu parles bien de ça :
Code:
getServer().getPluginManager().registerEvents(new BlockPlaceManager(), this);
que l'on met dans le onEnable ? C'est fait.

J'ai aussi check les listener etc... la class BlockPlaceManager est bien 'implements Listener' comme tu peux le voir sur mon premier message, et il y a un @EventHandler juste avant le
Code:
    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
      
        Player player = event.getPlayer();
        Block block = event.getBlock();
      
        System.out.println(player.getInventory().getItemInMainHand());
      
        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)) {
            event.setCancelled(true);
            player.sendMessage(main.getGamePrefix() +
                    ChatColor.RED + "Erreur : tu ne peux pas poser ce block : "+ChatColor.LIGHT_PURPLE+block);
        }
    }
(Y'a que 1 seul @EventHandler mais comme ça tu le vois ;) )

Donc je ne sais pas non plus pourquoi ca fonctionne pas xDD D'autres idées ? :p

AlexFatta

EDIT : Et oui j'ai test le Sysout comme tu peux le voir je l'ai pas enlevé xDD
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
D'accord, donc c'est bien que ton event est mal register ou qu'il est cancel :)

Si tu as bien vérifier qu'il est correctement register, c'est qu'il se fait annuler ! Il faut donc que tu ajoute ceci :
Code:
@EventHandler (ignoreCanceled = true, priority = EventPriority.LOWEST)
comme ça ton event va s'exécuter en dernier et sans être annulée :)
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Re !

xDD Ca fonctionne pas xDD

Code:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        Player player = event.getPlayer();
        Block block = event.getBlock();
        
        System.out.println(player.getInventory().getItemInMainHand());
        
        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)) {
            event.setCancelled(true);
            player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
                    ChatColor.RED + "Erreur : tu ne peux pas poser ce block : "+ChatColor.LIGHT_PURPLE+block);
        }
    }

Par contre pour le coup je comprends pas pourquoi ca fonctionne pas. J'ai essayé avec High, highest et lowest. :(

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Par contre pour le coup je comprends pas pourquoi ca fonctionne pas. J'ai essayé avec High, highest et lowest. :(
Il faut mettre Lowest car les priorités sont inversés :) Si tu met Lowest, elle s'exécutera en dernier ;)

Réessaye de mettre un Sysout voir si l'événement se déclanche, si ce n'est pas le cas, c'est qu'il est mal implémenté, donc là il faudra voir + de code ;)
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Re !

C'est à dire ? Tu veux voir + de code ? Si j'avais su j'en aurai donner + dès le début x)

Bon voici (j'ai modifié la fonction mais ca ne fait aucun changement en jeu ni en console) :

Code:
package fr.alexfatta.fallenkingdoms;

import java.io.File;
import java.io.IOException;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

import fr.alexfatta.fallenkingdoms.commands.FkBase;
import fr.alexfatta.fallenkingdoms.commands.FkHelp;
import fr.alexfatta.fallenkingdoms.commands.FkPause;
import fr.alexfatta.fallenkingdoms.commands.FkPlay;
import fr.alexfatta.fallenkingdoms.commands.FkStart;
import fr.alexfatta.fallenkingdoms.commands.FkStop;
import fr.alexfatta.fallenkingdoms.getDataBases.LocationManager;
import fr.alexfatta.fallenkingdoms.managers.BlockPlaceManager;



public class main extends JavaPlugin implements Listener{
   
    private int rayon;
    private int base_count; //nombre de bases créées
   
    private static String gamePrefix = ChatColor.GRAY + "[" + ChatColor.RED + "FallenKingdoms" + ChatColor.GRAY + "] ";
    private static String argument = ChatColor.RED + "Erreur : ce n'est pas le bon argument !";  

   
     @Override
    public void onEnable() {
         saveDefaultConfig();
         PluginFile();
         setRayon(getConfig().getInt("Rayon"));
         setBase_count(getConfig().getInt("base_count"));
         for (String s : getConfig().getStringList("Bases")){
             new LocationManager(s).add(getConfig().getString("Bases."+s+".world"), getConfig().getInt("Bases."+s+".x1"), getConfig().getInt("Bases."+s+".x2"),
                     getConfig().getInt("Bases."+s+".z1"), getConfig().getInt("Bases."+s+".z2"));
         }
         getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         getServer().getPluginManager().registerEvents(new BlockPlaceManager(), this);
         getServer().getPluginManager().registerEvents(this, this);
         getCommand("fkstart").setExecutor(new FkStart());
         getCommand("fkstop").setExecutor(new FkStop());
         getCommand("fkpause").setExecutor(new FkPause());
         getCommand("fkplay").setExecutor(new FkPlay());
         getCommand("fkhelp").setExecutor(new FkHelp());
         getCommand("fkbase").setExecutor(new FkBase(this));
         INSTANCE = this;
         getLogger().info("Plugin de FallenKingdoms actif !");
       
    }
   
     @Override
    public void onDisable() {
         getLogger().info("Plugin de FallenKingdoms inactif !");
    }

   
   
    private static int timer = 1;
    private static int jour = 0;
    private static int timeMinute = 0;
    private static int timeSecond = 0;
    private static main INSTANCE;
    private static World world1;
   
     public static void runnable(Player player){
         Bukkit.getScheduler().scheduleSyncRepeatingTask(INSTANCE, new Runnable() {
           
            @Override
            public void run() {
                for(Player pls : Bukkit.getOnlinePlayers()){
                    playerJoinListener.loadSB(pls);
                }
                if(FkStart.isStatuts()){ //compteur du temps et des jours
                    setTimeSecond(getTimeSecond() + 1);
                    playerJoinListener.loadSB(player);
                    if(getTimeSecond()==60){
                        setTimeMinute(getTimeMinute() + 1);
                        setTimeSecond(0);
                        playerJoinListener.loadSB(player);
                        if(getTimeMinute() == 20){
                            setJour(getJour() + 1);
                            setTimeMinute(0);
                            setTimeSecond(0);
                            world1 = player.getWorld();
                            world1.setTime(0);
                            Bukkit.broadcastMessage(main.getGamePrefix() + ChatColor.AQUA + "Jour " + getJour() + ChatColor.AQUA + " !");
                            playerJoinListener.loadSB(player);
                        }
                        }
                    if(getTimeMinute() == 19){
                        if(getTimeSecond() == 30){
                            Bukkit.broadcastMessage(ChatColor.GRAY + "Le soleil est sur le point de se lever...");
                            playerJoinListener.loadSB(player);
                    }
                    return;
                    }
                }else {
                    playerJoinListener.loadSB(player);
                }
               
                timer--; // Timer et refresh auto du ScoreBoard
                if(timer==0){
                    timer = 1;
                    playerJoinListener.loadSB(player);
                }
               
            }
        }, 20, 20);
     }
   
     public void PluginFile() {
         File file = new File("plugins/FallenKingdoms/bases.yml");
         if (!file.exists()) {
             try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         }
     }

Ca me fait ch*** de dévoiler autant de code mais c'est pour une bonne cause xDDD

Code:
package fr.alexfatta.fallenkingdoms.managers;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;

import fr.alexfatta.fallenkingdoms.main;


public class BlockPlaceManager implements Listener {
   
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(PlayerInteractEvent event) {
       
        final Action action = event.getAction();
        final Player player = event.getPlayer();
        final Block block = event.getClickedBlock();
        final Material material = player.getInventory().getItemInMainHand().getType();
       
        System.out.println(player.getInventory().getItemInMainHand());
       
        if (action == Action.RIGHT_CLICK_BLOCK) {
            if (block.getType() != Material.AIR) {
                if (event.getHand() == EquipmentSlot.HAND) {
                    if (material != Material.TORCH || material != Material.LEVER || material != Material.WOOD_BUTTON || material != Material.STONE_BUTTON) {
                        event.setCancelled(true);
                        player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
                                ChatColor.RED + "Erreur : tu ne peux pas poser ce block : "+ChatColor.LIGHT_PURPLE+block);
                    }
                }
            }
        }
    }
   
    public main main;
   
    public boolean playerInArea(Player player) {
        int x1, x2, z1, z2;
        String world;
       
        for (String s : main.getConfig().getStringList("Bases")) {
            x1 = main.getConfig().getInt("Bases."+s+".x1");
            x2 = main.getConfig().getInt("Bases."+s+".x2");
            z1 = main.getConfig().getInt("Bases."+s+".z1");
            z2 = main.getConfig().getInt("Bases."+s+".z2");
            world = main.getConfig().getString("Bases."+s+".world");
           
            if (!(player.getLocation().getX() > x1) && !(player.getLocation().getX() < x2) &&
                    !(player.getLocation().getZ() > z1) && !(player.getLocation().getZ() < z2) && !(player.getWorld().getName() == world)) {
                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
                        ChatColor.RED + "Erreur : tu ne peux pas poser ce block !");
                return false;
            }
        }
        return true;
    }
   
}

Et voici une class Listener qui est chargée de modifier le joinMessage du serveur et cette class fonctionne. J'ai mis le code de BlockPlaceManager dedans, les joinMessage sont toujours modifiés mais le code de la fonction de BlockPlaceManager ne s'execute toujours pas. Donc ca vient vraiment de la fonction en fait xDD M'enfin je te laisse tester aussi si tu le veux ^^


Code:
public class playerJoinListener implements Listener{
   
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        Player p = event.getPlayer();
        event.setJoinMessage(main.getGamePrefix() + ChatColor.YELLOW + p.getName() + ChatColor.GRAY + " à rejoint la partie !");
        loadSB(p); //Charger le scoreboard, que je n'ai pas inclus ici.
    }
   
    @EventHandler
    public void onPlayerLeave(PlayerQuitEvent pqe){
        Player player = pqe.getPlayer();
        pqe.setQuitMessage(main.getGamePrefix() + ChatColor.YELLOW + player.getName() + ChatColor.GRAY + " à quitté la partie !");
        for(Player plo : Bukkit.getOnlinePlayers()){
             loadSB(plo);
        }
    }

Bon voilà tu as la moitié ou presque de mon plugin XDDD J'espère que ca suffira :( Mais vraiment je capte pas d'où peut venir le souci. On a quasi tout essayé xD

Si tu as d'autre idées :p

AlexFatta
 

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
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 :)