Plugin Problème avec les constructeurs

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Coucou, me revoilà ! J'ai décidé de faire un plugin de sanction et pour ce faire j'avais besoin de créer un Constructeur que j'ai appelé Constructeur avec comme paramètre un UUID ... Suite à ça, dans 2 commandes différentes j'instancie mon constructeur PUIS dans une autre classe j'effectue différente chose avec mon constructeur... Où se situe le problème hein ? Et bien moi-même je ne sais pas... ce code me retourne une NPE à la ligne où je veux System.out.println l'UUID du joueur ! et je ne sais pas pourquoi ça marche pour le Demute mais pas pour le Deban... Enfaites j'ai compris qu'un truc n'allais pas mais je ne sais pas vraiment où :'( Merci d'avoir pris le temps de me lire et de m'aider !
Java:
        if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Pardon")) {

            e.getWhoClicked().closeInventory();

            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Demute")) {
                if (Mute.contains(Constructeur.getPlayer())) {
                    Mute.remove(Constructeur.getPlayer());
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été pardonné et tu n'es désormais plus mute.");
                } else {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Tu ne peux pas demute un joueur qui n'est pas mute !");
                }
            }
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Deban")) {

                Player p = Bukkit.getPlayer(Constructeur.getPlayer());

                System.out.println(p.getUniqueId());

                if (Bukkit.getBanList(BanList.Type.NAME).isBanned(p.getName())){

                    Ban.remove(Constructeur.getPlayer());
                    Bukkit.getBanList(BanList.Type.NAME).pardon(p.getName());

                } else {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur n'est pas banni...");

                }
            }


        }
 

ShE3py

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

J'ai du mal à savoir comment Constructeur.getPlayer() est-il censé savoir de quel joueur parles-tu ?
Et merci d'envoyer la fonction entière — avec le @EventHandler, les paramètres et son type de retour.

Cordialement,
ShE3py
 

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Voici mon EventHandler en entier, et oui Constructeur.getPlayer() est censé savoir quel joueur je vise


Java:
@EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Punition")) {
            e.getWhoClicked().closeInventory();
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Propos Racistes")) {

                Player p = Bukkit.getPlayer(Constructeur.getPlayer());

                p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Propos Racistes");
                Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
                Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Propos Racistes", convertIntToDate(9999), "Propos Racistes");
                Ban.add(p.getUniqueId());

            }
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Propos discriminatoires")) {
                Player p = Bukkit.getPlayer(Constructeur.getPlayer());

                p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Propos Discriminatoires");
                Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
                Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Propos Discriminatoires", convertIntToDate(9999), "Propos Discriminatoires");
                Ban.add(p.getUniqueId());

            }
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Duplication")) {
                Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Duplication");
                Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
                Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Duplication", convertIntToDate(9999), "Duplication");
                Ban.add(p.getUniqueId());

            }
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Cheat")) {
                Player p = Bukkit.getPlayer(Constructeur.getPlayer());

                p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Cheat");
                Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
                Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Cheat", convertIntToDate(9999), "Cheat");
                Ban.add(p.getUniqueId());

            }
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Hack/DDOS")) {
                Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Hack/DDOS");
                Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
                Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Hack/DDOS", convertIntToDate(9999), "Hack/DDOS");
                Ban.add(p.getUniqueId());

            }

            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Insultes")) {

                if (Mute.contains(Constructeur.getPlayer())) {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
                } else {
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
                    p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
                    Mute.add(Constructeur.getPlayer());
                    Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                        @Override
                        public void run() {
                            Mute.remove(Constructeur.getPlayer());
                        }
                    }, 20 * 3600);
                }


            }

            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Spam")) {

                if (Mute.contains(Constructeur.getPlayer())) {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
                } else {
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été mute pour 30 minutes !");
                    p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
                    Mute.add(Constructeur.getPlayer());
                    Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                        @Override
                        public void run() {
                            Mute.remove(Constructeur.getPlayer());
                        }
                    }, 20 * 1800);
                }


            }

            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Majuscules")) {

                if (Mute.contains(Constructeur.getPlayer())) {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
                } else {
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été mute pour 20 minutes !");
                    p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
                    Mute.add(Constructeur.getPlayer());
                    Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                        @Override
                        public void run() {
                            Mute.remove(Constructeur.getPlayer());
                        }
                    }, 20 * 1200);
                }


            }

            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Pub")) {

                if (Mute.contains(Constructeur.getPlayer())) {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
                } else {
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
                    p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
                    Mute.add(Constructeur.getPlayer());
                    Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                        @Override
                        public void run() {
                            Mute.remove(Constructeur.getPlayer());
                        }
                    }, 20 * 3600);
                }


            }
            if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Menaces")) {

                if (Mute.contains(Constructeur.getPlayer())) {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
                } else {
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
                    p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
                    Mute.add(Constructeur.getPlayer());
                    Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                        @Override
                        public void run() {
                            Mute.remove(Constructeur.getPlayer());
                        }
                    }, 20 * 3600);
                }


            }


        }


        if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Pardon")) {

            e.getWhoClicked().closeInventory();

            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Demute")) {
                if (Mute.contains(Constructeur.getPlayer())) {
                    Mute.remove(Constructeur.getPlayer());
                    Player p = Bukkit.getPlayer(Constructeur.getPlayer());
                    p.sendMessage(ChatColor.RED + "Tu as été pardonné et tu n'es désormais plus mute.");
                } else {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Tu ne peux pas demute un joueur qui n'est pas mute !");
                }
            }
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Deban")) {

                Player p = Bukkit.getPlayer(Constructeur.getPlayer());

                System.out.println(p.getUniqueId());

                if (Bukkit.getBanList(BanList.Type.NAME).isBanned(p.getName())){

                    Ban.remove(Constructeur.getPlayer());
                    Bukkit.getBanList(BanList.Type.NAME).pardon(p.getName());

                } else {
                    e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur n'est pas banni...");

                }
            }
 

