Plugin InventoryClickEvent non fonctionnel

Kenda

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

Voilà, depuis quelques jours, je commence à dev de petit plugins, et depuis 3 jours, j'essaye de crée un menu avec différentes "configs"

Hors, quand j'ouvre le menu avec le code :

JavaScript:
player.openInventory(inv);

Avec la config des items au bon slot etc... Tout marche bien :)
Hors, quand je clique, sur un item, aucun event ne se passe, et je bloque....

Voici le code :

Code

Voilà, si des gens aurais l'aimabilité de pouvoir m'aider, ce n'est point de refus :)


Cordialement
Kenda.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 134
162
462
247
21
Mìlhüsa
Bonsoir,

La méthode InventoryEvent#getInventory() renvoie l'inventaire supérieur, utilise InventoryClickEvent#getClickedInventory() et vérifie que ce n'est pas l'inventaire du joueur.
Tu peux aussi utiliser InventoryEvent#getView() puis InventoryView#getTopInventory(), mais tu perds l'information de si le joueur a réellement cliqué dans un inventaire (#getClickedInventory() renvoie null si le joueur a cliqué en dehors).

Bon après la meilleure façon de savoir pourquoi rien ne se passe c'est de vérifier que les conditions sont bien validées :
Java:
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
    HumanEntity player = e.getWhoClicked();
    ItemStack item = e.getCurrentItem();
    Inventory inventory = e.getClickedInventory();
    
    System.out.println("inside #onInventoryClick");
    
    if(inventory == null || inventory.getType() == InventoryType.PLAYER || item == null || !(player instanceof Player))
        return;
    
    System.out.println("first check passed");
    
    if(!inventory.getName().equals("§l§6[§fModSanctions§6]")
        return;
    
    System.out.println("second check passed");
    
    player.closeInventory();
    e.setCancelled(true);
    
    switch(item.getType()) {
        case ANVIL:
            player.setGameMode(GameMode.SPECTATOR);
            break;
        
        case PAPER:
            player.getInventory().addItem(new ItemStack(Material.TNT, 2));
            break;
    }
}

J'ai simplifié le nom de ton inventaire car une fois qu'il est en gras, seul un §r peut l'enlever, changer la couleur maintient le gras.

Après vérifie tout de même que ta classe est bien enregistrée.

Cordialement,
ShE3py.
 

Kenda

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

La méthode InventoryEvent#getInventory() renvoie l'inventaire supérieur, utilise InventoryClickEvent#getClickedInventory() et vérifie que ce n'est pas l'inventaire du joueur.
Tu peux aussi utiliser InventoryEvent#getView() puis InventoryView#getTopInventory(), mais tu perds l'information de si le joueur a réellement cliqué dans un inventaire (#getClickedInventory() renvoie null si le joueur a cliqué en dehors).

Bon après la meilleure façon de savoir pourquoi rien ne se passe c'est de vérifier que les conditions sont bien validées :
Java:
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
    HumanEntity player = e.getWhoClicked();
    ItemStack item = e.getCurrentItem();
    Inventory inventory = e.getClickedInventory();
  
    System.out.println("inside #onInventoryClick");
  
    if(inventory == null || inventory.getType() == InventoryType.PLAYER || item == null || !(player instanceof Player))
        return;
  
    System.out.println("first check passed");
  
    if(!inventory.getName().equals("§l§6[§fModSanctions§6]")
        return;
  
    System.out.println("second check passed");
  
    player.closeInventory();
    e.setCancelled(true);
  
    switch(item.getType()) {
        case ANVIL:
            player.setGameMode(GameMode.SPECTATOR);
            break;
      
        case PAPER:
            player.getInventory().addItem(new ItemStack(Material.TNT, 2));
            break;
    }
}

J'ai simplifié le nom de ton inventaire car une fois qu'il est en gras, seul un §r peut l'enlever, changer la couleur maintient le gras.

Après vérifie tout de même que ta classe est bien enregistrée.

Cordialement,
ShE3py.


Malgré ce code, rien ne change. Les items de l'inventaire reste toujours accessible :(
En sachant, que l'inventaire crée plus haut, est bien pris en compte (avec les commandes pour l'ouvrir), donc la class est, en logique, détecté.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 134
162
462
247
21
Mìlhüsa
Le principe est justement de regarder si les messages sont affichés dans la console pour vérifier que les instructions sont bien appelées.
Et puis tu ne dis pas comment tu enregistres ta commande, alors la classe n'est pas forcément enregistrée.
 

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
Le principe est justement de regarder si les messages sont affichés dans la console pour vérifier que les instructions sont bien appelées.
Et puis tu ne dis pas comment tu enregistres ta commande, alors la classe n'est pas forcément enregistrée.

En effet, j'ai bien regardé, mais aucun message n'est écris dans la console. Après des vérifications et des bidouillages, rien ne change.
Dans ma class principal ""Main" la classest déclaré comme cela

JavaScript:
public class Main extends JavaPlugin
{

    @Override
    public void onEnable()
    {
        System.out.println("[ModSanction] Le plugin viens de s'activer");
        getCommand("modsanction").setExecutor(new Commands());
    }

    @Override
    public void onDisable()
    {
        System.out.println("[ModSanction] Le plugin viens de se désactiver");
    }

}


Sachant que je débute, je regarde des tutos de Gravenilvec.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 134
162
462
247
21
Mìlhüsa
Pour que tes méthodes qui reçoivent les évènements soient appelées, il faut que tu les enregistres.
Java:
public class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(new MyEventHandler(), this);
    }
    
    public class MyEventHandler implements Listener {
        @EventHandler
        public void onFoo(FooEvent e) { ... }
    }
}

La méthode PluginManager#registerEvents(Listener, Plugin) va enregistrer toutes les fonctions valides comme points d'entrée d'un évènement.
Les fonctions doivent être annotées par @EventHandler, doivent être publiques et non-statiques, et ne doivent avoir qu'un seul argument. La fonction peut avoir n'importe quel nom.
 

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
Pour que tes méthodes qui reçoivent les évènements soient appelées, il faut que tu les enregistres.
Java:
public class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(new MyEventHandler(), this);
    }
   
    public class MyEventHandler implements Listener {
        @EventHandler
        public void onFoo(FooEvent e) { ... }
    }
}

La méthode PluginManager#registerEvents(Listener, Plugin) va enregistrer toutes les fonctions valides comme points d'entrée d'un évènement.
Les fonctions doivent être annotées par @EventHandler, doivent être publiques et non-statiques, et ne doivent avoir qu'un seul argument. La fonction peut avoir n'importe quel nom.

Après pas mal de bidouille,vous m'avez enfin aidé. je vous remercie infiniment, sa fait 3 jours que jegalère dessus :)

MERCI MERCI MERCI !