Avoir des panneaux qui téléportent des joueurs
Dans cet article, je vais vous expliquer comment a l’aide d’un panneau exécuter une commande quand un joueur va cliquer sur le fameux panneau ou encore se téléporter vers un Warp ou encore un de vos Home.
Ce qui verra sans doute le sujet d’un tuto sur comment créer les commandes de Warp ou de Home, mais si vous savez faire un des deux vous savez faire l’autre.
Bien sûr on pourrait téléporter un joueur au clic sur un bloc avec n’importe quel bloc du jeu, mais c’est mieux avec les panneaux ;).
En gros, pour n’importe qu’elle bloc, il faudrait connaitre ça position qu’on sauvegarderait dans notre configuration. Puis à chaque clic, il faudrait vérifier si le joueur à cliqué sur un bloc se situant à la position du bloc sauvegardé et exécuter l’action en conséquence. Puis sans doute vérifier à chaque bloc cassé si il est dans la conf pour l’enlever de cette même conf…
Je trouve ça très très pénible pas vous ? À l’inverse avec les panneaux on n’a aucun besoin de tout ça, car on peut récupérer le texte du panneau directement sur celui si on clic d’un joueur dessus. Alors, pourquoi se priver ?
Avant toute chose il faut avoir une structure pour votre panneau, car on est quand même limité niveau texte. Moi pour me téléporter vers un home, j’ai choisi d’écrire mon panneau de cette façon:
Home nameHome Pseudo
Donc pour le home, on a déjà un mot clé qui est Home sur la première ligne, puis sur la seconde ligne le nom du Home. Ensuite sur la dernière ligne c’est le pseudo de la personne qui crée le panneau.
Telle que je vais vous le présenter pour créer un panneau Home, vous aurez juste à écrire le mot Home et le nom du Home.
Pour le pseudo, le plugin se chargera de l’écrire lui même. Donc ça sert à rien de l’écrire vous même ou de mettre un autre pseudo^^.
Pourquoi ? Pour éviter qu’une personne qui tape le texte lui même puisse se téléporter vers les Home d’une autre personne. Mais de toute façon on c’est impossible^^.
Pour le Warp:
Warp nameWarp
Là c’est pareil, on a déjà un mot clé qui est Warp sur la première ligne, puis sur la seconde ligne le nom du Warp ou on va téléporter le joueur.
Pour commencer, on va déjà utiliser l’Event qui détecte la pose de panneau, ça va nous permettre d’autoriser les caractères spéciaux comme &e pour écrire en couleur ou encore de mettre un peut de mise en forme sur nos panneaux pour signifier au joueur que ce n’est pas un panneau comme les autres^^.
Puis on utilisera un autre Event pour voir si le joueur clic sur un panneau…
Le code pour la création du panneau:
public void ChangeEvent(ChangeSignEvent event) { // Si c'est un player: if(event.getCause().first(Player.class).isPresent()) { // On le cast: Player player = event.getCause().first(Player.class).get(); // Le texte d'un panneau commence sur la ligne 0 pour la ligne 1, puis 1 pour la ligne 2... // On regarde si la ligne 1 n'est pas vide et si le texte contient le mot Home auqu'elle on applique la fonction trime pour enlever les eventuelles espaces qu'un joueur aurait pu mettre par erreur // Puis on regarde si la ligne 2 n'est pas vide: if(!event.getText().lines().get(0).isEmpty() && event.getText().lines().get(0).toPlain().trim().equals("Home") && !event.getText().lines().get(1).isEmpty()) { // On écrit sur la première ligne le mot Home en gras et en bleu foncé: event.getText().set(event.getText().lines().set(0, Text.of(TextStyles.BOLD, TextColors.DARK_BLUE, "Home"))); // On écrit sur la seconde ligne le nom du Home en bleu: event.getText().set(event.getText().lines().set(1, Text.of(TextColors.BLUE, event.getText().lines().get(1).toPlain()))); // Pour finir on écrit le pseudo du joueur qui à écrit le panneau sur la troisième ligne: event.getText().set(event.getText().lines().set(2, Text.of(player.getName()))); // Nouvelle condition pour tester si le joueur crée un panneau Warp: } else if(!event.getText().lines().get(0).isEmpty() && event.getText().lines().get(0).toPlain().trim().equals("Warp") && !event.getText().lines().get(1).isEmpty()) { event.getText().set(event.getText().lines().set(0, Text.of(TextStyles.BOLD, TextColors.DARK_BLUE, "Warp"))); event.getText().set(event.getText().lines().set(1, Text.of(TextColors.BLUE, event.getText().lines().get(1).toPlain()))); } else if(!event.getText().lines().get(0).isEmpty() && event.getText().lines().get(0).toPlain().trim().equals("AdminTool")) { event.getText().set(event.getText().lines().set(0, Text.of(TextStyles.BOLD, TextColors.DARK_RED, event.getText().lines().get(0).toPlain()))); } else { // Si aucune des condition à été remplie on boucle sur le texte du panneau et on lui revoie sont texte ce qui va permettre d'écrire du texte en couleur: int i = 0; for (Iterator<Text> lines = event.getText().lines().get().iterator(); lines.hasNext();) { Text line = lines.next(); event.getText().set(event.getText().lines().set(i, Text.of(TextUtils.color(line.toPlain())))); i++; } } } }
Il est assez commenté, donc ça devrait être assez claire pour vous.
Ensuite, ça va dépendre de votre Event. Est ce que vous voulez que le panneau marche qu’avec un clic gauche ou juste avec un clic droit ? ou les deux ?
Pour le clic gauche ça sera: InteractBlockEvent.Primary
Pour le clic droit: InteractBlockEvent.Secondary
Pour les deux ça sera l’Event: InteractBlockEvent.
Globalement le code est un peut pareil que celui du dessus:
Avec des conditions on vérifie si tout est réunie et si oui on exécute la méthode pour le type de panneau. Chaque panneau à ça méthode(Warp et Home) qui est dans le code de la commande correspondante, ça permet d’avoir moins de code surtout si on en à besoin à plusieurs endroit.
Le code au clic sur le panneau:
public void InteractBlockEvent(InteractBlockEvent event) { // Si c'est un player: if (event.getCause().first(Player.class).isPresent()) { // On le cast: Player player = event.getCause().first(Player.class).get(); if (event.getTargetBlock().getLocation().isPresent()) { Location<World> location = event.getTargetBlock().getLocation().get(); // Si le bloc cliqué est bien un panneau: if((location.getBlock().getType() == BlockTypes.STANDING_SIGN) || (location.getBlock().getType() == BlockTypes.WALL_SIGN)) { // On récup le texte du panneau cliqué: List<Text> line = location.getValue(Keys.SIGN_LINES).get().get(); // Si la ligne 1 n'est pas vide et vaut Warp et que la ligne 2 n'est pas vide: if((!line.get(0).isEmpty()) && line.get(0).toPlain().trim().equals("Warp") && !line.get(1).isEmpty()) { // Ensuite code basique, c'est une méthode qui utilise deux paramètres: le nom du warp pour récup ça position, le nom du monde... et le joueur. // Si il faut afficher un message d'erreur ou dire qu'il a bien été tp ça sera dedans. CommandWarp.teleportWarp(line.get(1).toPlain(), player); } // Même chose pour les Home: if(!line.get(0).isEmpty() && line.get(0).toPlain().trim().equals("Home") && !line.get(1).isEmpty() && !line.get(2).isEmpty()) { // Cette fois on vérifie en plus si le nom du joueur dans le panneau est le même que celui qui à cliqué dessus: if(line.get(2).toPlain().trim().equals(player.getName())) { // On exécute la commande: CommandHome.teleportHome(line.get(1).toPlain(), player); } else { player.sendMessage(Text.of(TextColors.RED, "Ce home ne t'appartient pas, il est à " + line.get(2).toPlain())); } } // Ici on exécute la commande tool: if(!line.get(0).isEmpty() && line.get(0).toPlain().trim().equals("AdminTool")) { //Ca implique de mettre le code de la commande dans une méthode pour pour l'executer sans devoir dupliquer le code: CommandTool.tool(player); } } } } }
Il manque plus qu’une chose, la méthode pour mettre le texte en couleur TextUtils.color():
public static Text color(String message) { return TextSerializers.formattingCode('&').deserialize(message); }
Vu que l’article parle des panneaux, je détaillerais pas le code des méthodes CommandHome.teleportHome() et CommandWarp.teleportWarp(), mais le principal est la.
Tous les codes sont testés et sont fonctionnels, si il arrive qu'un de ces codes ne fonctionne pas chez vous, merci de me le signaler.