Configuration Java : méthode de création avec argument

Alex Fatta

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

Je cherche à créer un petit plugin de gestion de teams avec les ScoreBoards du jeu vanilla. J'ai essayé de créer les teams avec un ConsoleSender dans le code, mais quand j'ajoute un joueur dans la team, les couleurs ne s'affichent pas dans le tab ni dans le tchat. Donc je me penche pour le faire moi même ^^ J'ai trouvé ceci :
https://www.bukkit.fr/topic/8057-utiliser-scoreboard/

Mais je suis face à un problème. Le créateur du tuto pars du principe que les noms des teams sont déjà définis (ici redteam), or je souhaite créer les teams avec un nom souhaité et entré dans un argument (voir le code ci-dessous) mais cela ne fonctionne pas. Il n'arrive pas à insérer la variable qui contient le nom de la team (défini dans la commande) et donc il ne peux pas me créer de team. Et je veux utiliser ce système pour deux autre méthode également : la méthode pour join et pour leave la team. Et je voudrais vraiment ne pas avoir à rentré des noms manuellement dans le code, sinon ce serait des noms qui ne pourront pas être changé à moins de modifier le code source. En espérant que vous aurez compris ^^

PHP:
package fr.alexfatta.teams;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import org.bukkit.scoreboard.Team;

public class TeamManager implements CommandExecutor {
    
    private String teamName = " ";
    

    @Override
    public boolean onCommand(CommandSender sender, Command command,String label, String[] args) {
        if(label.equalsIgnoreCase("team") && sender instanceof Player){
            Player player = (Player) sender;
            if(args.length == 0){
                player.sendMessage(ChatColor.RED + "Merci de rentrer un argument !");
            }
            if(args.length == 2){
                if(args[0].equalsIgnoreCase("create")){
                    setTeamName(args[1]);
                    createTeam(args[1]);
                }
            }
        }
        
        return false;
    }
    
    public void createTeam(String teamName){
        ScoreboardManager manager = Bukkit.getScoreboardManager();
        Scoreboard board = manager.getNewScoreboard();
        Team getTeamName() = board.registerNewTeam(getTeamName());
    }

    
    
    public String getTeamName() {
        return teamName;
    }

    public void setTeamName(String teamName) {
        this.teamName = teamName;
    }

}

Cette partie est en rouge : Team getTeamName()

createTeam.jpg
Et si je met juste teamName, il me demande de renommer la variable. Ca me dépannerai bien si vous auriez une solution :p

Voilà merci à tous !

PS : autre petite question, possible de mettre un "getConfig()" ailleurs que dans la classe principale ?

AlexFatta
 
Salut,

Team getTeamName() = board.registerNewTeam(getTeamName());
Qu'est-ce que tu espères en faisant ça ?
Code:
int i = 2;
Ca ça marche...
Mais
Code:
int fonction() = 12;
Qu'est-ce que tu espères ? Il va pas mettre 12 dans une fonction !

Ta fonction createTeam elle ne sert à rien vu que tu n'enregistre null part ce que tu créé.
Code:
    public void createTeam(String teamName){
        ScoreboardManager manager = Bukkit.getScoreboardManager();
        Scoreboard board = manager.getNewScoreboard();
        Team team = board.registerNewTeam(getTeamName());
    }
Une fois la conftion finie, manager, board et team seront supprimé...

Surtout que seule les personnes étant dans le même "Scoreboard" pourront voir cette team...

autre petite question, possible de mettre un "getConfig()" ailleurs que dans la classe principale ?
Suffit de récupérer l'instance de ton main :) Je t'ai déjà montré ça 2 fois (avec le "getInstance" ou le "this" dans les constructeur)


Cordialement,
Detobel36
 
  • J'aime
Reactions: Alex Fatta
Bonjour !

J’espérai justement qu'il remplacerai les getTeamName() par le nom de la team entré dans la commande, mais visiblement non x). Je cherche vraiment à faire quelque chose d'optimisé et ne pas mettre les noms définitif dans le code justement. Et c'est là que je bloque je ne sais pas comment m'y prendre. Mais du coup je ne dois pas créer de méthode mais mettre ce que j'ai mis dans la méthode dans une commande (le contenu de "createTeam" dans la commande /team create c'est ça ?) Et merci pour le fichier de config j'avais zappé qu'on pouvait faire un getInstance je me souviens bien que tu me l'ai dit en plus ^^