Niz

l | l | l | l | l
18 Août 2013
1 064
1
639
267
Bonjour !
J'aurai plusieurs questions ...

Quel est le métier de ta classe constructeur ? À quoi sert-elle ?

Peux-tu nous montrer le contenu de la classe Constructeur ?

Où et comment as-tu instancié ton objet Constructeur ?

Le mieux serait d'avoir accès au code complet avec GitHub ou autre chose, là je t'avoue que c'est compliqué de juger...
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Et alors y a vraiment de beaucoup simplifié ton code ! Ce qui le rendra plus lisible et évitera les erreurs.

Voici une version où j'ai utilisé des switch plutôt que des "if" à la suite (surtout que tu aurais pu mettre des "else if", ce qui aurait amélioré la performance de ton code).
Java:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Punition")) {
            this.managePunitionInventory(e);
        } else if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Pardon")) {
            e.getWhoClicked().closeInventory();
            this.managePardonInventory(e);
        }
    }


    private void managePunitionInventory(final InventoryClickEvent event) {
        event.getWhoClicked().closeInventory();

        if (event.getCurrentItem().hasItemMeta() && event.getCurrentItem().getItemMeta().hasDisplayName()) {
            switch(event.getCurrentItem().getItemMeta().getDisplayName().toLowerCase()) {
                case ChatColor.AQUA + "propos racistes":
                    this.banProposRacistes();
                    break;

                case ChatColor.AQUA + "Propos discriminatoires":
                    this.banProposDiscriminatoires();

                case ChatColor.AQUA + "Duplication":
                    this.banDuplication();
                    break;

                // ...
            }
        }
    }

    private void managePardonInventory(final InventoryClickEvent event) {

        if (event.getCurrentItem().hasItemMeta() && event.getCurrentItem().getItemMeta().hasDisplayName()) {
            switch(event.getCurrentItem().getItemMeta().getDisplayName().toLowerCase()) {
                case ChatColor.AQUA + "Demute":
                    this.executePardonDemute(event.getWhoClicked());
                    break;

                case ChatColor.AQUA + "Deban":
                    this.executePardonDeban(event.getWhoClicked());
                    break;
            }
        }
    }

    private void banProposRacistes() {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());

        p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Propos Racistes");
        Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
        Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Propos Racistes", convertIntToDate(9999), "Propos Racistes");
        Ban.add(p.getUniqueId());
    }

    private void banDuplication() {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Duplication");
        Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
        Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Duplication", convertIntToDate(9999), "Duplication");
        Ban.add(p.getUniqueId());
    }

    private void banProposDiscriminatoires() {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());

        p.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : Propos Discriminatoires");
        Bukkit.broadcastMessage(p.getName() + "a été banni du serveur");
        Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Propos Discriminatoires", convertIntToDate(9999), "Propos Discriminatoires");
        Ban.add(p.getUniqueId());
    }

    // ...

    private void executePardonDemute(final Player playerWhoCliked) {
        if (Mute.contains(Constructeur.getPlayer())) {
            Mute.remove(Constructeur.getPlayer());
            Player p = Bukkit.getPlayer(Constructeur.getPlayer());
            p.sendMessage(ChatColor.RED + "Tu as été pardonné et tu n'es désormais plus mute.");
        } else {
            playerWhoCliked.sendMessage(ChatColor.RED + "Tu ne peux pas demute un joueur qui n'est pas mute !");
        }
    }

    private void executePardonDeban(final Player playerWhoCliked) {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());

        Bukkit.getLogger().info(p.getUniqueId());

        if (Bukkit.getBanList(BanList.Type.NAME).isBanned(p.getName())){
            Ban.remove(Constructeur.getPlayer());
            Bukkit.getBanList(BanList.Type.NAME).pardon(p.getName());
        } else {
            playerWhoCliked.sendMessage(ChatColor.RED + "Ce joueur n'est pas banni...");
        }
    }

