Mon premier plugin Minecraft avec Sponge
Petit article pour parler de Sponge, c’est une API Minecraft qui à pour but de remplacer le célèbre Bukkit depuis l’arrêt du projet pour la création de plugin.
Depuis quelque temps, j’ai envie de créer des plugins pour mon jeu préféré et donc j’apprends (un peu) le java^^. Bien sûr au début ça sera de petit plugin ;).
Avec la commande « /sponge plugins » on peut lister les plugins sur le serveur, le miens c’est « HelloWord Project »:
Vous devez vous en douter mon premier plugin est très basique, qu’est ce qu’il fait ? Quand on tape /hello ou son alias /helloword ça affiche ça:
Par contre, si on tape la commande dans la console ça affiche: « Hello depuis la console! » et même chose pour une commande bloc, ça permet d’éviter une erreur quand la commande doit être tapé par un joueur.
On peut aussi voir la description de la commande comme les autres:
Le code(Fichier class Test):
package fr.simonbhb.test; import org.slf4j.Logger; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameLoadCompleteEvent; import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.event.game.state.GameStoppedServerEvent; import org.spongepowered.api.plugin.Plugin; import org.spongepowered.api.text.Texts; import org.spongepowered.api.util.command.spec.CommandSpec; import com.google.inject.Inject; @Plugin(id = "test", name = "HelloWord Project", version = "0.0.1") public class Test { @Inject Logger logger; public Logger getLogger() { return logger; } @Listener public void onInitialization(GameLoadCompleteEvent e) { CommandSpec hello = CommandSpec.builder() .permission("test.hello") .description(Texts.of("Affiche la position du joueur qui à tapé la commande.")) .executor(new Hello()) .build(); e.getGame().getCommandDispatcher().register(this, hello, "hello", "helloword"); } @Listener // Fonction démarrage du plugin public void onServerStart(GameStartedServerEvent event) { logger.info("Projet Sponge start !"); } @Listener // Fonction arret du plugin public void onServerStart(GameStoppedServerEvent event) { logger.info("Projet Sponge stop !"); } }
Je vais expliqué le code vu que je commence à peine le Java mes explications seront sans doute imprécise, désoler d’avance.
Alors c’est quoi ce code ? C’est la class principal de notre plugin que j’ai appelé « Test ».
Puis de la ligne 3 à 12 ont à tout nos imports pour que le plugin fonctionne.
La ligne 14 est très importante, car elle déclare notre plugin, on lui donne un id, c’est ce qui s’affiche dans la console:
[21:43:27] [Server thread/INFO] [test]: Projet Sponge start !
Puis un nom, c’est ce qui s’affiche quand on fait: « /sponge plugins » et on définie une version.
Pour les lignes 17 à 22 ne me demander pas ce que c’est(j’en sais rien), tout ce que je sais c’est que « logger » (ligne 38 et 44) permet d’afficher dans la console que le serveur à bien démarré ou arrêté… Plus d’info.
Les lignes 25 à 33 contiennent une fonction avec un événement GameLoadCompleteEvent qui comme son nom l’indique arrive quand tout les initialisations pour les plugin sont chargées. A l’intérieur on à la déclaration de notre commande: la permission pour l’exécuter, la description pour dire ce qu’elle fait comme dans l’image plus haut et l’executor qui est la class qui contient ce que la commande va faire.
Ensuite la ligne 32 ajoute notre commande avec le texte à taper pour l’exécuter qui est « hello » et « helloword ».
Les lignes 35 à 45 contiennent deux fonctions, elles sont appelées au démarrage et à l’arrêt du serveur et donc à affiche un petit message pour dire que ça c’est bien passé…
Le deuxième(Fichier class Hello) contient ce que fait notre commande:
package fr.simonbhb.test; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Texts; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.command.CommandException; import org.spongepowered.api.util.command.CommandResult; import org.spongepowered.api.util.command.CommandSource; import org.spongepowered.api.util.command.args.CommandContext; import org.spongepowered.api.util.command.source.CommandBlockSource; import org.spongepowered.api.util.command.source.ConsoleSource; import org.spongepowered.api.util.command.spec.CommandExecutor; public class Hello implements CommandExecutor { @Override public CommandResult execute(CommandSource commandSource, CommandContext commandContext) throws CommandException { if(commandSource instanceof Player) { Player player = (Player) commandSource; player.sendMessage( Texts.builder("Hello ").color(TextColors.YELLOW) .append( Texts.builder( player.getName() + " ").color(TextColors.RED).build() ) .append( Texts.builder( "ta position est: " ).build() ) .append( Texts.builder( "X: " ).color(TextColors.GREEN).build() ) .append( Texts.builder( player.getLocation().getBlockX() + " " ).color(TextColors.AQUA).build() ) .append( Texts.builder( "Y: " ).color(TextColors.GREEN).build() ) .append( Texts.builder( player.getLocation().getBlockY() + " " ).color(TextColors.AQUA).build() ) .append( Texts.builder( "Z: " ).color(TextColors.GREEN).build() ) .append( Texts.builder( player.getLocation().getBlockZ() + " " ).color(TextColors.AQUA).build() ) .build() ); } else if(commandSource instanceof ConsoleSource) { commandSource.sendMessage(Texts.of("Hello depuis la console!")); } else if(commandSource instanceof CommandBlockSource) { commandSource.sendMessage(Texts.of("Hello depuis une commande bloc!")); } return CommandResult.success(); } }
Ici le gros du code se passe sur les lignes 17 à 40. On a tout d’abord une condition qui vérifie qui a tapé la commande et on envoie un message. Pour le joueur on récupère son nom et sa position qu’on affiche avec un peu de couleur^^.
C’est donc très simple pour mon premier petit plugin.
Lien du fichier plugin Sponge: lien
Tous les codes sont testés et sont fonctionnels, si il arrive qu'un de ces codes ne fonctionne pas chez vous, merci de me le signaler.