Votez pour ce serveur
Tous les jours sur :

serveurs Minecraft




Cliquez pour découvrir...




... et bien d'autres

short-url : #1 20 May 2011 10:31

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

[Tuto Obsolete] Créez votre premier plugin pour bukkit

Si vous souhaitez diffuser ce tutoriel je vous demande juste la gentillesse de me citer.

TUTO OBSOLETE


Créez votre premier plugin

Pour ceux parmi vous ayant des connaissances en Java ou langage orienté objet et avec l'envie de créer votre propre mod je vous propose un tutoriel imagé pour vous aider à démarrer.

Sommaire

  1. Les pré-requis

  2. Concepts essentiels

  3. Création d'un nouveau projet dans Eclipse

  4. La classe principale, celle qui hérite de JavaPlugin de bukkit

  5. Les listeners, ceux qui sont à l'écoute des événements captés et agissent

  6. Le fichier plugin.yml indispensables références pour votre mod

  7. Générer le .jar exploitable de votre mod

  8. Une meilleure gestion des commandes utilisateurs

  9. Et pourquoi avoir créé le package net.thgbm.forum.Utils ?

  10. à venir

  11. à venir

Bien démarrer

Avant de démarrer il faut savoir où l'on va.
Vous devez avoir déjà une idée précise de ce que va faire votre mod, pas forcément comment il va le faire mais au moins connaître ses objectifs.

Notre projet Hello

Je vous propose un projet basique pour tenter de voir ensemble comment démarrer un mod.
Ce que mon mod doit faire :

  • le serveur doit me saluer lorsque je me connecte

  • quand je tape la commande '/salut' je veux que le serveur me salut de nouveau

  • lorsque que je casse un block je veux que le serveur m'en informe

Cet exemple plutôt basique et sans grand intérêt dans le jeu va nous permettre de voir les 2 grandes familles d’événements:
le blockListener et le playerListener

Ce ne sont pas les seules mais les principales donc, après tout dépend de ce que doit faire votre mod.

Dernière modification par boozaa (21 May 2011 11:49)

Hors ligne

short-url : #2 20 May 2011 10:32

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Les pré-requis


emblem-important.pngIMPORTANT
Java ne s'invente pas alors si vous n'avez pas déjà programmé sous ce langage ou un langage orienté objet je vous invite avant tout à vous former

  • pour votre confort choisissez une IDE, pour ma part j'utilise Eclipse

  • sauvegardez l'API de bukkit dans un endroit sûr.
    Vous devrez y faire référence dans tous vos projets de mods, cette API vous permettra d’accéder et d'agir sur les événements du serveur bukkit.


icon_attention.gifPremiers avertissements

  • Le .jar de l'API ne doit pas être confondu avec le .jar de bukkit !

  • Une mise à jour de minecraft nécessite la mise à jour de bukkit server qui peut entraîner la mise à jour de l'API, veillez à toujours utiliser la dernière version de l'API donc !

Dernière modification par boozaa (20 May 2011 10:39)

Hors ligne

short-url : #3 20 May 2011 10:33

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Concepts essentiels

Petit rappel sur les packages java

Un package Java, par exemple net.thgbm.forum se retranscrits dans l'archive .jar comme une arborescence de dossier, ce qui nous donne pour cet exemple la structure de dossier suivante :

- net
    - thgbm
        - forum

Gardez bien cela en mémoire pour vous permettre de bien 'ranger' vos futures classes, interface & co.
Je vous donne un exemple concret : dans ce package j'ai plusieurs fonctions qui envoi des messages customisés, un message en rouge pour un joueur précis, un message pour tout le monde etc..
Pour bien les ranger vous pouvez les mettre dans le package, par exemple, net.thgbm.forum.utils.message à coté des fonctions qui travaillent sur les strings par exemple net.thgbm.forum.utils.string, cela vous donnera une arborescence de ce genre :

- net
    - thgbm
        - forum
            - utils
                - message
                - string

Pensez donc à bien structurer votre code pour bien 'ranger'.

Les événements

On peut interagir grâce aux mods sur différents aspects du serveur.
On peut créer une action lors d'un clic sur un block, lors de la destruction d'un block, lors de l’arrivée sur le serveur d'un joueur ... et j'en passe ..

Ces actions sur lesquelles on peut agir sont en fait des événements. Pour pouvoir les modifier ou ajouter de nouvelles fonctions dés qu'un de ces événements intervient il vous faut les 'capter'.
Vous verrez que l'un des intérêts de travailler avec une IDE c'est qu'elle vous listera pour cet exemple tous les événements disponibles dans l'API.

