Forum francais Minecraft. Serveur de jeu FR-Minecraft et astuces pour Minecraft.

Pages :: 1

#1 11/04/2015 18:52:24

Membre
Lieu : Devant son ordinateur

Messages : 71

[TUTO] Créer un plugin Bukkit 1.8

Bonjour à tous et à toutes!

Dans ce tutoriel nous allons apprendre à créer des plugins pour serveur avec l'API Bukkit!

Pré-requis

Vous DEVEZ avoir:

- Des bases en Java
- Java Development Kit (Disponible ici)
- Eclipse Java EE IDE (Disponible ici)
- Bukkit ET un serveur CraftBukkit ou Spigot (Tuto pour les obtenir: ICI)

L'installation de Java Development Kit est simple vous téléchargez l'installeur qui correspond à votre machine et lancez l'installateur.
L'installation de Eclipse est moins simple mais le reste comme même, créez un dossier FIXE et mettez le contenu du ZIP d'eclipse dedans. (Le programme à démarrer est eclipse.exe)

Créer votre premier plugin

Maintenant qu'on a tout commençons..

Mettez votre Bukkit.jar dans un dossier FIXE.

Démarrer eclipse.

Créer un nouveau Projet:

Nouveau projet Java
Nouveau projet Java

Vous choisissez le nom de votre projet, puis appuyez sur Next:

Sélectionnez une librairie

Puis cliquez sur Add External JARs... et sélectionnez le fichier Bukkit.jar et pas CraftBukkit.jar

Enfin cliquez sur Finish

Maintenant ouvrez votre projet puis cliquez droit sur src et faites New-->Package.
Puis vous allez devoir entrez un nom de domaine mais comment ça marche?

Si vous avez un nom de domaine par exemple: machin.fr vous devrez entrez alors comme non de Package: fr.machin
Mais vous n'avez pas de nom de domaine? He si:
Si vous avez une adresse E-mail par exemple gmail ou aol ce sera:
com.gmail.VotreEmail ou com.aol.VotreEmail

ATTENTION: Il est interdit de commencer le nom de package par org.bukkit, sinon le plugin ne se charge pas!
Attention: Vous ne pouvez pas mettre un chiffre après le . et les caractères spéciaux ne sont pas autorisés!

Moi je vais mettre tuto.plugin puis cliquez droit sur le package et faites New-->Class

Vous allez nommer cette Class par le nom de votre plugin ici: TutoPlugin

Cette Class représente la Class principale de votre plugin!

On va enfin commencer le code, dedans cette classe il y a (pour moi):

package tuto.plugin;

public class TutoPlugin {

}

A partir d'ici je n'affiche plus les lignes commençant par "package" et "import", on va maintenant extendre l'objet JavaPlugin de Bukkit:

public class TutoPlugin extends JavaPlugin {

}

Et faites Ctrl + Maj + O pour importer la classe.

On va créer des méthodes qui contienne le code quand le plugin est activé et désactivé:

public class TutoPlugin extends JavaPlugin {
    
    //Console de bukkit
    private static ConsoleCommandSender console = Bukkit.getConsoleSender();
    
    //Méthode d'activation
    @Override
    public void onEnable() {
        //Message en vert
        console.sendMessage("§aTutoPlugin est actif!");
    }
    
    //Méthode de désactivation
    @Override
    public void onDisable() {
        //Message en rouge
        console.sendMessage("§cTutoPlugin est desactive");
    }
    
    public static ConsoleCommandSender getConsole() {
        return console;
    }

}

Voilà rien de plus simple! Avant de compilé le plugin on va créer le plugin.yml, cliquez droit sur src puis New-->File et nommez le plugin.yml

ATTENTION: Le Yaml est sensible aux espaces!

Mettez:

name: <nomDuPlugin>
main: <votrePackage>.<VotreClassePrincipale>
version: <versionDuPlugin>
description: <Description du plugin>
author: <votreNom>

Mettez ça si vous êtes plusieurs auteurs:

name: <nomDuPlugin>
main: <votrePackage>.<VotreClassePrincipale>
version: <versionDuPlugin>
description: <Description du plugin>
author: [<votreNom>,<nomDuContributeur>,<etc..>]

Vous pouvez ajouter un prefix spécifique au lieu du nom dans la console en mettant dans une nouvelle ligne: prefix: <prefixDuPlugin>
On peut aussi ajouter un website: website: <adresseDeVotreSite>