Et voici ton code reformaté pour éviter les doublons. En effet, si tu dois copié/collé du code, c'est que tu fais une erreur. Et ne me dit pas que "c'est temporaire pour le début". En informatique si on fait un brouillon c'est sur papier et/ou c'est pas en écrivant tous les cas possibles. Si tu veux faire un test pour que ça marche, tu fais un mute et un ban et c'est tout. Si tu commences à mettre 5 raisons de ban différentes, c'est que tu écris déjà ton code "final" ;)
Java:
    private static final String PROPOS_RACISE = ChatColor.AQUA + "propos racistes";
    private static final String PROPOS_DISCRIMINATOIRES = ChatColor.AQUA + "Propos discriminatoires";
    private static final String DUPLICATION = ChatColor.AQUA + "Duplication";
    private static final String CHEAT = ChatColor.AQUA + "Cheat";
    private static final String HACK = ChatColor.AQUA + "Hack/DDOS";
    private static final String INSULTES = ChatColor.AQUA + "Insultes";
    private static final String SPAM = ChatColor.AQUA + "Spam";
    private static final String MAJUSCULES = ChatColor.AQUA + "Majuscules";
    private static final String PUB = ChatColor.AQUA + "Pub";
    private static final String MENACES = ChatColor.AQUA + "Menaces";


    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Punition")) {
            this.managePunitionInventory(e);
        } else if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Pardon")) {
            e.getWhoClicked().closeInventory();
            this.managePardonInventory(e);
        }
    }


    private void managePunitionInventory(final InventoryClickEvent event) {
        final Player playerWhoCliked = event.getWhoClicked();
        playerWhoCliked.closeInventory();

        if (event.getCurrentItem().hasItemMeta() && event.getCurrentItem().getItemMeta().hasDisplayName()) {
            switch(event.getCurrentItem().getItemMeta().getDisplayName().toLowerCase()) {
                case PROPOS_RACISE:
                    this.banProposRacistes();
                    break;

                case PROPOS_DISCRIMINATOIRES:
                    this.banProposDiscriminatoires();

                case DUPLICATION:
                    this.banDuplication();
                    break;

                case CHEAT:
                    this.banCheat();
                    break;

                case HACK:
                    this.banHack();
                    break;

                case INSULTES:
                    this.muteInsulte(playerWhoCliked);
                    break;

                case SPAM:
                    this.muteSpam(playerWhoCliked);
                    break;

                case MAJUSCULES:
                    this.muteMajuscule(playerWhoCliked);
                    break;

                case PUB:
                    this.mutePub(playerWhoCliked);
                    break;

                case MENACES:
                    this.muteMenace(playerWhoCliked);
                    break;
            }
        }
    }

    private void managePardonInventory(final InventoryClickEvent event) {

        if (event.getCurrentItem().hasItemMeta() && event.getCurrentItem().getItemMeta().hasDisplayName()) {
            switch(event.getCurrentItem().getItemMeta().getDisplayName().toLowerCase()) {
                case ChatColor.AQUA + "Demute":
                    this.executePardonDemute(event.getWhoClicked());
                    break;

                case ChatColor.AQUA + "Deban":
                    this.executePardonDeban(event.getWhoClicked());
                    break;
            }
        }
    }

    private void generiqueBan(final String raison) {
        final Player player = Bukkit.getPlayer(Constructeur.getPlayer());

        player.kickPlayer(ChatColor.RED + "Tu as été banni définitevement pour : " + raison);
        Bukkit.broadcastMessage(player.getName() + "a été banni du serveur");
        Bukkit.getBanList(BanList.Type.NAME).addBan(player.getName(), raison, convertIntToDate(9999), raison);
        Ban.add(p.getUniqueId());
    }

    private void banProposRacistes() {
        this.generiqueBan("Propos Racistes");
    }

    private void banDuplication() {
        this.generiqueBan("Duplication");
    }

    private void banProposDiscriminatoires() {
        this.generiqueBan("Propos Discriminatoires");
    }

    private void banCheat() {
        this.generiqueBan("Cheat");
    }

    private void banHack() {
        this.generiqueBan("Hack/DDOS");
    }

    private void generiqueMute(final Player adminWhoMute, final Integer tempsMuteEnSecondes) {
        if (Mute.contains(Constructeur.getPlayer())) {
            adminWhoMute.sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
        } else {
            final Player playerToMute = Bukkit.getPlayer(Constructeur.getPlayer());
            playerToMute.sendMessage(ChatColor.RED + "Tu as été mute pour " + (tempsMuteEnSecondes/60) + " minutes !");
            playerToMute.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
            Mute.add(Constructeur.getPlayer());
            Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
                @Override
                public void run() {
                    Mute.remove(Constructeur.getPlayer());
                }
            }, 20 * tempsMuteEnSecondes);
        }
    }

    private void muteInsulte(final Player playerWhoCliked) {
        this.generiqueMute(playerWhoCliked, 3600);
    }

    private void muteSpam(final Player playerWhoCliked) {
        this.generiqueMute(playerWhoCliked, 1800);
    }

    private void muteMajuscule(final Player playerWhoCliked) {
        this.generiqueMute(playerWhoCliked, 1200);
    }

    private void mutePubfinal(final Player playerWhoCliked) {
        this.generiqueMute(playerWhoCliked, 3600);
    }

    private void muteMenace(final Player playerWhoCliked) {
        this.generiqueMute(playerWhoCliked, 3600);
    }

    private void executePardonDemute(final Player playerWhoCliked) {
        if (Mute.contains(Constructeur.getPlayer())) {
            Mute.remove(Constructeur.getPlayer());
            final Player player = Bukkit.getPlayer(Constructeur.getPlayer());
            player.sendMessage(ChatColor.RED + "Tu as été pardonné et tu n'es désormais plus mute.");
        } else {
            playerWhoCliked.sendMessage(ChatColor.RED + "Tu ne peux pas demute un joueur qui n'est pas mute !");
        }
    }

    private void executePardonDeban(final Player playerWhoCliked) {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());

        Bukkit.getLogger().info(p.getUniqueId());

        if (Bukkit.getBanList(BanList.Type.NAME).isBanned(p.getName())){
            Ban.remove(Constructeur.getPlayer());
            Bukkit.getBanList(BanList.Type.NAME).pardon(p.getName());
        } else {
            playerWhoCliked.sendMessage(ChatColor.RED + "Ce joueur n'est pas banni...");
        }
    }


