[Java] Détection d'item lors d'un cassage de blocs

  • Auteur de la discussion Auteur de la discussion Kenda
  • Date de début Date de début

Kenda

Architecte en herbe
16 Juillet 2016
316
1
2
125
32
www.youtube.com
Bonjour/Bonsoir,

(Oula mon crane chauffe déjà),

Je cherche un moyen de faire une détection d'un cassage de blocs avec un item spécifique, mais je n'arrive pas vraiment à trouver comment.

Voici mon code :

@EventHandler
public void onBlockBreak(BlockBreakEvent e) {

//Récupération du joueur
Player player = e.getPlayer();

//récupération de l'item dans la main
ItemStack item = e.getPlayer().getItemInHand();


//Verification si le joueur est en mode modération
if(PlayerManager.isInModerationMod(player)) {

//L'erreur est ici, j'aimerai faire la détection si c'est une pioche en diamond avec un nom (mais normalement pas la peine vu qu'il est en mode modération)
if (item.getType() == Material.DIAMOND_PICKAXE && item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {

//Sa casse le blocs
e.setCancelled(false);

//Et si dans la config le boolean est en "true" alors on envoie un message
if (config.getBoolean("message.moderation.warn.warn-actived")) {
player.sendMessage(prefix + config.getString("message.moderation.warn.warn-message").replace("&", "§"));
}
}
}
//Sinon si rien de tout sa, on casse pas le blocs si il est en mode modération je rapelle)
e.setCancelled(true);
}

Je commence à avoir un mal de crane ducoup j'aimerai savoir si quelqu'un peu m'aider (ce soir si possible), et que je m'arrète là
 
Bonsoir,

Es-tu sûr que PlayerManager#isInModerationMode(Player) renvoit true, et d'avoir enregistrer ta classe ?
Et sinon, il suffirait de mettre quelques print ou de passer par le débogueur pour savoir quelle condition coince.

Java:
@EventHandler(ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
   e.setCancelled(true);
   // must protecc
   
   Player player = e.getPlayer();
   if(!PlayerManager.isInModerationMode(player))
      // vu qu'on a déjà annulé l'évènement,
      // l'on peut juste sortir de la fonction
      return;
      // pas besoin d'imbriquer 40 `if`
   
   ItemStack item = player.getInventory().getItemInMainHand();
   if(item.getType() != Material.DIAMOND_PICKAXE || !item.hasItemMeta() || item.getItemMeta().hasDisplayName())
      return;
   
   
   if(config.getBoolean("message.moderation.warn.warn-actived", true))
      player.sendMessage(prefix + config.getString("message.moderation.warn.warn-message").replace("&", "§"));
   
   e.setCancelled(false);
}

Cordialement,
ShE3py.
 
Bonsoir,

Es-tu sûr que PlayerManager#isInModerationMode(Player) renvoit true, et d'avoir enregistrer ta classe ?
Et sinon, il suffirait de mettre quelques print ou de passer par le débogueur pour savoir quelle condition coince.

Java:
@EventHandler(ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
   e.setCancelled(true);
   // must protecc
  
   Player player = e.getPlayer();
   if(!PlayerManager.isInModerationMode(player))
      // vu qu'on a déjà annulé l'évènement,
      // l'on peut juste sortir de la fonction
      return;
      // pas besoin d'imbriquer 40 `if`
  
   ItemStack item = player.getInventory().getItemInMainHand();
   if(item.getType() != Material.DIAMOND_PICKAXE || !item.hasItemMeta() || item.getItemMeta().hasDisplayName())
      return;
  
  
   if(config.getBoolean("message.moderation.warn.warn-actived", true))
      player.sendMessage(prefix + config.getString("message.moderation.warn.warn-message").replace("&", "§"));
  
   e.setCancelled(false);
}

Cordialement,
ShE3py.


Oui oui, je suis bien sur que le isInModerationMode(Player) renvoie bien true étant donner que j'ai des gives d'inventaire etc...
J'ai essayer de mettre des commentaires pour affiché si tel ou tel action marche:

@EventHandler(ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
e.setCancelled(true);
// must protecc

Player player = e.getPlayer();
player.sendMessage("Test1");

if(!PlayerManager.isInModerationMod(player)) {
// vu qu'on a déjà annulé l'évènement,
// l'on peut juste sortir de la fonction
player.sendMessage("test2");
return;
}
// pas besoin d'imbriquer 40 if

ItemStack item = player.getInventory().getItemInHand();
if(item.getType() != Material.DIAMOND_PICKAXE || !item.hasItemMeta() || item.getItemMeta().hasDisplayName()) {
player.sendMessage("Test3");
return;
}

if(config.getBoolean("message.moderation.warn.warn-actived", true))
player.sendMessage(prefix + config.getString("message.moderation.warn.warn-message").replace("&", "§"));

e.setCancelled(false);
player.sendMessage("test4");
}

J'ai le message test1 et test2 qui s'affiche lorsque je suis en mode normal, mais aucun message en mode modération.
 
Même pas de « Test1 » ?
As-tu d'autres plugins qui pourraient interférer, tels que WorldGuard ?

J'ai le test1 et le test2 qui s'affiche mais que quand je suis hors modérateur.
J'ai aucun autre plugin hormis un autre que j'ai crée avec 3 commandes (clear, gamemode et time).
 
Essaye en changeant l'annotation de la fonction avec @EventHandler(priority = EventPriority.LOWEST).
Comment enregistres-tu la classe ? Car là la méthode n'est même pas appelée.
 
Regarde la console serveur pour voir si il y a une erreur.
Je n'ai pas beaucoup confiance dans les players.sendmessage , je ferai des System.out.println à ta place.

Attention si ton event a été cancel par une autre fonction, ta fonction n'es pas appelée à cause du ignoreCancelled.