Salut,
Bon, outre le fait que le code n'est pas correctement aligné (on va dire que j'ai rien vu)...
Tu oublies que c'est séquentiel...
Bon, ça risque d'être un peu long. J'espère ne pas te perde dans le résonnement
Code:
public class ActionInventory implements Listener {
public ActionInventory(Main main) {}
@EventHandler
public void onClickInventory(PlayerInteractEvent e){
Player p = e.getPlayer();
if(p.getWorld().getName().equals("Lobby")) {
Ca je vais pas revenir dessus. C'est très bien, ça fait le job (bon, un constructeur vide ça sert à rien... m'enfin c'est pas une faute
).
Tu es bien d'accord que l'event "
PlayerInteractEvent" ne se déclenche
QUE lorsque l'on interagit avec un item/bloc.
Lorsque l'on fait un clic dans notre inventaire, ce n'est pas cet event qui est appelé mais bien "
InventoryInteractEvent". Je pense que tu commence à voir le premier problème
Ensuite vient ceci:
Code:
if(e.getItem().getType() == Material.SLIME_BALL){
if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK){
Ce sont deux conditions avec pas de "else" ou "else if" au bout donc on peut les fusionner
On aurait pu le fusionner avec la condition au dessus pour avoir tout ensemble. Mais bon, c'est pas grave, laissons comme ça, ça change pas grand choses
J'en profite pour refaire un peu l'alignement histoire que ça soit plus lisible:
Code:
if((e.getItem().getType() == Material.SLIME_BALL) &&
(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK
|| e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) {
Bien, tu es d'accord que le code si dessus regarde si l'on vient de cliquer avec une slime ball en main tout en vérifier qu'il s'agit bien d'un clic droit ou gauche (sur un block ou de l'aire).
Ensuite tu créé ton inventaire. La non plus, rien à dire,
je passe le code.
Ensuite tu fais ça:
Code:
if(e.getItem().getType() == Material.WOOL){
if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK){
Inventory inv2 = Bukkit.createInventory(null, 9*3, "Menu Cube");
p.openInventory(inv2);
}
Mais ce code s'exécute
directement après que tu ai demandé l’ouverture de l'inventaire. Cela signifie que l'on ouvre l'inventaire et
directement après (il n'y a pas de temps d'attente, on attend pas que le joueur clic de nouveau sur un item ou ferme l'inventaire... le code continue à s'exécuter) on vérifie si l'item avec lequel on a interagit (le
même item qu'au
début de l'event !) est une laine.
Evidemment que non. Puis-ce qu'on a testé au début que c'était un slime !
Tout ce code doit donc être déplacé dans l'event "InventoryInteractEvent". Dans cet event tu devra:
- Vérifier que le joueur fait bien un clic sur une laine
- Vérifie que l'inventaire sur lequel se passe l'event (via la methode getInventory ) à bien le même nom que l'inventaire que tu as créé dans le PlayerInteract
- Ouvrir le second inventaire
Note: si ton inventaire est toujours le même. C'est à dire que peut importe la personne qui l'ouvre et le moment où il l'ouvre, si l'inventaire est le même, il
vaut mieux le construire
avant (dans le constructeur par exemple (et l'enregistré dans un attribut)) et ne faire que l'ouvrir lorsqu'un joueur fait l’interaction. Plutôt que de le construire à chaque fois
Cordialement,
Detobel36