Cordialement,
Detobel36
 
  • J'aime
Reactions: Niz

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Coucou, alors déjà merci pour l'optimisation (il est vrai que je ne l'aurai pas faite) et je pense que le souci viens de comment j'ai instancié mon constructeur voici le code de ma class où j'ai instancié le constructeur en pastebin :https://pastebin.com/zzDcEVkv et voici le code de mon constructeur ici-même :

Java:
public class Constructeur  {

       public static final List<Constructeur> C = new LinkedList<>();

        private static UUID player;



        public Constructeur(UUID subject) {

            if(subject == null) throw new NullPointerException("`subject` ne dois pas être null");



            this.player = subject;



            C.add(this);
        }



        public static UUID getPlayer(){
            return player;
        }


}
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Peux-tu nous expliquer avec des mots ou un schéma, comment tu vois la chose ?

J'ai l'impression que tu t'es lancé dans le code en suivant un tuto et/ou en voulant t'en rapproché mais que tu ne sais pas où tu va et pourquoi tu fais tout ça.
Donc fait nous simplement un "plan" sur paint ou expliquer en deux trois phrase comment tu veux que ça marche :)
(Tu pars de "l'<admin> fait une commande pour ban <joueur>, du coup la class X contient ... et appel ..." enfin bref, le processus d’exécution dans l'ordre).


Cordialement,
Detobel36
 
  • J'aime
Reactions: Niz

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Re-Coucou ! Alors non pour une fois je n'ai pas suivi de tuto, en fait je m'explique ( désoler je suis très mauvais à paint ) :
Je veux faire un système de bannissement comme ça : Un modo fais /pun player qui instancie la class Constructeur avec comme paramètre l'UUID du joueur puis choisi la sanction, si c'est un ban il est banni si c'est un mute il est mute ( dans les 2 cas il est ajouté dans une ArrayList même si pour le ban ce n'est pas nécessaire ), PUIS lorsqu'il veux demute un joueur demute ou deban un joueur avec /pard Player et bien ça le deban mais je sais que ça coince à ce niveau là
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Constructeur.getPlayer() est censé savoir quel joueur je vise
Comment ? Si j'ai bien compris tu ouvres un inventaire rempli d'items pour que le modérateur puisse choisir une raison de bannissement, mais à aucun moment tu ne dis de quel inventaire/modérateur tu parles. Si deux modérateurs sont en train de bannir un joueur, Constructeur.getPlayer() ne peut pas savoir quel joueur est la cible puisqu'il y en a deux joueurs ciblés, mais qu'il ne doit en renvoyer qu'un seul.