AlexFatta
 
Salut,

justement qu'il remplacerai les getTeamName() par le nom de la team entré dans la commande, mais visiblement non x). Je cherche vraiment à faire quelque chose d'optimisé et ne pas mettre les noms définitif dans le code justement. Et c'est là que je bloque je ne sais pas comment m'y prendre. Mais du coup je ne dois pas créer de méthode mais mettre ce que j'ai mis dans la méthode dans une commande (le contenu de "createTeam" dans la commande /team create c'est ça ?)
Rien compris...

As-tu réellement appris à dev en Java depuis ? Car mettre une valeur dans une méthode il y a très peu de langage qui sont fait comme ça (à la limite javascript peut-être qui peut passer des méthodes en paramètres... mais à part ça xD).

Bref, petit rappel
Code:
class A {
    private int valeur;

    public A() {
        this(0);
    }

    public A(int newValeur) {
        valeur = newValeur;
    }

    public void setValeur(newValeur) {
        valeur = newValeur;
    }

    public int getValeur() {
        return valeur;
    }

    public void printValeur() {
        Bukkit.getLogger().info("La valeur est: " + valeur);
    }

}

// du coup on peut faire
A a1 = new A();
a1.printValeur(); // Affiche 0
a1.setValeur(12);
a1.printValeur(); // Affiche 12
int uneValeur = a1.getValeur();
a1.setValeur(uneValeur+1);
a1.printValeur(); // Affiche 13

A a2 = new A(36);
a2.printValeur(); // Affiche 36
a2.setValeur(43);
a2.printValeur(); // affiche 43

Bref, je vois pas où tu bloques.


Cordialement,
Detobel36
 
J'ai bien analyser ce que tu as mis et je t'en remercie, mais là où je bloque, c'est sur le fait que si je met des String, le plugin ne saura pas que le String en question (ici teamName) est le nom de la team. Pour ça je dois utiliser l'objet "Team", mais si je met l'objet team, il ne va pas être content. Je te met le code que j'ai avancé et qui ne fonctionne pas avec des screens à l'appui pour t'aider à comprendre.
PHP:
package fr.alexfatta.teams;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import org.bukkit.scoreboard.Team;

public class TeamManager implements CommandExecutor {
    
    private String teamName = " ";
    private static Main INSTANCE;
    
    

    @Override
    public boolean onCommand(CommandSender sender, Command command,String label, String[] args) {
        if(label.equalsIgnoreCase("team") && sender instanceof Player){
            Player player = (Player) sender;
            if(args.length == 0){
                player.sendMessage(ChatColor.RED + "Merci de rentrer un argument !");
            }
            if(args.length == 2){
                if(args[0].equalsIgnoreCase("create")){
                    setTeamName(args[1]);
                    createTeam(args[1]);
                }
            }
            
            if(args.length == 3){
                if(args[0].equalsIgnoreCase("add")){ //team add player team
                    Player PlayerToAdd = Bukkit.getServer().getPlayer(args[1]);
                    setTeamName(args[2]);
                    joinTeam(PlayerToAdd, args[2]);
                }
            }
        }
        
        return false;
    }
    
    public void createTeam(String teamName){
        ScoreboardManager manager = Bukkit.getScoreboardManager();
        Scoreboard board = manager.getNewScoreboard();
        Team team = board.registerNewTeam(getTeamName());
        getINSTANCE().getConfig().set(teamName, team);
    }
    
    public void joinTeam(Player toAdd, Team teamName){
        this.teamName = teamName;
    }
    
    public void leaveTeam(Player toRemove, String teamName){
        
    }

    
    
    public String getTeamName() {
        return teamName;
    }

    public void setTeamName(String teamName) {
        this.teamName = teamName;
    }

    public static Main getINSTANCE() {
        return INSTANCE;
    }

    public static void setINSTANCE(Main iNSTANCE) {
        INSTANCE = iNSTANCE;
    }

}

Team2.jpg
Team3.jpg

Voilàç tu as tout. Et donc je bloque sur le fait que je peux pas mettre de String en tant que nom de team, il faut que ce soit l'objet "Team" de l'API bukkit qui gère les noms de team. Mais comme tu as pu t'en rendre compte, si je met "Team teamName" il me demandera dans la commande de rentrer un nom de team, sauf qui si je met un nom de team qui n'existe pas, comment est-ce que je peux en créer une ? Ca tourne en rond et je suis bloqué à ce niveau là.