Dernière modification par boozaa (20 May 2011 10:56)

Hors ligne

short-url : #4 20 May 2011 10:35

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Création d'un nouveau projet dans Eclipse

Vous avez les pré-requis alors on peut se lancer.

Aprés avoir démarré votre Eclipse allez dans le menu 'File' -> 'New' -> 'Java Project'.

Vous devez arriver à une fenêtre comme celle ci :
01.png

Dans 'Project name' vous indiquez le nom de votre projet. Pour notre exemple il va donc s'appeler 'Hello'. On va se contenter de cela, cliquez donc sur 'Finish'.


Ajoutez la référence de l'API bukkit

Votre projet étant créé vous le voyez apparaître dans l'onglet 'Package explorer' de Eclipse
02.png

Vous vous rappelez que vous avez téléchargé le .jar de l'API de bukkit. Maintenant il vous faut la référencer dans votre projet.
Pour cela faites un clic droit sur le nom du projet 'Hello'.
Choisissez 'Properties'.
Allez dans menu 'Java build path'.
Dans l'onglet 'Libraries' vous verrez les librairies référencées pour ce projet. C'est ici que vous allez ajouter l'API en cliquant sur le bouton 'Add external JAR' et en allant chercher le fichier .jar que vous avez téléchargé tout à l'heure.

03.png

Création de notre premier package

Notre package sera pour l'exemple : 'net.thgbm.forum.Hello', alors cliquez droit sur le projet 'Hello' et choissisez 'New' -> 'Package'.
04.png

Refaites la même manip pour vous familiariser au 'rangement' pour le package 'net.thgbm.forum.Listeners'.

Allez pour vous entraîner refaites la encore une fois pour le package 'net.thgbm.forum.Utils' dans lequel on y rangera nos fonctions.

Dernière modification par boozaa (20 May 2011 14:29)

Hors ligne

short-url : #5 20 May 2011 10:36

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

La classe principale, celle qui hérite de JavaPlugin de bukkit

Maintenant que nos packages principaux sont faits on va s'attaquer à notre première classe.
Cette classe va hériter de JavaPlugin de bukkit pour pouvoir accéder à tout ce dont on a besoin dans notre mod.

Création de notre classe Hello

Faites un clic droit sur le package 'net.thgbm.forum.Hello' et choisissez 'New' -> 'Class'.
05.png

Dans la fenêtre de création assisté de Classe vous avez juste à préciser le nom de la classe à créer : Hello et valider en cliquant sur 'Finish'.

Notre fichier Hello

Notre fichier s'ouvre donc et vous voyez le code minimal généré par Eclipse

package net.thgbm.forum.Hello;

public class Hello {

}

Dans ce code nous allons commencer par importer le nécessaire pour notre classe et hériter de JavaPlugin en modifiant le fichier comme suit :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {

}

Vous avez du remarquer que votre Eclipse vous signale des erreurs ou des avertissements. Comme vous venez d'hériter de JavaPlugin il vous faut obligatoirement définir 2 fonctions qui sont :
onEnable() et onDisable()

Ces deux fonctions sont les 'accroches' au serveur.
onEnable() là bukkit server démarre votre mod, c'est ici que vous allez démarrer votre application et également informer dans la console que votre mod a bien démarré.

onDisable() ici ce sera tout le ménage à faire lorsque votre mod s'arrète.

Ceci étant dit modifiez votre fichier en y ajoutant ces 2 fonctions :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {

    @Override
    public void onEnable() 
    { 
        registerEvents();
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " started" );
    }

    @Override
    public void onDisable()
    {
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " stopped" );
    }

}

Dans le onEnable() vous avez certainement remarqué que j'appele une autre fonction qui est registerEvents(). Cette fonction va attacher les évenements serveur souhaités pour pouvoir les récupérer quand activés et ajouter nos modifications.

Notre registerEvents()

Voila la partie qui nécessite le plus de connaître les finalités de notre mod.
Pour rappel, je crée ce mod pour :
- me saluer quand je me connecte
- à nouveau me saluer lorsque je lance la commande '/salut'
- et me dire lorsque je casse un bloc

Les événements à capter pour cela sont donc respectivement :
- Event.Type.PLAYER_JOIN
- Event.Type.PLAYER_INTERACT
- Event.Type.BLOCK_DAMAGE