Java:
if (e.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Punition"))
Comme je te l'ai déjà dit plusieurs fois, le nom de l'inventaire ne peut pas être autre chose que ce que tu as mit en le créant. Dans le pire des cas, String#equalsIgnoreCase(String) prend sept fois plus de temps que String#equals(String), donc préfère utiliser #equals() si tu es sûr de la casse, ce qui est ton cas ici.

Java:
if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Insultes")) {
    if (Mute.contains(Constructeur.getPlayer())) {
        e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
    } else {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
        p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
        Mute.add(Constructeur.getPlayer());
        Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
            @Override
            public void run() {
                Mute.remove(Constructeur.getPlayer());
            }
        }, 20 * 3600);
    }
}

if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Spam")) {
    if (Mute.contains(Constructeur.getPlayer())) {
        e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
    } else {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.sendMessage(ChatColor.RED + "Tu as été mute pour 30 minutes !");
        p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
        Mute.add(Constructeur.getPlayer());
        Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
            @Override
            public void run() {
                Mute.remove(Constructeur.getPlayer());
            }
        }, 20 * 1800);
    }
}

if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Majuscules")) {
    if (Mute.contains(Constructeur.getPlayer())) {
        e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
    } else {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.sendMessage(ChatColor.RED + "Tu as été mute pour 20 minutes !");
        p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
        Mute.add(Constructeur.getPlayer());
        Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
            @Override
            public void run() {
                Mute.remove(Constructeur.getPlayer());
            }
        }, 20 * 1200);
    }
}

