Plugin Plugin pour un seul monde

EternityGame

Aventurier
8 Janvier 2017
18
1
4
22
Bonjour, je suis actuellement en train de créer un plugin hub, mais quand je met: pour ne pas ramasser de blocks ou bouger dans son inventaire ça affectes les mini jeux qui sont sur d'autres mondes, (pour les mondes j'utilise Multiverse World),

aussi j'ai mis quand on rejoint le serveur une slimeball avec une laine pour se téléporter dans les jeux mais j'aimerais que quand je clique sur la laine ça m'ouvre un deuxième inventaire, et aussi que dans l'inventaire ou j'aurais mis les items, chaque items puissent utiliser une commande d'un autre plugin (bedwars)

Ps: Je suis débutant en codage et j'ai déjà cherché cela mais j'ai pas trouvé voila pourquoi je poste sur ce forum ^^

Merci a ceux qui pourront m'aider.
 
Bonjour !

Quel langage de code utilises-tu ? Et peux tu préciser quels sont les problèmes ou bien quels sont tes demandes / attentes envers nous ?

Merci bien :)

AlexFatta
 
Salut,

Je vais partir du principe que tu fais ça correctement et que tu développes donc en Java. Si ce n'est pas le cas je pense qu'on peut plus parler de configuration (je vais me faire taper par ceux qui font du skript m'enfin bon... tant pis :P ).

mais quand je met: pour ne pas ramasser de blocks ou bouger dans son inventaire ça affectes les mini jeux qui sont sur d'autres mondes, (pour les mondes j'utilise Multiverse World),
Je suppose donc que tu utilises les events. Tu devrais donc avoir qqch comme ceci:
Code:
@EventHandler
public void onInvInteract(InventoryInteractEvent event) {
// code
}
Ca normalement y a pas de soucis :) Si tu n'a pas du tout qqch qui ressemble à ça, je vois pas comment tu aurais pu faire, donc poste ton code :)

Bref...
La solution est juste de mettre une condition:
Code:
@EventHandler
public void onInvInteract(InventoryInteractEvent event) {
if(event.getPlayer().getWorld().getName().equals("NomDuMonde")) {
// code
}
Bien évidemment il faut changer "NomDuMonde" et ne pas oublier que cette valeur pourrait avoir été récupéré dans une variable global ou un fichier de configuration pour rendre les modifications plus simple :)

mais j'aimerais que quand je clique sur la laine ça m'ouvre un deuxième inventaire, et aussi que dans l'inventaire ou j'aurais mis les items, chaque items puissent utiliser une commande d'un autre plugin (bedwars)
Pour ré-ouvrir un inventaire y a rien de compliquer suffit de réutiliser le "openInventory".
Pour les autres commandes il suffit de faire un:
Code:
player.performCommand("ta commande");


Cordialement,
Detobel36
 
Merci beaucoup pour ta réponse complète cela va beaucoup m'aider !

Bonjour,

j'ai essayer pour ouvrir le deuxième inventaire sauf que ça ne marche pas je t'ai mis mon code en dessous ^^
Le premier inventaire s'ouvre bien avec la laine mais le deuxième ne s'ouvre pas :/


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")) {
           
           
            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){
                    Inventory inv = Bukkit.createInventory(null, 9*3, "Menu Principal");
                   
                    ItemStack Wool = new ItemStack(Material.WOOL, 1);
                    ItemMeta WoolM = Wool.getItemMeta();
                    WoolM.setDisplayName("§a§lCube");
                    Wool.setItemMeta(WoolM);
                    inv.setItem(11, Wool);
                   
                    p.openInventory(inv);
                   
                    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);
                           
                        }
                }
            }
   
    }
   
        }
           
    }
}
 
Dernière édition par un modérateur:
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 :p
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 :p ).

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 :p
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
 
En fait il faut que je recopie le getAction de la slimeball ? parce que j'ai créer une class InventoryInteractEvent ou j'ai mis ça :

Mais a chaque e. il me dit: "The method getAction() is undefined for the type InventoryInteractEvent"

Désoler de mon incompétence mais c'est mon premier plugin xD

Code:
package fr.inventorykingslime;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryInteractEvent;

public class InventoryEvent implements Listener {

    public InventoryEvent(Main main) {}
    @EventHandler
    public void onClickInventory(InventoryInteractEvent e){
       
        if((e.getItem().getType() == Material.WOOL) &&
                (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK
                 || (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK))){
       
        if(p.getWorld().getName().equals("Lobby")) {