Et oui j'ai commencé les cours d'OpenClassroom mais je n'en suis que là : https://openclassrooms.com/courses/apprenez-a-programmer-en-java/votre-premiere-classe
Les journée ne font que 24H :/

J’espère être compréhensible dans mes propos x) sinon j'essaierai de détailler un peu plus les points qui ne seront pas clair.

AlexFatta
 
Salut,

Java est un langage typé... Tu ne peux pas mettre un type dans un autre
Code:
int i = 12;
String text = "Salut";
Tu ne peux pas faire:
Code:
text = i;
i = text;
Evidemment que ça marche pas... Ici c'est la même chose.

Il faut donc convertir:
Code:
String teamName = team.getName();


Cordialement,
Detobel36
 
  • J'aime
Reactions: Alex Fatta
Ah ! Merci bien ! Voilà que me fait avancer ! :p Donc du coup j'ai réussi à faire quelque chose qui ne contient pas d'erreur et qui me parait stable. Cela étant, quand je veux add un joueur à la team en question, il barre le "addPlayer" et me demande mettre un SuppressWarnings. N'y a-t-il pas moyen de corriger ce problème ?

Je t'envoies le code pour correction si tu es d'accord ^^ et un screens qui montre la partie en question qui pose problème.
PHP:
package fr.alexfatta.teams;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import org.bukkit.scoreboard.Team;

public class TeamManager implements CommandExecutor {
   
    private Team team;
    private static Main INSTANCE;
    private String teamName = " ";
   
   

    @Override
    public boolean onCommand(CommandSender sender, Command command,String label, String[] args) {
        if(label.equalsIgnoreCase("team") && sender instanceof Player){
            Player player = (Player) sender;
            if(args.length == 0){
                player.sendMessage(ChatColor.RED + "Merci de rentrer un argument !");
            }
           
            if(args.length == 2){
               if(args[0].equalsIgnoreCase("create")){
                   setTeamName(args[1]);
                   team.setDisplayName(teamName);
                   createTeam(team);
               }
           }
           
           if(args.length == 3){
               if(args[0].equalsIgnoreCase("add")){ //team add player team
                   Player PlayerToAdd = Bukkit.getServer().getPlayer(args[1]);
                   setTeamName(args[2]);
                   team.setDisplayName(teamName);
                   joinTeam(PlayerToAdd, team);
               }
           }
       }
       
       return false;
   }
   
   public void createTeam(Team team){
       ScoreboardManager manager = Bukkit.getScoreboardManager();
       Scoreboard board = manager.getNewScoreboard();
       Team teamToCreate = board.registerNewTeam(getTeamName());
       getINSTANCE().getConfig().set(teamName, teamToCreate);
       teamName = teamToCreate.getName();
   }
   
    @SuppressWarnings("deprecation")
    public void joinTeam(Player toAdd, Team team){
        team.addPlayer(toAdd);
    }
   
    public void leaveTeam(Player toRemove, String teamName){
       
    }

team4.jpg

AlexFatta
 
Salut,


Rien compris...

As-tu réellement appris à dev en Java depuis ? Car mettre une valeur dans une méthode il y a très peu de langage qui sont fait comme ça (à la limite javascript peut-être qui peut passer des méthodes en paramètres... mais à part ça xD).

Sisi, y'a pas mal de langages qui acceptent les delegates ;)

Après en java.. http://stackoverflow.com/questions/44912/java-delegates

Bonne chance pour ton problème, perso j'ai pas compris où tu bloques ;)
 
Salut,

Sisi, y'a pas mal de langages qui acceptent les delegates ;)
Après en java.. http://stackoverflow.com/questions/44912/java-delegates
Bonne chance pour ton problème, perso j'ai pas compris où tu bloques ;)
Oui enfin c'est pas vraiment la même sémantique et c'est pas vraiment ça qu'il espérait xD

Mais oui, y a moyen de bidouiller.... Même si les cas de figure sont plutôt rare en java (en Javascript c'est encore assez utilisé il me semble).


Cordialement,
Detobel36
 
perso j'ai pas compris où tu bloques
Là je pense avoir résolu le problème du nom de la team, mais comme le dit mon dernier message, c'est au team.addPlayer() que ca coince maintenant, j'ai fournit un screen justement pour savoir si ce problème est important ou non, c'est ça que je veux savoir maintenant :p

AlexFatta