if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Pub")) {
    if (Mute.contains(Constructeur.getPlayer())) {
        e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
    } else {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
        p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
        Mute.add(Constructeur.getPlayer());
        Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
            @Override
            public void run() {
                Mute.remove(Constructeur.getPlayer());
            }
        }, 20 * 3600);
    }
}

if (e.getCurrentItem().hasItemMeta() && e.getCurrentItem().getItemMeta().hasDisplayName() && e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.AQUA + "Menaces")) {
    if (Mute.contains(Constructeur.getPlayer())) {
        e.getWhoClicked().sendMessage(ChatColor.RED + "Ce joueur est déjà mute");
    } else {
        Player p = Bukkit.getPlayer(Constructeur.getPlayer());
        p.sendMessage(ChatColor.RED + "Tu as été mute pour 60 minutes !");
        p.playSound(p.getLocation(), Sound.VILLAGER_NO, 1, 50);
        Mute.add(Constructeur.getPlayer());
        Bukkit.getScheduler().runTaskLater(mainClass, new BukkitRunnable() {
            @Override
            public void run() {
                Mute.remove(Constructeur.getPlayer());
            }
        }, 20 * 3600);
    }
}
Tu n'es pas supposé copier-coller plusieurs fois le même code, mais remplacer tout ce qui change par des variables.

Java:
ItemStack stack = e.getCurrentItem();
if(stack != null && stack.hasItemMeta()) {
   ItemMeta meta = stack.getItemMeta();
   final int minutesMuted;
   
   //noinspection ConstantConditions
   switch(meta.getDisplayName().substring(ChatColor.AQUA.toString().length())) {
      case "Majuscules":
         minutesMuted = 20;
         break;
      
      case "Spam":
         minutesMuted = 30;
         break;
      
      case "Insultes":
      case "Pub":
      case "Menaces":
         minutesMuted = 60;
         break;
         
      default:
         throw new RuntimeException("unimplemented reason: \"" + meta.getDisplayName() + '"');
   }
   
   Player target = // FIXME: Bukkit.getPlayer(Constructeur.getPlayer());
   target.sendMessage(ChatColor.RED + "Vous venez d'être réduit au silence pour " + minutesMuted + " minutes.");
   target.playSound(target.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 50);
   Mute.add(target.getUniqueId());
   
   // FIXME: un arrêt de serveur annulera la tâche, et le joueur ne sera jamais unmute
   Bukkit.getScheduler().runTaskLater(plugin, new BukkitRunnable() {
      @Override
      public void run() {
         // `Constructeur.getPlayer()` peut changer entre temps
         Mute.remove(target.getUniqueId());
      }
   }, minutesMuted * 60 * 20);
}

Je veux faire un système de bannissement comme ça : Un modo fais /pun player qui instancie la class Constructeur avec comme paramètre l'UUID du joueur puis choisi la sanction
Tu n'as pas besoin d'instancier un nouveau mouton pour savoir s'ils ont deux ou quatre pattes. Cela ne sert à rien d'instancier un nouvel objet si tu n'utilises jamais ledit objet.

Java:
// ta classe `Constructeur` (je l'ai renommée parce que voilà ce n'est pas un constructeur) permet de récupérer le joueur sélectionné par le modérateur
public class InventoryPlayerSelector {
    // associe à chaque joueur `Player` (modo dans notre cas) le joueur qu'il a sélectionné
    private static final Map<Player, UUID> map = new WeakHashMap<>();
    
    public static void setPlayerSelection(Player moderator, UUID selection) {
        map.put(moderator, selection);
    }
    
    public static UUID takePlayerSelection(Player moderator) {
        UUID selection = map.remove(moderator);
        if(selection == null) {
            throw new IllegalStateException("logic error: take() without set()");
        }
        
        return selection;
    }
}

// lorsque tu ouvres l'inventaire après que le modo ait sélectionné un joueur :
InventoryPlayerSelector.setPlayerSelection(e.getWhoClicked() /* le modo */, ... /* le joueur qu'il vient de prendre */);
e.getWhoClicked().openInventory(...);