Vous remarquerez donc que 2 de ces 3 types d’événements sont PLAYER et un BLOCK. On revient à ce que je vous disais au début de ce tuto et on voit là nos 2 familles d’événements principaux le blockListener et le playerListener.

Nous allons donc ajouter à notre code le nécessaire pour capter ces 3 types d’événements.


Nous saluer lorsqu'on tape /salut

Voici maintenant le code pour que le serveur nous salut sur demande:

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){    
    // On recupere le joueur qui a lancé la commande
    Player player = (Player) sender;
    // Si cette commande est '/salut'
    if(commandLabel.equalsIgnoreCase("salut")){ 
        player.sendMessage(    player.getName() + ", salut à toi encore une fois." );
        return true;
    }else{
        return false;
    }
}

Le code ressemblera à cela :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {


    // BlockListener
    private final HelloBlockListener blockListener = new HelloBlockListener(this);
    // PlayerListener
    private final HelloPlayerListener playerListener = new HelloPlayerListener(this);
    
    /**
     * Capture des events nécessaires
     */
    private void registerEvents() {
        PluginManager pm = getServer().getPluginManager();
        /* Block events */
        pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this);
        /* Player events */
        pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
        pm.registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Normal, this);
    }

    @Override
    public void onEnable() 
    { 
        registerEvents();
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " started" );
    }

    @Override
    public void onDisable()
    {
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " stopped" );
    }

    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){    
        // On recupere le joueur qui a lancé la commande
        Player player = (Player) sender;
        // Si cette commande est '/salut'
        if(commandLabel.equalsIgnoreCase("salut")){ 
            player.sendMessage(    player.getName() + ", salut à toi encore une fois." );
            return true;
        }
        return false;
    }


}

Cette méthode onCommand() permet de lancer des actions donc sur des commandes lancées dans le tchat.

Pour notre projet cela est suffisant. Dans le code vous voyez que je déclare 2 Listeners : HelloBlockListener et HelloPlayerListener : ce sont nos Listeners qui va falloir créer et qui feront le boulot qu'il reste.

Dernière modification par boozaa (21 May 2011 12:57)

Hors ligne

short-url : #6 20 May 2011 10:37

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Les listeners, ceux qui sont à l'écoute des événements captés et agissent

Dans notre classe principale Hello nous avons précisé que nous voulons recevoir les événements PLAYER_JOIN, PLAYER_INTERACT et BLOCK_DAMAGE pour pouvoir ajouter nos modifications.

Ces événements peuvent être captés par 2 types de listener : blockListener et playerListener dont il va falloir hériter.

Notre listener qui se chargera des événements de type PLAYER a été déclaré dans Hello comme HelloPlayerListener et celui qui s'occupera de ceux de type BLOCK est déclaré comme HelloBlockListener.

HelloPlayerListener

Comme nous avons créé notre package pour les listeners au début nous allons créer notre classe en faisant un clic droit sur le package 'net.thgbm.forum.Listeners' et en choisissant 'New' -> 'Class'.
Dans la fenêtre de création de classe indiquez juste le nom de notre classe : HelloPlayerListener et validez en cliquant sur 'Finish'.
06.png

Le fichier s'ouvre avec le code auto-généré suivant :

package net.thgbm.forum.Listeners;

public class HelloPlayerListener {

}

Nous allons donc importer le nécessaire de l'API et hériter de playerListener puis attacher la classe principale pour interagir:

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.thgbm.forum.Hello.Hello;

public class HelloPlayerListener extends PlayerListener {

        public static Hello plugin; 
    
    public HelloPlayerListener(Hello instance) { 
        plugin = instance;
     }

}

Nous saluer à la connexion

Nous devons maintenant traiter nos deux objectifs en commençant par demander au serveur de nous saluer dés qu'on se connecte, pour cela nous allons utiliser la fonction onPlayerJoin() de playerListener et voici donc le code de ce que l'on souhaite :

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    player.sendMessage( "Salut à toi " + player.getName() );
}

Conclusion de notre HelloPlayerListener

Vous pouvez vous rendre compte que notre code efficace se limite à quelques lignes, le plus long étant de structurer le tout et d'importer/instancier le nécessaire.

Voici le fichier complet :

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.thgbm.forum.Hello.Hello;

public class HelloPlayerListener extends PlayerListener {

        public static Hello plugin; 
    
    public HelloPlayerListener(Hello instance) { 
        plugin = instance;
     }

