Aller au contenu
Calypso

tutoriel [Tutoriel - Java] Scoreboard

Messages recommandés

logo.png

 

 

Salut tout le monde !

 

Les tutoriels dans la section Minecraft se font rare, donc je vais essayer d'en faire 2 - 3 de temps en temps !

Aujourd'hui, je vais vous apprendre à utiliser les scoreboard directement via l'API Bukkit. Les scoreboards ont pour principal objectif d'afficher un score comme son nom l'indique mais on peut aussi très bien utiliser le Scoreboard pour faire quelque chose de beaucoup plus " concret ".

 

C'est la base des bases, mais maintenant voici un autre exemple. Et c'est cet exemple que l'on réalisera dans ce tutoriel:

 

 

0723052016-02-07-01.16.55.jpg

 

 

Un board qui affiche le nom du serveur sur lequel le joueur se trouve et le nombre de joueur connecté dessus. Mais on peut encore y faire de nombreuses choses comme afficher une information d'une base de données, afficher le grade du joueur, sa monnaie, etc ...

 

Le ScoreBoard - En général

Commençons par créer le ScoreBoardManager:

ScoreboardManager manager = Bukkit.getScoreboardManager();

Puis créons le ScoreBoard:

Scoreboard board = manager.getNewScoreboard();

Votre ScoreBoard est créé, donnons lui maintenant un objectif. L'objectif est "l'organisation de votre ScoreBoard" en quelque sorte. C'est une étape obligatoire:

Objective objective = board.registerNewObjective("test", "dummy");

Test correspond au nom de l'objectif et dummy correspond au critère d'objectif. Dans notre cas, nous voulons que le score ne soit changé que par des commandes et non des événements en jeu. On utilise donc dummy. Plus d'informations ici: 

Contenu Masqué

    Répondez au message pour visualiser le contenu

 

Pour définir l'emplacement de votre objectif:

objective.setDisplaySlot(DisplaySlot.SIDEBAR);

On le place dans la SIDEBAR, c'est à dire à droite du joueur. Dans le lien que je vous ai envoyé juste en haut, il vous référence toutes les positions possibles.

Enfin, on donne un nom à notre objectif. C'est le nom qui sera visible par le joueur, ça sera si vous voulez le nom de la fenêtre, du scoreboard à droite du joueur:

objective.setDisplayName("Mon ScoreBoard");

 

Le ScoreBoard - Les teams

On peut utiliser le ScoreBoard pour y faire des teams. Pour procéder à cela, créez votre team:

Team team = board.registerNewTeam("NOM DE L'EQUIPE AFFICHE");

Ainsi, vous pouvez le manipuler de diverses façons:

Pour ajouter un joueur:

team.addPlayer(joueur);

Pour enlever un joueur:

team.removePlayer(joueur);

Pour rajouter un préfixe au joueur:

team.setPrefix("préfixe");

Pour rajouter un suffixe au joueur:

team.setSuffix("suffixe");

Pour changer le nom de la team si besoin (ou le définir):

team.setDisplayName("Nom de la team");

Permet de voir ses coéquipiers invisibles:

team.setCanSeeFriendlyInvisibles(true);

Pour faire du FriendlyFire entre coéquipiers:

team.setAllowFriendlyFire(false)

Le ScoreBoard - Les scores

 

Et on peut aussi créer de simples scores comme ceci:

Score score = objective.getScore(joueur);
score.setScore(4);


Vous pouvez aussi reset le score comme ceci:

board.resetScores(joueur);

 

Ainsi, pour afficher le scoreBoard du joueur une fois paramétré, je l'affiche sur l'écran du joueur:

joueur.setScoreboard(board);

Mais vous pouvez aussi le supprimer:

joueur.setScoreboard(manager.getNewScoreboard());

Le ScoreBoard - Exemple concret

Maintenant que vous avez en main tous les outils nécessaires pour faire un ScoreBoard, passons à un exemple concret. Voici le cahier des charges:

 

  • Je souhaite organiser proprement ma fenêtre
  • Je souhaite afficher le nom de mon serveur
  • Je voudrais aussi afficher le nombre de joueur connecté sur le serveur

 

Bon bien déjà créons la base des bases:

ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getNewScoreboard();
Objective objective = board.registerNewObjective("test", "dummy");
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
objective.setDisplayName(ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "MON SERVEUR");

