1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

[TUTO] Créer votre propre plugin

Discussion dans 'Bukkit' démarrée par Jesus_Crie, 23 Avril 2016.

?

Quel(s) parties devrai-je rajouter ?

  1. Les listeners

  2. Les inventaires

  3. Utilisez de l'argent (Vault)

  4. Faire apparaitre un schematic (WorldEdit)

Les résultats sont uniquement visibles après avoir voté.
  1. Jesus_Crie
    Offline

    Jesus_Crie Lord Of The Holy Land Ancien Staff

    Inscrit depuis le :
    8 Novembre 2015
    Messages :
    212
    "J'aime" reçus :
    68
    Points de Trophée :
    28
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Bonjour,

    Je m'excuse déjà pour mes fautes de français et/ou d'orthographe.
    Ce tutoriel va vous apprendre à coder la base d'un plugin Bukkit mais je rajouterais probablement des parties au fur et à mesure.
    Je le dit de suite, je vais sauter toute la partie création du projet, installation d’éclipse, ect. Je vous conseille donc ce tutoriel pour cette partie.
    Ce tutoriel ne s'adresse pas à des débutants en programmation.

    Obtenir l'api de Bukkit

    Pour pouvoir faire un plugin Bukkit il nous faudra forcément son API.
    Vous allez devoir installer Git et télécharger BuldTools.jar.
    Placer ce dernier dans un dossier VIDE.

    Faite un clic droit sur ce dossier puis "Git bash here", si vous ne l'avez pas vous n'avez pas installer Git.
    Ecrivez ensuite dans la console qui s'est ouverte ceci :
    Code:
    java -jar BuildTools.jar --rev 1.8.8
    Remplacer 1.8.8 par la version voulue de bukkit.
    Si ça ne fonctionne pas remplacez "java" par l'emplacement de votre java.

    L'opération met un peu de temps.
    Une fois terminer votre dossier contenant BuildTools.jar devrez être plein d'autre dossiers.
    L'Api de Bukkit se trouve dans Bukkit/target/bukkit-[votre version].jar .
    Il y a une version shaded, ignorez la, je ne sais pas à quoi elle sert.

    Importez maintenant le jar dans votre projet, vous pouvez également importez le jar de craftbukkit car il est possible que vous ayez une erreur sans celui-ci.

    Création des classes + plugin.yml

    Dans cette partie nous allons créer des classes pour la suite mais avant cela vous devez créer un package dans le dossier "src", si vous avez un nom de domaine vous pouvez l'utiliser (pour le nom de domaine "exemple.com" le package sera "com.exemple.<nomduplugin>" par exemple). Si vous n'en avez pas utilisez votre pseudo "me.<votrePseudo>".
    En AUCUN cas votre package doit commencer par :
    • com.bukkit
    • net.bukkit
    • org.bukkit
    • net.minecraft
    Une fois que vous avez mis votre nom de domaine ou votre pseudo la suite du nom du package n'a pas d'importance.

    La classe principale

    C'est cette classe que bukkit va charger au lancement de votre serveur c'est donc le cœur de cotre plugin, je l'ai donc appelé "Core" mais vous pouvez lui donner le nom que vous voulez.
    Cette classe doit contenir les fonctions onEnable et onDisable et étendre la classe JavaPlugin :
    PHP:
    package <votre package>;

    import org.bukkit.plugin.java.JavaPlugin;

    public class 
    Core extends JavaPlugin {

        @
    Override
        
    public void onEnable() {
        
        }

        @
    Override
        
    public void onDisable() {
        
        }
    }
    onEnable() sera appelée au lancement du serveur et onDisable() lorsque le serveur s'éteint.
    Nous allons la laissez de côté un instant pour créer la classe qui gérera les commandes.

    La classe des commandes

    Cette classe contiendra le code pour nos futures commandes.
    Cette classe doit implémenter CommandExecutor et doit avoir la fonction onCommand comme ceci :
    PHP:
    package ovh.isreborn.jesus_crie.tuto;

    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;

    public class 
    TutoCommand implements CommandExecutor {

        @
    Override
        
    public boolean onCommand(CommandSender senderCommand cmdString labelString[] args) {
            
    // TODO Auto-generated method stub
            
    return false;
        }

    }
    La fonction onCommand a 4 arguments :
    • sender correspond à qui a effectué la commande, en général c'est un joueur ou la console.
    • cmd est le nom de la commande qui a été taper, ce qu'il y a juste après le /.
    • label est l’alias utilisé (Par exemple "gm" est l’alias de "gamemode").
    • args contient tout les arguments de la commande tapée. Le premier argument n'est pas args[1] mais args[0].

    Pour pouvoir accéder à la classe principale depuis celle-ci, nous allons créer un constructor comme ceci juste après la déclaration de la classe :
    PHP:
    private Core plugin;
    public 
    TutoCommand (Core plugin) {
        
    this.plugin plugin;
    }
    et dans la classe principale :
    PHP:
        public TutoCommand cmd;

        @
    Override
        
    public void onEnable() {
            
    cmd = new TutoCommand(this);
        }

        @
    Override
        
    public void onDisable() {
            
    cmd null;
        }
    La classe des Listeners

    Les listeners vont nous permettre de détecter tout un tas d'actions effectuées en temps réel sur le serveur comme un joueur qui se connecte ou quand l'on clique dans son un inventaire par exemple.
    Cette classe doit implémenter Listener :
    PHP:
    package ovh.isreborn.jesus_crie.tuto;

    import org.bukkit.event.Listener;

    public class 
    TutoListener implements Listener {

        private 
    Core plugin;
        public 
    TutoListener (Core plugin) {
            
    this.plugin plugin;
        }
    }
    Notez que j'ai réutilisé exactement le même constructeur que pour la classe des commandes.

    Les listeners ont besoin d'être enregistrez dans la classe principale dans onEnable comme ceci :
    PHP:
    @Override
    public void onEnable() {
        
    Bukkit.getPluginManager().registerEvents(new TutoListener(this), this);
    }
    Voila nous en avons maintenant fini avec la création des classes passons au plugin.yml.

    Plugin.yml

    Créer ce fichier dans la dossier "src" de votre projet, il ne doit pas être dans le package de vos classes.
    Je vais utiliser ce plugin.yml :
    Code:
    name: PluginTuto
    version: 1.0
    main: ovh.isreborn.jesus_crie.tuto.Core
    description: Plugin tutoriel
    
    commands:
      tutoriel:
        description: Commande tutoriel
        usage: /<command>
        aliases:
        - tuto
    
    permissions:
      tuto.main:
        default: op
    Explications :
    • name : C'est le nom de votre plugin.
    • version : C'est la version de votre plugin.
    • main : Le chemin de votre classe principale
    • commands : Contient toutes les commandes du plugin, si vous n'avez pas de commandes il est inutile de le mettre.
    • tutoriel : Le nom de la commande, dans ce cas /tutoriel.
    • description : La description de votre commande, visible dans le /help
    • usage : Comment doit s'utiliser votre commande, peut utile. <command> sera remplacer par la commande.
    • aliases : Une liste contenant tous les alias d'une commande.
    • permission : Contient toutes les permissions.
    • tuto.main : Node de la permission.
    • default : Peut être "false, true, op, not op", true tout le monde a cette permission, false personne ne l'a, op seul les op l'ont, not op tout le monde l'a sauf les op.
    Si vous voulez plus d'informations sur le plugin.yml je vous invite à visiter ce site.

    Les commandes

    Nous allons créer 2 commandes : une très simple qui enverra au joueur un message et une beaucoup plus complexe qui fera apparaître un texte flottant.

    Notre première commande aura pour but de nous envoyer un message comme ceci :
    Bonjour <pseudo du joueur>.
    Ce sera la commande /tutoriel
    Vous avouerez qu'il est difficile de faire plus simple.

    En premier nous allons récupérer la commande dans la fonction onEnable() de notre classe principale de cette manière en l'associant à notre classe de commandes :
    PHP:
    getCommand("tutoriel").setExecutor(cmd);
    Une fois cela fait nous ne nous occuperons plus de la classe principale mais de la classe gérant les commandes.
    Normalement vous avez déjà créer la fonction onCommand sinon revenez plus haut au moment où l'on a créer cette classe.

    Pour notre plugin, nous ne voulons pas que la console puisse taper une de nos commande nous allons donc vérifier ceci en premier :
    PHP:
    if (sender instanceof ConsoleCommandSender) {

                
    sender.sendMessage(ChatColor.RED "La console ne peut pas taper cette commande !");
                return 
    true;
            }
    La classe ChatColor nous permet de colorer les messages, vous pouvez également utiliser le symbole "§" dans le message.
    Par sécurité nous allons vérifier que "sender" est un joueur pour pouvoir créer notre variable player :
    PHP:
            if (sender instanceof ConsoleCommandSender) {

                
    sender.sendMessage(ChatColor.RED "La console ne peut pas taper cette commande !");
                return 
    true;
            } else if (
    sender instanceof Player) {
                
    Player p = (Playersender;
                
    //Notre code
                
    return true;
            }
    Maintenant nous allons regarder si notre commande a été tapée :
    PHP:
                if (cmd.getName().equalsIgnoreCase("tutoriel")) {

                    
    //code
                    
    return true;
                }
    Le equalIgnoreCase permet de faire en sorte que TutORIel et tUToriEL soit tous les deux justes.

    Maintenant nous allons vérifier si'il a la permission puis lui envoyer le message :
    PHP:
                if (cmd.getName().equalsIgnoreCase("tutoriel")) {
                    if (
    p.hasPermission("tuto.main")) {
                        
    p.sendMessage(ChatColor.GREEN "Bonjour " p.getName());
                    }
                    return 
    true;
                }
    Vous pouvez compiler votre plugin pour essayer.
    Pour cela fait un clic droit sur votre projet puis export, sélectionnez "Java" puis "JAR File" et exporter le dans votre dossier plugin de votre serveur.

    Maintenant passons à la deuxième commande, créer un texte flottant.
    Contrairement à la précédentes commande, celle-ci utilise beaucoup plus de choses donc accrochez vous.

    Notre commande s’appellera "floattxt", nous allons commencer par l'écrire dans notre plugin.yml :
    Code:
      floattxt:
        description: Fait un texte flottant
        usage: /<command>
    Dans notre classe principale :
    PHP:
        @Override
        
    public void onEnable() {
            
    cmd = new TutoCommand(this);
            
    getCommand("floattxt").setExecutor(cmd);
        }
    et dans la classe que nous utilisons pour les commandes après notre commande précédente :
    PHP:
                if (cmd.getName().equalsIgnoreCase("floattxt")) {
                    if (
    p.hasPermission("tuto.main")) {
                        
    //code
                    
    }
                    return 
    true;
                }
    Nous allons maintenant récupérer le texte que nous allons mettre à l’intérieur qui sera tous les arguments de notre commande :
    PHP:
                        //On crée et initialise notre variable.
                        
    String name args[0];
                        
    //on crée une boucle avec tout les arguments
                        
    for (String str args) {
                            
    //On passe le 1er car il y est déjà
                            
    if (str == args[0])
                                continue;
                            
    name name " " str;
                        }
    Notre texte flottant sera en réalité une Armor Stand renommée et invisible, nous allons la créée et modifier ces attributs :
    PHP:
                        //On crée notre entité dans le monde
                        
    Entity en p.getWorld().spawnEntity(p.getLocation(), EntityType.ARMOR_STAND);
                        
    //On lui donne son nom et on le rend visible
                        
    en.setCustomName(ChatColor.translateAlternateColorCodes('&'name)); //ChatColor.translateAlternateColorCodes sert à pouvoir utiliser les codes couleur dans le nom
                        
    en.setCustomNameVisible(true);
                        
    //Nous allons transformer l'entitée en ArmorStand et lui donner quelques attributs supplémentaire :
                        
    ArmorStand as = (ArmorStanden;
                        as.
    setBasePlate(false);
                        as.
    setVisible(false);
                        as.
    setGravity(false);
                        as.
    setSmall(false); //Pour qu'on ne puisse pas la frapper
    Voila nous avons créer une autre commande faisant apparaître un texte flottant là où vous vous tenez.
    Pour le supprimer la seule solution est de se mettre dessus et de taper cette commande : /minecraft:kill @e[r=2,type=ArmorStand]
    [​IMG]


    Le code complet :

    Si vous avez aimer ce topic et que vous en voulez plus voter en haut du topic pour la partie que vous voudriez voir apparaître !
     
    • Like Like x 3
    Dernière édition: 21 Septembre 2016
  2. Clyese
    Offline

    Clyese Administrateur Membre de l'équipe Administrateur Graphiste

    Inscrit depuis le :
    18 Octobre 2015
    Messages :
    539
    "J'aime" reçus :
    110
    Points de Trophée :
    43
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Salut,
    Super tutoriel, bien expliqué et très bien présenté. Félicitation ! Continu comme ça :D
     
    • Like Like x 1
  3. Oxytomire
    Offline

    Oxytomire Novice Premium

    Inscrit depuis le :
    22 Avril 2016
    Messages :
    3
    "J'aime" reçus :
    3
    Points de Trophée :
    3
    Sexe :
    Masculin
    Hey,
    Super tutoriel, même si je trouve que tu ne parles pas assez des Events, les gens qui ne connaissent pas pourrez être perdus.
    Mais c'est quand même un super tutoriel. ;)
     
    • Like Like x 2
  4. Jesus_Crie
    Offline

    Jesus_Crie Lord Of The Holy Land Ancien Staff

    Inscrit depuis le :
    8 Novembre 2015
    Messages :
    212
    "J'aime" reçus :
    68
    Points de Trophée :
    28
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Merci beaucoup !
    J'ai prévu d'écrire sur les évents mais le tuto était déjà long.
    Je ferais peut être un topic uniquement là dessus, en plus j'ai un super exemple à mettre dedans.
     
    • Like Like x 2
  5. ph1823
    Offline

    ph1823 Protector of The Realm

    Inscrit depuis le :
    10 Novembre 2015
    Messages :
    65
    "J'aime" reçus :
    9
    Points de Trophée :
    8
    Sexe :
    Masculin
    Je dite : "
    PHP:
                        //On crée et initialise notre variable.
                        
    String name args[0];
                        
    //on crée une boucle avec tout les arguments
                        
    for (String str args) {
                            
    //On passe le 1er car il y est déjà
                            
    if (str == args[0])
                                continue;
                            
    name name str;
                        }
    Notre texte flottant sera en rélalité une Armor Stand renommée et invisible, nous allons la créée et modifier ces attributs : "
    Pour mettre String name = args[0]; puis voir tout les args ?
    Personnellement, je fairais directement la vérification args != args[0] , enfin après c'est mon avis, si non super Tuto ^^
     
  6. Jesus_Crie
    Offline

    Jesus_Crie Lord Of The Holy Land Ancien Staff

    Inscrit depuis le :
    8 Novembre 2015
    Messages :
    212
    "J'aime" reçus :
    68
    Points de Trophée :
    28
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Args est un array (ou une list je sais plus) et args[0] un string on ne peux pas les comparer

    Par contre dans ce morceaux de code il y a un oubli de ma part il faut modifier
    PHP:
    name name str;
    En :
    PHP:
    name name " " str;
    Sinon il n'y aura pas d'espaces.
     
    • Like Like x 1
  7. Oxytomire
    Offline

    Oxytomire Novice Premium

    Inscrit depuis le :
    22 Avril 2016
    Messages :
    3
    "J'aime" reçus :
    3
    Points de Trophée :
    3
    Sexe :
    Masculin
    args est un tableau, mais dans l'utilisation qu'en fait les plugins ils aurait très bien pu faire une liste ;)
     
  8. Jesus_Crie
    Offline

    Jesus_Crie Lord Of The Holy Land Ancien Staff

    Inscrit depuis le :
    8 Novembre 2015
    Messages :
    212
    "J'aime" reçus :
    68
    Points de Trophée :
    28
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Cela ne change rien au faite que l on ne peut pas les comparer mais merci de l'info =)
     
  9. | Clément |
    Offline

    | Clément | Les plugins ne mentent jamais

    Inscrit depuis le :
    8 Août 2016
    Messages :
    10
    "J'aime" reçus :
    0
    Points de Trophée :
    1
    Sexe :
    Masculin
    Je déterre un peu le sujet, mais merci pour ce tutoriel, il va sûrement bien m'aider pour mes projets future !
     
  10. Jesus_Crie
    Offline

    Jesus_Crie Lord Of The Holy Land Ancien Staff

    Inscrit depuis le :
    8 Novembre 2015
    Messages :
    212
    "J'aime" reçus :
    68
    Points de Trophée :
    28
    Sexe :
    Masculin
    Lieu de résidence :
    France
    Page d'accueil :
    Merci ^^
    Si tu a besoin d aide n hésite pas à me contacter ^^
     
    • Like Like x 1

Partager cette page

Utilisateurs qui regardent actuellement cette discussion : 0 membre(s) et 0 visiteur(s)