Configuration Résolu Java : erreur inconnue

Detobel36

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

Il faut donc créer une instance dans le main ?
Attention j'ai dis variable "instance" car c'est comme ça qu'on l'appel habituellement. Mais l'instance en elle même est créé par bukkit.

PSEUDO CODE:
Code:
package ...
import ...

public class main {
    private static main;

    @Override
    public void onEnable() {
        main = this;
    }


    public static main getInstance() {
        return main;
    }

}
Et du coup dans une autre class:
Code:
package ...
import ...

public class autreClass {

    public void uneMethod() {
        Main.getInstance().getServer()....
    }

}


Cordialement,
Detobel36
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Ce sont deux réponses très complètes et je vous en remercie. Cela étant, j'ai fait une copie de mon projet (donc je me retrouve avec 2 projets FK) et je vais tout recommencer dans le premier de façon à y aller petit bout par petit bout comme le conseil Detobel, au moins cela permettra de voir les erreurs en temps réel.

J'ai essayé ce que luca_008 a conseillé, cela n'a pas fonctionné, mais je pense que c'est dû au fait que y'avait d'autre chose dans la class qui devait l'empêcher de fonctionner. Donc je vais reprendre depuis le début sans pour autant tout supprimer, mais j'ai quand même quelque questions :

- Detobel ou luca, quand je met un private sur une ArrayList ou sur un simple String, il me demande tout le temps de faire des getter et setter pour que le code dans d'autre class puisse utiliser ces éléments. Y'a-t-il moyen de faire en sorte de pas avoir à utiliser ceci ? Cela ma rajoute des lignes (là n'est pas le problème) mais je ne sais pas comment me servir de ce qu'il me rajoute et si oui ou non je dois mettre des choses dedans ou non.

- Je suppose que si je fait un String dans la class principale (ici main) et que je veux y avoir accès depuis le GameManager par exemple, je suis obligé de passer par private static String etc... ? A ce moment là, la récupération de ce string dans une autre class devient hyper longue. Donc pareil, c'est obligé de devoir utilisé des syntaxes longues comme le bras ou il existe des méthodes plus courtes ?

- Pour finir, j'ai fais un dernier test en enlevant les class ListenerManager et PlayerJoinListener jai donc mis :
Code:
    public void onJoin(PlayerJoinEvent pje){
        Player player = pje.getPlayer();
        Bukkit.broadcastMessage(gamePrefix + ChatColor.YELLOW + player.getName() + ChatColor.GRAY + " à rejoint la partie !");
      
    }
  
    public void onKick(PlayerKickEvent pke){
        Player player = pke.getPlayer();
        Bukkit.broadcastMessage(gamePrefix + ChatColor.YELLOW + player.getName() + ChatColor.GRAY + " à rejoint la partie !");
    }
Dans la class main, mais même ceci ne fonctionne pas. Donc vraiment sois faire un broadcast ne se fait pas comme ça, sois y'a eu tellement de chose mal faites dans le plugin ( de ma part hein ^^) que il sait même plus quoi faire (a savoir que j'ai testé en ayant supprimé le contenu des autres class).

Voilà voilà, merci encore, je vous tiendrais informé de l'avancement des choses pour ce plugin, mais je testerai au fur et à mesure maintenant, et merci Deto pour le rappel des args.length et des args[0], ça fait pas de mal :p

Merci à vous,

AlexFatta

PS : j'ai vraiment commencé les cours de Java Deto, chose promis chose due ^^
 

Detobel36

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

PS : j'ai vraiment commencé les cours de Java Deto, chose promis chose due ^^
Alors me pose pas cette question:
- Detobel ou luca, quand je met un private sur une ArrayList ou sur un simple String, il me demande tout le temps de faire des getter et setter pour que le code puisse utiliser ces éléments. Y'a-t-il moyen de faire en sorte de pas avoir à utiliser ceci ? Cela ma rajoute des lignes (là n'est pas le problème) mais je ne sais pas comment me servir de ce qu'il le rajoute et si oui ou non je dois mettre des choses dedans ou non.
ça montre juste que tu comprend à ce que tu fais... Je vais pas t'écrire un tutoriel complet sur java..