        @Override
        public void onPlayerJoin(PlayerJoinEvent event) {
            // On récupère l'objet player en question    
            Player player = event.getPlayer();
            // Et on lui envoi un zoli message pour le saluer
            player.sendMessage( "Salut à toi " + player.getName() );
        }


}

HelloBlockListener

Ça va être la même logique sauf qu'on hérite de blockListener et pas de playerListener.
On importe le nécessaire de l'API.

Voici comment être prévenu d'un block cassé.

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockListener;
import net.thgbm.forum.Hello.Hello;

public class HelloBlockListener extends BlockListener {

        public static Hello plugin; 
    
    public HelloBlockListener(Hello instance) { 
        plugin = instance;
     }

        @Override
        public void onBlockDamage(BlockDamageEvent event)
        {
                // On récupère l'objet player qui a fait cette action
                Player player = event.getPlayer(); 
                // Si il est bien un player
                if (player != null) 
                {
                        // On envoi notre message
                        player.sendMessage("Tu viens de casser un block");
                }
                
        }
}

Nous avons donc nos deux listener avec nos nouvelles actions de codé.
Ils sont bien rangés dans leur package 'net.thgbm.forum.Listeners', objectifs atteints.

Dernière modification par boozaa (20 May 2011 23:39)

Hors ligne

short-url : #7 20 May 2011 10:40

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Le fichier plugin.yml indispensables références pour votre mod

Le fichier plugin.yml, comme son extension volontairement explicite l'indique, doit respecter le standard YAML.
Vous pouvez voir les références sur cette page si vous êtes curieux autrement sachez qu'il ne vous faudra pas longtemps pour vous créer le votre car le minimum d'informations requises est assez rapide à mettre en place.

icon_attention.gifATTENTION
Bukkit server attend de votre part que vous lui fournissiez avec votre mod quelques informations indispensables à son goût et que le fichier porte obligatoirement ce nom sans quoi il refusera de le charger.

Dans les informations à lui fournir on retrouve :

  • le nom de votre mod

  • la classe de base

  • l'auteur

  • la version de développement de votre mod

Le YAML n'est pas balisé comme le html par exemple ou le bbcode mais est structuré d'une autre manière ou les sauts de ligne et espaces sont très importants et ont une signification précise. Ceci étant dis je précise également que selon les éditeurs de texte la tabulation ne se retranscrit pas de la même manière dans le fichier et est souvent cause de mauvaises interprétation du fichier .yml.
Donc si vous voulez vous éviter ce genre de soucis n'utilisez pas la tabulation mais faites plutôt des espaces du genre une tabulation = 2 espaces.

Si on prends notre exemple voici à quoi ressemblerait notre fichier plugin.yml avec le minimum d'informations :

name: Hello
main: net.thgbm.forum.Hello.Hello
version: 0.01
website: http://thgbm.net
authors: boozaa
description: >
    Mon premier plugin qui affiche un message quand je me connecte
    Qui me salue quand je lui demande
    Qui me dit quand je casse un block

La propriété 'name' permet de faire cohabiter aussi plusieurs commandes identiques partagées par plusieurs mods. Ceci étant tout de même à éviter mais sachez que si par exemple vous avez créé une commande '/home' et que cette commande est déja définie par un autre mod vous pouvez l'appeler en jeu par '/Hello:home' dans notre exemple <-- ceci étant à vérifier.

La propriété 'main' doit représenter le nom complet, package et nom de fichier inclut sans le '.java' ou le '.class', de la classe qui étends JavaPlugin.

La propriété 'version' est facile à comprendre, c'est donc la version de votre release.

La propriété 'website' si vous en avez un.

La propriété 'authors' là c'est de vous dont on parle tongue.

La propriété 'description', une petite description de ce que fait votre mod.


Votre plugin contient des commandes utilisateurs ?

Pour éviter que les commandes d'un mod soient écrasées par celles d'un autre et pour instaurer une certaine cohésion vous devez préciser dans votre plugin.yml les commandes utilisateurs que vous avez créés de la forme :

commands:
  salut:
    description: Une commande pour me saluer
    usage: /<command>

Ce schéma doit être respecté pour toutes vos commandes utilisateurs, le 'usage' sera le message en réponse d'une mauvaise utilisation de la commande '/salut'.


Ce qui nous donnerait donc en combinant le tout :

name: Hello
main: net.thgbm.forum.Hello.Hello
version: 0.01
website: http://thgbm.net
authors: boozaa
description: >
    Mon premier plugin qui affiche un message quand je me connecte
    Qui me salue quand je lui demande
    Qui me dit quand je casse un block