Pas besoin d'explications sur ce code, si vous avez lu avant, vous devez comprendre :)

 

Pour afficher du texte ainsi qu'une information texte, je vais utiliser les scores. Et vu que le nombre de joueurs doit s'actualiser à chaque fois qu'un joueur se connecte ou se déconnecte, il faut que je créé une nouvelle fonction:

public void updateBoard() {

}

Je souhaite 5 lignes sur mon scoreBoard, donc je créé 5 objets scores dans ma class (On déclare ça après la déclaration de la class et non dans la fonction !):

Score player;
Score server;
Score p1; // p = présentation (ou organisation)
Score p2;
Score p3;

Je reviens dans ma fonction et je paramètre chaque score:

p1 = objective.getScore(ChatColor.GRAY + "" + ChatColor.BOLD + "" +  ChatColor.STRIKETHROUGH + "                ");

'utilise ChatColor pour rentre mon board plus harmonieux. La doc vous sera utile si vous voulez changer tout ça: 

Contenu Masqué

    Répondez au message pour visualiser le contenu

 

Dans ce score, j'affiche une barre grise en gras. Ce n'est que esthétique. STRIKETHROUGH correspond à un texte barré. Dans mon cas, je ne veux pas de texte, donc je met un texte " vide ".

server = objective.getScore("Serveur: " + ChatColor.GREEN + "WW1");

A la ligne en dessous j'affiche le nom du serveur. Serveur sera affiche par défaut en blanc et WW1 en vert

p2 = objective.getScore(" ");

Je veux une ligne vide. Pour l'esthétique :)

player = objective.getScore("Joueurs: " + ChatColor.GREEN + Bukkit.getOnlinePlayers().size() + "/12");

La fonction Bukkit.getOnlinePlayers().size() renvoit le nombre de joueur connecté. Il sera affiché avant me /12 en vert.

p3 = objective.getScore(ChatColor.GRAY + "" + ChatColor.BOLD + "" +  ChatColor.STRIKETHROUGH + "                  ");

J'affiche une nouvelle fois une barre. ATTENTION, la longeur ne doit pas être la même que le score p1 car sinon la ligne ne s'affichera pas. En effet, on ne peut pas afficher 2 lignes identiques. Comprenez bien, ce n'était pas vraiment fait pour ça ;)

 

Et enfin on attribue une valeur à chaque score:

p1.setScore(4);
server.setScore(3);
p2.setScore(2);
player.setScore(1);
p3.setScore(0);

C'est moche et c'est pas utile dans notre cas. Malheureusement, c'est obligatoire, donc on le fait. Du coup je me sers de ça pour afficher le nombre de ligne.

 

Maintenant afin d'afficher le ScoreBoard pour tous les joueurs, je fais:

for(Player po : Bukkit.getOnlinePlayers()) {
po.setScoreboard(board);

}

Cette boucle for va parcourir tous les joueurs en lignes et lui afficher le ScoreBoard.

Pour terminer, n'oubliez pas d'appeler la fonction updateBoard dans les listeners ! (quand un joueur se co et se déco)

 

Voici la fonction dans son intégralité:

public void updateBoard() {

p1 = objective.getScore(ChatColor.GRAY + "" + ChatColor.BOLD + "" 
                                +  ChatColor.STRIKETHROUGH + "                ");
server = objective.getScore("Serveur: " + ChatColor.GREEN + "WW1");
p2 = objective.getScore(" ");
player = objective.getScore("Joueurs: " + ChatColor.GREEN + online + "/12");
p3 = objective.getScore(ChatColor.GRAY + "" + ChatColor.BOLD + ""
                              +  ChatColor.STRIKETHROUGH + "                  ");

p1.setScore(4);
server.setScore(3);
p2.setScore(2);
player.setScore(1);
p3.setScore(0);

for(Player po : Bukkit.getOnlinePlayers()) {
po.setScoreboard(board);
}
}

 

Voila, vous savez tout !

Ce tutoriel est fait pour les personnes qui ont un minimum de connaissances en JAVA et dans le dev Bukkit. Donc si vous avez besoin d'aide, n'hésitez pas à utiliser l'AQS.

 

Good Luck !

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×

Information importante

By using this site, you agree to our Conditions d’utilisation.