Un private n'implique pas d'utilisé de getter et/ou de setters... Bon allé, exemple:
PHP:
// ... import, package, ... bref

public class exemple {
   
    private int nombre1;
    private String superMot;
    private boolean active;

    // Constructeur
    public exemple() {
        nombre1 = 2;
        superMot = "Salut";
        active = false;
    }
   
    private void methode1() {
        if(active) {
            System.out.println(superMot + " = " + nombre1);
            ++nombre1;
        }

        active = !active; // On inverse la valeur de active (il passe de true à false à chaque fois)
    }

    // getter de la variable nombre1
    public int getNombre1() {
        return nombre1;
    }

    // setter de la variable superMot
    public void setSuperMot(String nouveauMot) {
        superMot = nouveauMot;
    }

    // getter de la varible superMot
    public String getSuperMot() {
        return superMot;
    }

}
On a donc "active" qui n'a ni getter, ni setter et qui alterne entre true et false. On a "nombre1" qui a juste un getter et "superMot" qui a un getter et un setter.

Cela veut dire que dans une autre class, on pourra faire ceci:
PHP:
// blablab package, blablab import, ....
public class autreClass {
   
    private exemple varExemple; // on récupère une instance de la class exemple (je décris pas comment ici, y a pleins de façons différentes).

    public void methodeYOLO() {
        System.println("Le super mot est: " + varExemple.getSuperMot());
        varExemple.methode1(); // N'affiche rien
        varExemple.setSuperMot("Coucou");
        varExemple.methode1(); // Affiche "coucou = 2"
        varExemple.methode1(); // N'affiche rien
        varExemple.methode1(); // Affiche "coucou = 3"
       
        // Ici il est impossible de faire ceci:
        varExemple.active = true; // ERROR
        // Ou encore ceci:
        System.println(varExemple.superMot); // ERROR
    }

}
L'avantage d'avoir un private sur "nombre1" et "active" est assez claire... Cela permet d'empêcher les variables d'être modifié autre part que dans la class où elle sont déclaré. Ensuite, pour le getter de "superMot", cela permet de protéger l'intégrité. Par exemple, si on veut un mot qui soit toujours en minuscule, il suffit de changer le setter par ceci:
PHP:
    // setter de la variable superMot
    public void setSuperMot(String nouveauMot) {
        superMot = nouveauMot.toLowerCase();
    }
Et la on sera sur que le "superMot" sera toujours en minuscule :)

- Je suppose que si je fait un String dans la class principale (ici main) et que je veux y avoir accès depuis le GameManager par exemple, je suis obligé de passer par private static String etc... ? A ce moment là, la récupération de ce string dans une autre class devient hyper longue. Donc pareil, c'est obligé de devoir utilisé des syntaxes longues comme le bras ou il existe des méthodes plus courtes ?
En quoi c'est long ?
Code:
String tonString = main.getInstance().getLeString();
Tu es au courant qu'il y a des "auto complétion" sur les IDE ? Réduire le nombre de caractère ne sert à rien... Ton code est compilé, il est simplifié automatiquement pas java. Tu peux faire des variables de 100 caractères de long, ça change rien pour java.
Un développeur est fainéant (tout autant qu'un mathématicien, un physicien, ...), oui c'est une qualité. Mais il doit toujours être claire ! Il faut des noms de variables qui disent ce qu'elle contiennent (pas de variable "a", "m2", ...).

Dans la class main, mais même ceci ne fonctionne pas. Donc vraiment sois faire un broadcast ne se fait pas comme ça, sois y'a eu tellement de chose mal faites dans le plugin ( de ma part hein ^^) que il sait même plus quoi faire (a savoir que j'ai testé en ayant supprimé le contenu des autres class).
Non c'est juste que tu as pas été voir la doc des listeners...
https://www.spigotmc.org/wiki/using-the-event-api/