commands:
  salut:
    description: Une commande pour me saluer
    usage: /<command>

Mais pourquoi déclarer mes commandes utilisateurs ?

Sauf erreur de ma part voici le pourquoi.
Quand un joueur tapes dans le tchat une commande, par exemple '/salut', le serveur cherche cette commande parmi celles déclarées aux chargements des mods.
Si il trouve la commande il connaît le mod qui souhaite la traiter et lui renvoi l’événement.

Avant cette structure .yml le serveur devait sûrement user plus de ressources car, toujours sauf erreur de ma part, il envoyait cet événement à tous les mods un par un jusqu'à ce qu'il y en ait un qui le traite. C'était une des raisons qui me faisait dire à l'époque qu'il valait mieux créer tout ce dont on a besoin plutôt qu'entasser les mods.


Où placer ce fichier ?

Il faut que ce fichier se trouve au même niveau que votre dossier 'src'. Dans le .jar après la génération il se trouvera donc à la racine du .jar.

Dernière modification par boozaa (21 May 2011 11:48)

Hors ligne

short-url : #8 20 May 2011 10:41

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Générer le .jar exploitable de votre mod

Votre mod est fait, il ne vous reste plus qu'à générer un .jar pour finalement le placer dans votre dossiers 'plugins/' se trouvant dans votre dossier du serveur Bukkit.

Pour générer votre.jar :

  • clic droit sur le dossier 'src' de votre projet Hello

  • choisissez 'Export'

  • choisissez 'Java' -> 'JAR file'
    07.png

  • vérifiez en dépliant le dossier Hello que en sélectionnant le dossier 'src' à droite vous ayez le fichier 'plugin.yml' de sélectionné lui aussi

  • choisissez la destination de votre fichier .jar et cliquez 'Finish'.

08.png
Voila votre .jar a été généré il ne vous reste plus qu'à le mettre dans votre dossier 'plugins/' de votre dossier serveur et à lancer votre serveur pour vérifier que tout va bien.

Dernière modification par boozaa (20 May 2011 19:12)

Hors ligne

short-url : #9 20 May 2011 10:53

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Une meilleure gestion des commandes utilisateurs

Dans notre exemple l'action faites lors de la saisie '/salut' est gérée dans notre classe principale. Il serait peut être préférable de la 'ranger' ailleurs car pour l'instant on n'a qu'une commande mais que se passera t'il quand on en ajoutera ? Si on change rien la classe principale va s'alourdir et devenir de moins en moins lisible.

A mon goût (oui vous savez "les goûts et les couleurs"..) je préfère 'ranger' mes commandes dans un package séparé et je vais vous montrer une méthode pour se faire.

Créez le package 'net.thgbm.forum.Commands'

Vous devez créer le package 'net.thgbm.forum.Commands', si vous ne vous rappelez plus comment faire remontez en haut de ce tutoriel.

Créez dans ce package une classe par commande

Nous avons pour l'instant qu'une seule commande : salut.
Créez donc une nouvelle classe en faisant un clic droit sur le package 'net.thgbm.forum.Commands' puis 'New' -> 'Class'.
Pour notre exemple appelez cette classe 'SalutCommand'.

Dans cette classe on va retrouver la méthode utilisée dans la classe principale mais sera donc exécutée dans le SalutCommand, voici le code :

package net.thgbm.forum.Commands;

import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.Command;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;

import net.thgbm.forum.Hello.Hello;


public class SalutCommand implements CommandExecutor {

    @SuppressWarnings("unused")
    private final Hello plugin;

    public SalutCommand(Hello plugin) {
        this.plugin = plugin;
    }
    
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        if(label.equalsIgnoreCase("salut"))
        { 
            Player player = (Player)sender;
            player.sendMessage(ChatColor.DARK_AQUA + "Salut à toi encore une fois " + player.getName() );
            return true;
        }
        return false;
    }
    
    
}

Il faut implémenter CommandExecutor pour accéder on onCommand().
La méthode onCommand n'a pas beaucoup changée comme vous pouvez le constater sauf que je colore le texte envoyé au joueur grâce à la classe org.bukkit.ChatColor comme vous pouvez le constater dans la ligne :

player.sendMessage(ChatColor.DARK_AQUA + "Salut à toi encore une fois " + player.getName() );

Devinez quoi, ça sera écrit en bleu....

Modification sur la classe principale Hello