// lorsque tu veux récupérer le joueur que le modo avait sélectionné dans l'ancien menu :
UUID targetId = InventoryPlayerSelector.takePlayerSelection(e.getWhoClicked() /* le modo */);
Player target = Bukkit.getPlayer(targetId);
if(target != null) {
    target.sendMessage("Vous êtes ...");
    // messages, son, etc.
}

// dans tous les cas (même si le joueur s'est déco), on mute
Mute.add(targetId);
// etc.

L'idée est de passer par une classe intermédiaire pour échanger une variable entre le clique dans l'inventaire de sélection du joueur à sanctionne, et le clique dans l'inventaire de sélection de la raison.
À noter que tu ne peux appeler qu'une seule fois #takePlayerSelection(), donc sauvegarde la variable, sinon tu auras une erreur dans le cas où tu l'appelerais deux fois.

Bref, comme l'a déjà dit Detobel, contente-toi de faire simple, avec seulement du banissement et deux/trois raisons, puis ensuite quand cela marchera tu pourras étendre aux mutes et à d'autres raisons.

Java:
Bukkit.getBanList(BanList.Type.NAME).addBan(p.getName(), "Duplication", convertIntToDate(9999), "Duplication");
Si tu veux faire un bannissement permanent, tu dois mettre null en date ; je précise aussi que le plus grand nombre stockable dans un int n'est pas 9999 mais Integer.MAX_VALUE (2^32/2-1).
 

Niz

l | l | l | l | l
18 Août 2013
1 064
1
639
267
Re-Coucou ! Alors non pour une fois je n'ai pas suivi de tuto, en fait je m'explique ( désoler je suis très mauvais à paint ) :
Je veux faire un système de bannissement comme ça : Un modo fais /pun player qui instancie la class Constructeur avec comme paramètre l'UUID du joueur puis choisi la sanction, si c'est un ban il est banni si c'est un mute il est mute ( dans les 2 cas il est ajouté dans une ArrayList même si pour le ban ce n'est pas nécessaire ), PUIS lorsqu'il veux demute un joueur demute ou deban un joueur avec /pard Player et bien ça le deban mais je sais que ça coince à ce niveau là
Je pense que tu devrais revoir toute la partie programmation orientée objet.

Je m'explique : Chaque objet est sensé avoir une unique fonction qui lui est propre.
Prenons par exemple un GUI customisé; Afin de gérer ton GUI, tu as besoin de minimum deux objets, c'est à dire l'objet GUI qui va gérer l'affichage de ce dernier et un objet Listener qui va gérer les actions de ce GUI.
Afin d'aider la lecture, on donnera à chaque objet un nom en rapport avec sa fonction.
Par exemple: CustomGUI et CustomGUIListener.
(Je précise évidemment que ce n'est pas forcément la seule manière ni la manière optimale, c'est juste un exemple)

Dans ton cas, tu nous présentes un objet appelé "Constructeur" qui garde en mémoire une liste d'identifiants (Pourquoi la rendre statique ?) ainsi qu'un identifiant qui porte le nom de "joueur" (pourquoi statique une fois de plus ?).
À quoi sert cet objet ? Sert-il à effectuer des actions sur le joueur ? Lesquels ?
Ou à stoquer des joueurs ? Pourquoi ?
Personnellement, je pense que tu devrais faire deux objets distincts.

Revenons à ton problème de départ:
Tu te retrouves face à une NPE car tu cherches à récupérer le joueur d'un objet qui n'est pas instancié.
Ce n'est pas parce que tu l'as instancié dans une classe qu'il l'est dans tout le programme et qu'il est accessible: Dans ton Listener, tu ne lui dis pas quelle instance prendre.

Si jamais tu souhaites en discuter en vocal, je peux me rendre disponible sur Discord: Niz#0001

PS: La première chose qui me fait penser que tu devrais revoir cette partie, c'est que tu n'as pas respecté le principe d'encapsulation !