ATTENTION: Il est interdit de mettre des accents dans le plugin.yml!

Ici:

name: TutoPlugin
author: 67clement
main: tuto.plugin.TutoPlugin
version: 0.1
description: Tutoriel
prefix: TUTO

Maintenant on va compilé le plugin:

Cliquez droit sur le projet et faites Export puis sélectionnez Java-->Java Jar File:

Export Java Jar File

Et cliquez sur Next

Export Java Jar File

Décochez .classpath et .project

JAR File correspond au chemin du fichier

Puis cliquez sur Finish

Maintenant que vous avez le jar du plugin vous pouvez le mettre dans le dossier plugins et lancer le serveur!

Dans la console ça donne:

activationduplug.png

Les commandes et les permissions

Bien passons aux commandes! On va ajouter 3 commandes: /ping, /day et /hello.
- /ping va envoyer un message: Pong!
- /day [WorldName] va mettre le jour, si il y a un monde spécifié il mettra le jour dans ce monde.
- /hello <me|PLAYER> est une commande à argument plus concret

On va créer 3 class: CommandPing, CommandDay et CommandHello, vous l'aurez compris: CommandPing est la class de la commande /ping et CommandDay est la class de la commande /day...

Commençons par le plus facile: la commande ping, elle n'a pas d'argument et une permission: "tuto.hello"

Passons au code dans CommandPing:

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

public class CommandPing implements CommandExecutor {

    // Methode d'éxecution de la commande
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label,
            String[] args) {
        // On vérifie le nom de la commande sans tenir compte des majuscules
        if (label.equalsIgnoreCase("ping")) {
            // On vérifie que le sender à la permission tuto.ping
            if (sender.hasPermission("tuto.ping")) {
                // Oui il a la permission:
                // On envoit un message vert disant Pong! au SENDER
                sender.sendMessage(ChatColor.GREEN + "Pong!");
            } else {
                // Non il a pas la permission alors on lui envoie un message:
                sender.sendMessage(ChatColor.DARK_RED + "[Permissions] "
                        + ChatColor.RED + "Vous n'avez pas la permission!");
            }
            // On ne retourne pas l'usage
            return true;
        }
        return false;
    }

}

Bien c'est simple non? N'oubliez pas d'importez les class de bukkit ;)

Passons à la commande /day un peu plus compliqué:

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

public class CommandDay implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label,
            String[] args) {
        if (label.equalsIgnoreCase("day")) {
            // On vérifie si le sender est un joueur
            if (sender instanceof Player) {
                // ON récupère le joueur
                Player player = (Player) sender;
                // A-t-il la permission?
                if (player.hasPermission("tuto.day")) {
                    // On vérifie qu'il n'y a pas d'arguments
                    if (args.length == 0) {
                        // On mets les ticks sur 1000 dans le monde où se trouve
                        // le joueur
                        player.getWorld().setTime(1000);
                        // On envoit un message au joueur
                        player.sendMessage(ChatColor.GREEN
                                + "Il fait jour dans ton monde!");
                        // SI il y a un argument
                    } else if (args.length == 1) {
                        // On récupère l'argument qui est le nom d'un monde
                        World world = Bukkit.getWorld(args[0]);
                        // On vérifie que le monde existe
                        if (world != null) {
                            // On mets les ticks sur 1000 dans le monde en
                            // question
                            world.setTime(1000);
                            // On envoit un message au joueur
                            player.sendMessage(ChatColor.GREEN
                                    + "Il fait jour dans le monde: "
                                    + ChatColor.RED + world.getName());
                        } else {
                            // On envoit un message au joueur d'erreur: le monde
                            // n'existe pas
                            player.sendMessage(ChatColor.DARK_RED + "[Erreur] "
                                    + ChatColor.RED + "Le monde \""
                                    + ChatColor.DARK_RED + args[0]
                                    + ChatColor.RED + "\" n'existe pas!");
                        }
                        // Si il y a plus qu'un argument on envoie le message
                        // d'Usage
                    } else {
                        return false;
                    }
                } else {
                    player.sendMessage(ChatColor.DARK_RED + "[Permissions] "
                            + ChatColor.RED + "Vous n'avez pas la permission!");
                }
            } else {
                // Erreur: le sender n'est pas un joueur
                sender.sendMessage("Vous devez etre un joueur!");
            }
            // On n'envoie pas l'usage
            return true;
        }
        return false;
    }

}

