Message populaire Nashoba Posté(e) le 26 mai 2016 Message populaire Posté(e) le 26 mai 2016 (modifié) Bonjour! Dans Skript, il y a quelques chose qui plutôt pratique, c'est de pouvoir attribuer une variable à un joueur, un uuid, un monde etc... Par exemple la variable {test.%player%} change à chaque joueur. Ou alors {test.%event-block%} change en fonction du bloc Et bien en Java c'est possible ? Dans ce tuto, je ne traiterai pas d'enregistrer ces variables dans des fichiers, ça je ferais peut-être plus tard dans un autre tuto. Ces variables s'appellent des HashMap. Un HashMap est constitué d'une clé (key) et d'une valeur (value). A chaque clé est associée une valeur. Une clé est une variable de n'importe quel type, mais c'est bien souvent un String. Si vous recherchez une variable dans le HashMap qui est identique à la clé, alors vous récupérerez la valeur associé. Les HashMaps permettent aussi d'enregistrer des variables temporairement, sans charger le fichier de sauvegarde à chaque fois car ça bouffe ÉNORMÉMENT de ressources de faire ça. Bon maintenant passons à la pratique! Pour retrouver l'utilité des variables de Skript, les HashMap doivent être déclaré juste après le "public class", avant toute fonction. Les HashMap contiennent deux type de variable, un pour la clé et un pour la valeur. Ces types de variables peuvent être différents ou les même, ce sera déterminé en fonction de ce que vous en ferez. Voila à quoi ressemble un HashMap: HashMap<String, Double> variable; Le String est donc le type de clé et le double est le type de la valeur associée. Voilà maintenant comment déclarer cette variable: public class Exemple extends JavaPlugin implements Listener { static HashMap<String, Double> missions = new HashMap<String, Double>(); @Override public void onEnable() { //CODE } } Vous pouvez changer le "static" en "public static" si vous voulez que cette variable puisse être lu par d'autres classe ou même enlever le "static" si vous n'utilisez pas de fonctions static. Maintenant on va apprendre à mettre et récupérer des infos de cette variable. Dans les exemples suivant, ma variable sera nommé "exemple". Si vous voulez mettre des joueurs ou d'autre choses en clé, je vous conseille de mettre un String, souvent avec le nom. Ça évite de charger des grosses variables comme les Player et les noms ne bougent pas. Voilà comment mettre une clé et une valeur: exemple.put(key, value); Et voici comment récupérer une valeur: exemple.get(key); Pour tester si le HashMap contient une clé: exemple.containsKey(key); Pour tester si le HashMap contient une valeur: exemple.containsValue(value); Pour finir un petit exemple. On enregistre ici une variable contenant un nombre de point d'un joueur. La clé est donc le nom du joueur et la valeur son nombre de points. public class Exemple extends JavaPlugin implements Listener { static HashMap<String, Integer> points = new HashMap<String, Integer>(); @Override public void onEnable() { } @EventHandler public void onJoin(PlayerJoinEvent e) { Integer pts = 1; //Normalement je charge de mon fichier de config mais là c'est un exemple points.put(e.getPlayer().getName(), pts); } } Maintenant imaginons qu'à sa déconnexion je sauvegarde ses points. J'utilise donc: public class Exemple extends JavaPlugin implements Listener { static HashMap<String, Integer> points = new HashMap<String, Integer>(); @Override public void onEnable() { } @EventHandler public void onLeave(PlayerQuitEvent e) { Player p = e.getPlayer(); //Je crée une variable pour raccourcir le code if(points.containsKey(p.getName())) { Integer pts = points.get(p.getName()); //Là j'utilise ma fonction pour sauvegarder les points } } } Voilà! Encore une fois j'espère avoir été assez clair et que ce tuto vous sera utile ? (un p'tit like ça fait toujours plaisir aussi :D) Et je vous invite à me demander sur quel thème voulez vous que mon prochain tuto soit ? Modifié le 4 janvier 2019 par Nashoba 9
Nashoba Posté(e) le 2 juin 2016 Auteur Posté(e) le 2 juin 2016 C'est mal expliqué sur certains points?
Protoxy Posté(e) le 2 juin 2016 Posté(e) le 2 juin 2016 Tu n'expliques pas vraiment les codes c'est tout. 1
Inerska Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Mais comment ont récupere le nom du joueur dans son code ( par exemple dans un broadcast)
Inerska Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Et pour l'utiliser par exemple dans un broadcast ? public class Commands implements Listener{ @EventHandler public void onCommands(PlayerCommandPreprocessEvent e){ Player p = e.getPlayer(); String msg = e.getMessage(); String[] args = msg.split(" "); if(args[1].equalsIgnoreCase("/broadcast")){ if(args[2] == null){ p.sendMessage("§cErreur : essaie /broadcast [message]"); p.getServer().broadcastMessage("&8[&6&lANNONCE&8] &bVous venez de faire un broadcast"); } } } Avec l'arg 1 Exemple skript: broadcast "annonce, %player%: %message% PS: Le message et le player en java je veut savoir
Nashoba Posté(e) le 11 décembre 2016 Auteur Posté(e) le 11 décembre 2016 Bukkit.getServer().broadcastMessage("annonce, " + e.getPlayer().getName() + ": " + message); Le message c'est toi qui choisis. Si c'est dans un évent chat tu peux le récupérer avec message = e.getMessage(); mais si c'est une commande tu peux le récupérer avec les arguments
Skripting Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Et pour l'utiliser par exemple dans un broadcast ? public class Commands implements Listener{ @EventHandler public void onCommands(PlayerCommandPreprocessEvent e){ Player p = e.getPlayer(); String msg = e.getMessage(); String[] args = msg.split(" "); if(args[1].equalsIgnoreCase("/broadcast")){ if(args[2] == null){ p.sendMessage("§cErreur : essaie /broadcast [message]"); p.getServer().broadcastMessage("&8[&6&lANNONCE&8] &bVous venez de faire un broadcast"); } } } Avec l'arg 1 Exemple skript: broadcast "annonce, %player%: %message% PS: Le message et le player en java je veut savoir CommandExecutor > CommandPrepocessEvent. C'est 100 fois mieux.
Inerska Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 package fr.pulpac.broadcast; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class CommandBroadcast implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command cmd, String msg, String[] args) { if(args.length == 0){ p.sendMessage("§cErreur: Vous avez oubliez votre message"); } if(args.length >= 1){ StringBuilder broadcast = new StringBuilder(""); for(String morceau : args){ broadcast.append(morceau); } Bukkit.broadcastMessage("§8[§6§lANNONCE§8] §c§b" + broadcast); } if(sender instanceof Player){ Player p = (Player)sender; } return false; } } Pour introduire le pseudo et l'arg ? Et j'ai un problème sur le p.sendMessage :/ je comprend pas
Skripting Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Et j'ai un problème sur le p.sendMessage :/ je comprend pas Normal tu n'as pas défini ta variable p. Essaye : sender.sendMessage(String); Si tu veux vraiment que ce soit un joueur, tu dois caster ta variable : if(sender instanceof Player){ # On vérifie que c'est un joueur. Player p = (Player) sender; # On créer une nouvelle variable locale en castant le sender en player.
Inerska Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Fix: Player p = (Player)sender; Export: jar creation failled JAR creation failed. See details for additional information. Class files on classpath not found or not accessible for: 'Broadcast/src/fr/pulpac/broadcast/CommandBroadcast.java'
Skripting Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Envoie ton Main + ton plugin.yml.
Inerska Posté(e) le 11 décembre 2016 Posté(e) le 11 décembre 2016 Mon plugin.yml: main: fr.pulpac.broadcast author: NeverAskMe, Pulpac name: broadcast version: 1.0 commands: broadcast: description: Permet d'afficher une annonce sur le serveur permission: annonce.use permission-message: §cVous n'avez pas la permission d'éxécuter cette commande. et le main: J'en ai pas
noftaly Posté(e) le 13 décembre 2016 Posté(e) le 13 décembre 2016 omfg xD c'est la que je suis content de faire du skript xD public class WolvMC extends JavaPlugin implements Listener { static HashMap<String, Integer> points = new HashMap<String, Integer>(); @Override public void onEnable() { } @EventHandler public void onJoin(PlayerJoinEvent e) { Integer pts = 1; //Normalement je charge de mon fichier de config mais là c'est un exemple points.put(e.getPlayer().getName(), pts); } } CONTRE on join: set {points.%player%} to 1 ya quand meme une énorme différence xD 1
PastequeBuild Posté(e) le 31 août 2017 Posté(e) le 31 août 2017 Excellent tuto ! J'ai deux petites question: - Comment modifier le nombre de points d'un joueur ? Par exemple, rajouter 1 au nombre de points qu'il a déjà ? - Lorsque tu transfère ta valeur hashmap sur une variable pour l'enregistrer, cette variable ne risque t-elle pas de changer dès qu'une autre valeur hashmap sera transférée sur celle-ci ? Merci professeur ! :p
angelus76 Posté(e) le 1 septembre 2017 Posté(e) le 1 septembre 2017 Merci pour les infos ;) Moi qui ais fait un add-on pour skript sans connaitre le JAVA, sa m'aurais bien aider de comprendre les tableau de cette maniere plutot que de fouiller les doc pour essayer de comprendre ce qu'il falais faire ^^
Nashoba Posté(e) le 1 septembre 2017 Auteur Posté(e) le 1 septembre 2017 Excellent tuto ! J'ai deux petites question: - Comment modifier le nombre de points d'un joueur ? Par exemple, rajouter 1 au nombre de points qu'il a déjà ? - Lorsque tu transfère ta valeur hashmap sur une variable pour l'enregistrer, cette variable ne risque t-elle pas de changer dès qu'une autre valeur hashmap sera transférée sur celle-ci ? Merci professeur ! :p Pour modifier le nombre de points, tu dois d'abord récupérer la variable du HashMap, ensuite tu la modifie et enfin tu la remet dans le HashMap: int p = poins.get(player.getName()); ++p; points.put(player.getName(), p); Pour la 2ème question je ne suis pas sûr d'avoir bien compris ^^
PastequeBuild Posté(e) le 2 septembre 2017 Posté(e) le 2 septembre 2017 Merci ! Pour la 2ème question: @EventHandler public void onLeave(PlayerQuitEvent e) { Player p = e.getPlayer(); //Je crée une variable pour raccourcir le code if(points.containsKey(p.getName())) { Integer pts = points.get(p.getName()); //Là j'utilise ma fonction pour sauvegarder les points } } } La variable pts change à chaque fois qu'on sauvegarde les points d'un joueur, et c'est une variable unique (ce n'est pas une liste). Après avoir sauvegardé les points d'un joueur A, ce dernier ne risque t-il pas d'avoir les points du dernier joueur (joueur B) à qui on a sauvegardé les points juste après ? La variable pts ne peut contenir qu'une seule valeur et elle est utilisée à chaque sauvegarde...
Nashoba Posté(e) le 2 septembre 2017 Auteur Posté(e) le 2 septembre 2017 Non c'est une variable locale. Elle est déclarée dans la fonction et sera effacée à la fin de la fonction. Et imaginons que l’événement se passe en même temps il n'y aura pas de conflit de variable. Cette variable est l'équivalent de {_variable} en skript.
PastequeBuild Posté(e) le 2 septembre 2017 Posté(e) le 2 septembre 2017 D'accord, mais alors comment récupérer ses points de la dernière fois lorsqu'on se connecte si c'est une variable temporelle ? Comment ces points sont stockés ? Et si on la définit lorsqu'un joueur se connecte... Integer pts = 1; ...juste avant de la mettre dans une hashmap... points.put(e.getPlayer().getName(), pts); ...le nombre de points du joueur sera remplacé par 1, non ? Merci pour tes réponses ! :D (je suis embêtant, hein ^^)
Nashoba Posté(e) le 2 septembre 2017 Auteur Posté(e) le 2 septembre 2017 Pour les stocker il faut utiliser un fichier, par exemple un .yml. Pour le Integer pts = 1 c'était juste pour dire que c'est à cet endroit qu'il faut charger les points, sinon bien sûr ce sera 1 ^^.
PastequeBuild Posté(e) le 2 septembre 2017 Posté(e) le 2 septembre 2017 D'accord ! Merci beaucoup pour ton aide :D
Inerska Posté(e) le 4 octobre 2017 Posté(e) le 4 octobre 2017 Le tuto est bien avec une bonne intention surement, mais c'est assez compliqué à comprendre /:
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant