XP par stone cassée

TheGabDooSan

Aventurier
5 Juin 2019
17
1
4
Bonjour, j'ai récemment essayé de développer un plugin permettant de donner un peu d'xp a un joueur quand il casse un bloc de stone (je suis débutant) mais quand je test IG cela ne fonctionne pas. Merci pour votre aide,

Cordialement Gabriel.

Code :

Code:
package com.atnos.autoxp;

import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
 
    @Override
    public void onEnable() {
        System.out.println(Color.GRAY + "[Atnos] Plugin" + Color.RED + " MineXP " + Color.GRAY + "actif.");
    }
 
    @Override
    public void onDisable() {
        System.out.println(Color.GRAY + "[Atnos] Plugin" + Color.RED + " MineXP " + Color.GRAY + "inactif.");
    }
 
    @EventHandler
    public void blockBreak(BlockBreakEvent e) {
        Player p = e.getPlayer();
     
        if(e.getBlock().getType() == Material.STONE) {
         
            Bukkit.dispatchCommand(p, "/xp 5");  //C'est une commande Essentials
         
        }
    }
}
 
Dernière édition:

Toinetoine1

Architecte en herbe
7 Avril 2017
77
1
48
21
Alors, premièrement tu n’as pas enregistré ton événement et ta classe doit implémenter Listener.

Le deuxième soucis étant qu’il ne faut pas mettre de / lors du dispatchCommand.
De plus si le joueur veut recevoir l’xp, il doit avoir la perm pour se give de l’xp :p Ce qui n’a pas de sens
 

TheGabDooSan

Aventurier
5 Juin 2019
17
1
4
Alors, premièrement tu n’as pas enregistré ton événement et ta classe doit implémenter Listener.

Le deuxième soucis étant qu’il ne faut pas mettre de / lors du dispatchCommand.
De plus si le joueur veut recevoir l’xp, il doit avoir la perm pour se give de l’xp :p Ce qui n’a pas de sens

Merci pour ta réponse ! J'ai refait le code dans une autre classe, peut-tu me dire si il y a des erreurs ?
(Pour la commande, on va imaginer que le joueur a la permission.)

Code:
package com.atnos.autoxp;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;

public class PluginListeners implements Listener {

    
    @EventHandler
    public void blockBreak(BlockBreakEvent e) {
        Player p = e.getPlayer();
        
        if(e.getBlock().getType() == Material.STONE) {
            
            Bukkit.dispatchCommand(p, "xp 5");
            
        }
    }
    
}
 

TheGabDooSan

Aventurier
5 Juin 2019
17
1
4
J'ai testé et ça marche merci ! Si tu as encore le temps (dsl) est ce que on peut enlever le msg dans le chat du don d'xp ? (parce que toutes les 5 secondes ya écrit : "TheGabDooSan a gagné 1 xp")
Si c'est pas possible tempis c'est pas grave
 

Toinetoine1

Architecte en herbe
7 Avril 2017
77
1
48
21
Nop tu ne peux pas, en tout cas pas depuis le plugin que tu viens de créer.
Cependant, tu peux le faire par toi-même en utilisant ceci:
Code:
Player#giveExp(int xp)
 
  • J'aime
Reactions: TheGabDooSan

Syrows

Développeur
7 Juillet 2016
137
20
130
23
J'ai testé et ça marche merci ! Si tu as encore le temps (dsl) est ce que on peut enlever le msg dans le chat du don d'xp ? (parce que toutes les 5 secondes ya écrit : "TheGabDooSan a gagné 1 xp")
Si c'est pas possible tempis c'est pas grave
Tu peux parfaitement retirer le message dans le chat mais en passant par une autre méthode. A la place d'exécuter une commande, tu pourrais faire en sorte de drop l'expérience au sol et laisser au joueur le soin de la récupérer (c'est le cas pour les minerais par exemple).

Voici le code correspondant, à placer dans ton BlockBreakEvent:

Code:
Block block = event.getBlock();

if(event.getBlock().getType() == Material.STONE) {

     Location loc = block.getLocation();
     World world = loc.getWorld();

     ExperienceOrb orb = world.spawn(loc, ExperienceOrb.class);

     orb.setExperience(/*l'expérience à ajouter*/);
}
Attention aux noms de variables que j'ai utilisés qui sont différents des tiens.
 
Dernière édition:

Toinetoine1

Architecte en herbe
7 Avril 2017
77
1
48
21
Tu peux parfaitement retirer le message dans le chat mais en passant par une autre méthode. A la place d'exécuter une commande, tu pourrais faire en sorte de drop l'expérience au sol et laisser au joueur le soin de la récupérer (c'est le cas pour les minerais par exemple).

Voici le code correspondant, à placer dans ton BlockBreakEvent:

Code:
Player player = event.getPlayer();

if(event.getBlock().getType() == Material.STONE) {

     Location loc = player.getLocation();
     World world = player.getWorld();

     ExperienceOrb orb = world.spawn(loc, ExperienceOrb.class);

     orb.setExperience(/*l'expérience à ajouter*/);
}
Attention aux noms de variables que j'ai utilisés qui sont différents des tiens.
La variable location ne doit pas être celle du joueur mais celle du Block ;)