Bien! Ce n'est pas si compliqué si?

Passons à la commande /hello qui a plus de particularité:
  - Elle a des aliases, c'est à dire que si on tape /helloWorld c'est comme si on tapait /hello
  - Elle a des arguements: Me ou un nom de joueur

Passons au code:

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

public class CommandHello implements CommandExecutor {

    @SuppressWarnings("deprecation")
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label,
            String[] args) {
        // Le nom peut être hello ou helloWorld
        if (label.equalsIgnoreCase("hello")
                || label.equalsIgnoreCase("helloWorld")) {
            if (sender.hasPermission("tuto.hello")) {
                if (args.length == 0) {
                    return false;
                } else if (args.length == 1) {
                    // On vérifie que l'argument 0 qui correspond au premier
                    // argument si il est "me"
                    if (args[0].equalsIgnoreCase("me")) {
                        // On envoie un message au sender
                        sender.sendMessage(ChatColor.GREEN + "Hello!");
                    } else {
                        // On ajoute une permission pour l'argument:
                        if (sender.hasPermission("tuto.hello.other")) {
                            // Sinon on vérifie que c'est un joueur connecté:
                            if (Bukkit.getPlayer(args[0]) != null) {
                                // On récupère le joueur
                                Player otherPlayer = Bukkit.getPlayer(args[0]);
                                // On lui envoie le message Hello!
                                otherPlayer.sendMessage(ChatColor.GREEN
                                        + "Hello!");
                                // On lui mets sa vie à 20.0 car un coeur est
                                // égale
                                // à
                                // 2.0
                                otherPlayer.setHealth(20.0);
                            } else {
                                sender.sendMessage(ChatColor.RED + "Le joueur "
                                        + ChatColor.DARK_RED + args[0]
                                        + ChatColor.RED
                                        + " n'est pas connecte!");
                            }
                        } else {
                            sender.sendMessage(ChatColor.DARK_RED
                                    + "[Permissions] " + ChatColor.RED
                                    + "Vous n'avez pas la permission!");
                        }
                    }
                    return true;
                } else {
                    return false;
                }
            } else {
                sender.sendMessage(ChatColor.DARK_RED + "[Permissions] "
                        + ChatColor.RED + " Vous n'avez pas la permission!");
            }
        }
        return false;
    }

}

Bien maintenant il va falloir ajouter les commandes dans la méthode onEnable de la class principale:

//On ajoute l'executeur de la commande /ping
        this.getCommand("ping").setExecutor(new CommandPing());
        //On ajoute l'executeur de la commande /day
        this.getCommand("day").setExecutor(new CommandDay());
        //On ajoute l'executeur de la commande /Hello
        this.getCommand("hello").setExecutor(new CommandHello());

Mais c'est pas finit on doit ajouter les commandes ET les permissions dans le plugin.yml

name: TutoPlugin
author: 67clement
main: tuto.plugin.TutoPlugin
version: 0.1
description: Pas de description
prefix: TUTO

commands:
  ping:
    description: Pong!
    usage: /ping
  day:
    description: Mettez le jour!
    usage: /day [World]
  hello:
    description: Bonjour!
    usage: /hello <Me|PLAYER>
    aliases: [hello,helloWorld]
    
permissions:
  tuto.*:
    description: Toutes les permissions de TutoPlugin
    default: op
    children:
      tuto.ping: true
      tuto.day: true
      tuto.hello.*: true
  tuto.hello.*:
    description: Toutes les permissions de la commande /hello
    default: op
    children:
      tuto.hello: true
      tuto.hello.other: true

Bien! Je vais un peu expliquer:

Dans la partie commands:
  - Le "usage" donne l'usage de la commande (si on retourne faux dans le onCommand)
  - Le "description" est la description dans la commande /help
  - Le "aliases" stock les différentes aliases

Dans la partie permissions:
  - Le "default" permet de savoir si le joueur à la permission par défaut ou si la personne doit être op
  - Le "children" donne a Bukkit la liste des permissions comprise (si c'est sur true)
  - Le "description" est la description de la permission

Maintenant on sauvegarde tout, on compile et on teste ;)

Prochaine étape: les Events