Il faut maintenant modifier notre classe principale pour envoyer la gestion de la commande /salut vers notre classe SalutCommand.

Commençons par ajouter nos imports :

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

import net.thgbm.forum.Commands.*;

Ensuite on supprime notre commande onCommand() et dans le onEnable() on va rediriger la gestion de la commande /salut vers notre SalutCommand :

// La commande /salut sera executée par net.thgbm.forum.Commands.SalutCommand
getCommand("salut").setExecutor(new SalutCommand(this));

Regénez votre .jar et ça devrait fonctionner.


Conclusion

Maintenant que notre commande est 'rangée' dans son package vous vous rendez compte que la classe principale reste claire et que la gestion de la commande nécessite peu de codes au final.
En mettant en place ce système lorsque vous souhaiterez ajouter de nouvelles commandes il ne vous restera qu'à :

  • ajouter votre commande dans votre fichier plugin.yml

  • ajouter dans le onEnable() de votre classe principale :

    getCommand("<VotreCommande>").setExecutor(new <VotreCommande>Command(this));
  • créer votre classe <VotreCommande>Command dans le package Commands

  • adaptez le code de la classe SalutCommand à vos besoins pour cette nouvelle classe

Dernière modification par boozaa (21 May 2011 09:45)

Hors ligne

short-url : #10 20 May 2011 10:58

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Et pourquoi avoir créé le package net.thgbm.forum.Utils ?

Vous vous souvenez, au début de ce tuto je vous avez demandé de créer un package 'net.thgbm.forum.Utils' en expliquant qu'on y rangerait certaines de nos fonctions ?

Je vous propose d'y créer une classe 'Message' qui nous permettra de définir des fonctions comme:

  • sendInfo()

  • sendError[()

  • sendSuccess()

qui seront utiles pour envoyer respectivement :

  • un message de couleur grise

  • un message de couleur rouge

  • un message de couleur verte

Vous voyez l'idée ? On va créer ces fonctions car il y a de fortes chances pour qu'on les utilisent beaucoup dans nos développements et qu'elles sont toutes les 3 de même nature.

Concrètement on cherche à faire quoi ?

Et bien concrètement on souhaite remplacer notre envoi de message de notre HelloPlayerListener:

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    player.sendMessage( "Salut à toi " + player.getName() );
}

Par ceci :

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    Messages.sendInfo( player, "Salut à toi " + player.getName() );
}

Et on pourra l'utiliser à chaque fois que l'on souhaite envoyer des messages à un joueur avec nos couleurs.


Mise en place

Faites un clic droit sur votre package 'net.thgbm.forum.Utils' et 'New' -> 'Class'.
Appelez là 'Messages'

Voici le code à y insérer :

package net.thgbm.forum.utils;

import org.bukkit.entity.Player;
import org.bukkit.ChatColor;


public class Messages {
    
    // Message en gris
    public static void sendInfo( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_GRAY + message );
    }
    
    // Message en rouge
    public static void sendError( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_RED + message );
    }
    
    // Message en vert
    public static void sendSuccess( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_GREEN + message );
    }
    
}

C'est tout ! Maintenant modifions notre HelloPlayerListener  :

  • on retire l'import de org.bukkit.ChatColor qui n'a plus lieu d'être

  • on import net.thgbm.forum.Utils.Messages

  • et on modifie le onPlayerJoin() comme souhaité

Dernière modification par boozaa (21 May 2011 12:53)

Hors ligne

short-url : #11 20 May 2011 11:00

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

*reservé*

Hors ligne

short-url : #12 20 May 2011 11:05

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

*reservé*

Hors ligne

short-url : #13 20 May 2011 14:12

Aliassse
Intégrateur web en herbe
Lieu : Pau
Inscription : 21 Apr 2011
Messages : 39

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Ouais merci Boozaa ! Après Tickle toi aussi tu t'y mets smile
Et au faite j'ai récupéré les cours dont je te parlais l'autre fois, si tu les veux fait moi signe wink

Hors ligne

short-url : #14 21 May 2011 10:01

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

@Aliassse - merci pour les fichiers

Hors ligne

short-url : #15 03 May 2012 11:46

boozaa
Hummm...boozaa
Inscription : 29 Jan 2011
Messages : 1 771

Re : [Tuto Obsolete] Créez votre premier plugin pour bukkit

Tuto obsolète concernant la nouvelle gestion des évènements dans bukkit.

Hors ligne

Pied de page des forums