Elikill

Développeur Java trop occupé
23 Février 2014
1 387
204
187
23
eliapp.fr
Bonjour,
Ce sujet est pricipalement reservé aux développeurs, mais bon, j'aimerais l'avis de tout le monde.

Et donc voici quelques méthodes, bouts de code, pouvant vous aider dans le long chemin du développement d'un plugin (ou même en java sans API).

Pour vérifier que l'argument donné est bien valide (chiffre/joueur valide) :

Dans votre commande il y a un argument qui doit être un chiffre et rien d'autres ?
Alors il vous faut une méthode pour vérifier que c'est bien un chiffre.

Code:
public static boolean isInteger(String arg){  //boolean pour savoir si c'est vrai ou faux
    try { // on essaie de passer "arg" en chiffre (int)
        int i = Integer.parseInt(arg); 
        return true;  //si on reussi on retourne que c'est vrai, c'est bien un chiffre
    } catch (Exception e) {
        //pas de e.printStackTrace(); car sinon il y aura des erreurs dans la console pour rien, c'est justement pour éviter ça que l'on fait cette méthode
        return false; //sinon ce n'est pas un chiffre, donc la personne n'a pas fait une bonne commande
    }
}

Maintenant vous voulez envoyer un message a un joueur en fonction de la commande, mais pour éviter de recevoir plein d'erreur dans la console comme quoi ce joueur est invalide vous voulez verifier qu'il existe ?

Code:
public static boolean isValidPlayer(String namePlayer){//comme au dessus, un return un boolean aussi
   for(Player p : Bukkit.getOnlinePlayers()){ // une boucle de la liste des joueurs en ligne
     if(p.getName().equalsIgnoreCase(namePlayer)){ //faites attention que namePlayer sois bien le nom du joueur, pas son surnom ou autre chose ...
           return true;
      } else {
           continue;
       }
   }
   return false; //Si aucun des joueurs en ligne n'a retourné "true" c'est que ce n'est pas un vrai joueur, ou il est déco, donc la boucle s'arrête et la suite s'execute.
}

Un peut de packet (NMS) :

Header / Footer :

Vous voulez envoyé des messages custom dans la player list ? (au dessus et en dessous)
(Note : header = ligne du dessus, footer = ligne de dessous)

Code:
public static void sendHeader(Player p, String header){
    CraftPlayer cp = (CraftPlayer) p; // on récupere le craftplayer, et non le player, car c'est du NMS
    PlayerConnection connection = cp.getHandle().playerConnection; // on récupere sa connection
    IChatBaseComponent JSONheader = IChatBaseComponent.ChatSerializer.a("{\"text\": \"" + header + "\"}");
    PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(); // on créé les packets
    try {
        Field hfield = packet.getClass().getDeclaredField("a"); // remplacer "a" par "b" pour la ligne du dessous
        hfield.setAccessible(true);
        hfield.set(packet, JSONheader);
    } catch(Exception e){
        e.printStackTrace();
    }
    connection.sendPacket(packet); // on envoie les packets créé
}

Maintenant vous faites un UHC, et vous voulez envoyer le temps restant dans la ligne juste au dessus de la barre d'inventaire comme là (non ce n'est pas de la pub) :


Code:
public static void sendActionBar(Player p, String actionbar){
    IChatBaseComponent actionBarComp = ChatSerializer.a("{\"text\": \"" + actionbar + "\"}"); //Comme pour les header/footer on fait une nouvelle variable IChatBaseComponent 
    PacketPlayOutChat actionBarPacket = new PacketPlayOutChat(actionBarComp, (byte)2); // on créé les packets
    ((CraftPlayer) p).getHandle().playerConnection.sendPacket(actionBarPacket);
    //Par rapport au header/footer on a simplifier l'envoie des packets (on a fusionner la ligne pour récuperer la connection et celle pour envoyer les packets) mais ça fait exactement la même chose
}

Vous voulez d'autres méthodes ? Plus d'explications ? De l'aide car vous avez un problème ?
Dites le en répondant juste en dessous !

En esperant vous avoir aidé.