Dernière modification par 67clement (12/04/2015 11:45:06)

Hors ligne


67clement_gameplay.png

#2 12/04/2015 09:12:25

Membre
Lieu : Devant mon ordi

Messages : 157

Re : [TUTO] Créer un plugin Bukkit 1.8

Astuce bien complète et vraiment BIG original 17
Merci beaucoup cela m'aidera pour l'avenir :-D

Hors ligne


Je suis sur le serveur Freebuild, si vous savez un projet, contactez moi !
Si tu veux voir nos idées sur la 1.9 click
Si tu veux donner ton avis sur la 1.9, click ici

#3 12/04/2015 11:47:12

Membre
Lieu : Devant son ordinateur

Messages : 71

Re : [TUTO] Créer un plugin Bukkit 1.8

Merci pour ton soutien XelaCraft789 j'espère que mon tutoriel t'aidera! ;)

Ajout de la partie sur les commandes fait!

Prochaine étape: Les Events!

Hors ligne


67clement_gameplay.png

#4 25/06/2015 18:26:19

Membre

Messages : 2

Re : [TUTO] Créer un plugin Bukkit 1.8

Bonjour, je développe des petits plugins depuis maintenant un moment et je viens de tomber sur un os:
quand je met mon plugin sur un serveur omgserv, ce n'est pas pour faire de la pub, le plugin n'est pas reconnu, il n'est pas chargé et rien ne se passe alors que sur vps et en local le plugin fonctionne vraiment bien ^^

Auriez vous une solution pour moi ?

Hors ligne

#5 25/06/2015 19:03:57

Membre
Lieu : Devant son ordinateur

Messages : 71

Re : [TUTO] Créer un plugin Bukkit 1.8

Dracnis a écrit :

Bonjour, je développe des petits plugins depuis maintenant un moment et je viens de tomber sur un os:
quand je met mon plugin sur un serveur omgserv, ce n'est pas pour faire de la pub, le plugin n'est pas reconnu, il n'est pas chargé et rien ne se passe alors que sur vps et en local le plugin fonctionne vraiment bien ^^

Auriez vous une solution pour moi ?

Mmmhh, si dans tes logs il y a un "major.minor: 52.0" c'est que tu as compilé avec Java 8 et OMGServ est sous Java 7

Pour régler cela va dans les propriétés de ton ton projet puis tu vas dans JRE System library et tu choisis le Java-SE 7 et tu recompiles le plugin

Hors ligne


67clement_gameplay.png

#6 26/06/2015 18:28:21

Membre

Messages : 2

Re : [TUTO] Créer un plugin Bukkit 1.8

C'est la conclusion à laquelle j'étais arrivé aussi ^^"
Et heureusement c'est là bonne :)
Je cherche à créer un plugin pour ajouter des stats dans minecraft, mais je n'arrive pas à tester la mort d'un mob ET à récupérer la dernière personne à l'avoir tapé.
J'arrive à faire l'un puis l'autre mais pas à récupérer les deux :/
ok c'est bon j'ai rien dis c'était juste mon pc qui ne reconnaissais pas la classe --"

Dernière modification par Dracnis (30/06/2015 18:51:16)

Hors ligne

#7 01/11/2015 22:04:32

Membre
Lieu : Aplus de mille lieux d'ici

Messages : 10

Re : [TUTO] Créer un plugin Bukkit 1.8

Cool

Hors ligne

#8 11/11/2015 16:26:17

Membre

Messages : 4

Re : [TUTO] Créer un plugin Bukkit 1.8

Bon tuto :p

Hors ligne

#9 11/11/2015 16:48:15

Membre
Lieu : Chez Grillby's

Messages : 789
Site Web

Re : [TUTO] Créer un plugin Bukkit 1.8

SougarGameuse14:Ce post date du 11/04/15,donc de 7 mois,évite de remonter les vieux post.

Hors ligne

#10 27/04/2016 19:25:54

Membre

Messages : 1

Re : [TUTO] Créer un plugin Bukkit 1.8

Bon Tuto

Hors ligne

#11 27/04/2016 21:24:11

Membre
Lieu : Chez Grillby's

Messages : 789
Site Web

Re : [TUTO] Créer un plugin Bukkit 1.8

Tu as fait un UP de 2015 !!

Hors ligne

Pages :: 1

Pied de page des forums