Pages :: 1
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:
Vous choisissez le nom de votre projet, puis appuyez sur Next:
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:
Et cliquez sur Next
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:
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)
Astuce bien complète et vraiment BIG original
Merci beaucoup cela m'aidera pour l'avenir :-D
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!
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
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
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
Cool
Hors ligne
Bon tuto :p
Hors ligne
SougarGameuse14:Ce post date du 11/04/15,donc de 7 mois,évite de remonter les vieux post.
Hors ligne
Bon Tuto
Hors ligne
Tu as fait un UP de 2015 !!
Hors ligne
Pages :: 1