Faire un listener dans un main c'est pas la meilleur idée m'enfin bon... ça marche. Donc ça donne ceci:
PHP:
// Import, package, blablbalbl ....

public class main extend JavaPlugin implements Listener{

    private static final String gamePrefix = "SuperPrefix"; // a changer

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler // ça tu l'avais oublié !
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = pje.getPlayer();
        Bukkit.broadcastMessage(gamePrefix + ChatColor.YELLOW + player.getName() + ChatColor.GRAY + " à rejoint la partie !");
    }

    // Pareil pour l'autre event

}


Cordialement,
Detobel36
 
  • J'aime
Reactions: Alex Fatta

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
Attention j'ai dis variable "instance" car c'est comme ça qu'on l'appel habituellement. Mais l'instance en elle même est créé par bukkit.
Ok merci de l'information je le savais pas :)
Dans la class main, mais même ceci ne fonctionne pas. Donc vraiment sois faire un broadcast ne se fait pas comme ça, sois y'a eu tellement de chose mal faites dans le plugin ( de ma part hein ^^) que il sait même plus quoi faire (a savoir que j'ai testé en ayant supprimé le contenu des autres class).
Deto à répondu tu n'avais pas mis "@EventHandler" et t'avais pas déclaré ton event dans ton onEnable(){
J'ai essayé ce que luca_008 a conseillé, cela n'a pas fonctionné, mais je pense que c'est dû au fait que y'avait d'autre chose dans la class qui devait l'empêcher de fonctionner. Donc je vais reprendre depuis le début sans pour autant tout supprimer, mais j'ai quand même quelque questions :
Tu as du louper une étape car normalement mon code que j'ai cité avec les constructeurs est fonctionnel, peut être que je l'ai mal expliqué :/
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Hey ! What's up guys !

Bon, eh bien je vous remercie beaucoup, j'ai commencé le nouveau en testant tout au fur et à mesure, en prenant mon temps et en m'inspirant de ce que vous m'avez répondu plus haut. Donc la class GameManager fonctionne maintenant ainsi que le message de join, mais c'est le TeamManager qui ne fonctionne pas. Je n'ai rien fait de bien compliqué, voici le code :
PHP:
public class teamManager implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(label.equalsIgnoreCase("fk") && sender instanceof Player){
            Player player = (Player) sender;
          
            if(args.length == 0){
                player.sendMessage(main.getGamePrefix() + main.getArgument());
            }else if(args.length == 3){
                if(args[0].equalsIgnoreCase("team")){  //fk team add <pseudo> <team>
                  
                    if(args[1].equalsIgnoreCase("add")){
                        if(args[3].equalsIgnoreCase("Blue")){
                            Player member = Bukkit.getServer().getPlayer(args[2]);
                            player.sendMessage(ChatColor.GREEN + "Tu souhaite rejoindre l'équipe bleue");
                            member.setPlayerListName(ChatColor.BLUE + member.getName());
                        }
                    }//fin add
                }//fin team
            }else {
                player.sendMessage(main.getGamePrefix() + ChatColor.RED + "Erreur team : ce n'est pas le bon argument !");
            }
        } 
      
        return false;
    }

}

Et quand je fais /fk team add AlexFatta Blue eh bien il ne se passe rien. Rien IG et rien dans la console. J'ai modifié des choses à droite à gauche, mais toujours le même résultats.

Si vous avez des idées @Detobel36 @Luca_008 :D Je prends tout ^^

Merci ! :D

AlexFatta

EDIT : C'est bon j'ai trouvé le souci, je m'étais trompé sur le nombre de la longueur de l'argument d'un nombre ^^
 
Dernière édition: