Sommaire
Introduction
J’ai récemment rencontré une situation où une communication entre Forge et un plugin Bukkit/Spigot était nécessaire. J’aurais aimé faire autrement, mais il est indéniable que les plugins sont présents dans beaucoup de serveurs et que leur économie est souvent basée sur un plugin et non un mod. C’est dans cette optique que j’ai décidé de vous partager une façon de communiquer avec un plugin, même si un mélange de mod et de plugins n’est pas forcément recommandé pour un serveur.
Pré-requis
- Avoir une base des techniqualités des Packets.
- Avoir une base en Java.
- Avoir une base avec Bukkit/Spigot et avec Forge.
Forge
Enregistrer le channel Forge:
Pour débuter, rendez vous à l’endroit où vous enregistrez vos packets ajoutez la ligne suivante:
NetworkRegistry.INSTANCE.newChannel("ForgeToBukkit", new PacketHandler());
Cette simple ligne sert à créer un nouveau channel que j’ai nommé “ForgeToBukkit” (Il est possible de lui donner le nom que vous voulez) et à déclare l’handler. L’handler servira à traiter un packet lors de sa réception.
L’handler:
En théorie, l’handler n’est pas réellement nécessaire car, dans ce tutoriel, nous ne traiterons que l’envoi de packets. Cependant, il sera utile pour obtenir une réponse du plugin. Il faut donc créer une classe qui, dans mon cas, sera nommée PacketHandler et lui implémenter l’interface ChannelHandler. Ensuite, ajoutez ces trois méthodes :
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
}
La première méthode est appelée lorsqu’un packet est ajoutée à la liste. La deuxième est l’inverse de la première car elle est appelée lorsqu’un packet est retiré de la liste. La dernière, quant à elle, est appelée lorsqu’une exception est levée pendant le traitement d’un packet. Cette classe ne sera pas utile pour l’instant, elle sera modifiée dans la partie Bonus.
L’envoi:
Une fois que le channel est en place, il est possible d’envoyer des packets.
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Hello World!");
C17PacketCustomPayload packet = new C17PacketCustomPayload("ForgeToBukkit", out.toByteArray());
playerMP.sendQueue.addToSendQueue(packet);
Dans cet extrait de code, on commence par créer un nouveau ByteStream qui permettera d’envoyer les données nécessaires. Ensuite, on lui ajoute les données que nous voulons envoyer avec le packet. Dans mon cas, j’envoie une chaîne de caractère avec la méthode writeUTF. Dans la troisième ligne, nous créons un packet et nous lui fournissons en paramètres le channel dans lequel il doit être envoyé ainsi que les données à envoyer. Finalement, nous ajoutons le packet à la file d’attente pour qu’il soit envoyé.
NB: L’instance du joueur doit être EntityClientPlayerMP. Sur serveur, il est possible de convertir un EntityPlayer en EntityClientPlayerMP en le castant tout simplement. Voici un exemple :
EntityClientPlayerMP playerMP = (EntityClientPlayerMP) player;
Bukkit
Enregistrer le channel:
À partir de maintenant, le tutoriel se déroule dans votre plugin.
Dans votre event onEnable de votre classe principale, ajoutez la ligne suivante:
Bukkit.getMessenger().registerIncomingPluginChannel(this, "ForgeToBukkit", new PacketListener());
Cette ligne sert à enregistrer le channel comme entrant (incoming). On lui fourni ensuite en paramètre l’instance du plugin, le channel qui doit être le même que tout à l’heure et le PacketListener qui traitera les packets reçus.
Packet Listener (Handler):
Le PacketListener sert à traiter les packets lorsqu’ils arrivent. Je vous invite à créer une nouvelle classe nommée PacketListener qui implémente PluginMessageListener. Ajoutez ensuite le code suivant:
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
if(channel.equals("ForgeToBukkit"))
{
player.sendMessage(in.readUTF());
}
}
Cette méthode sera appelée lorsqu’un packet est reçu. Quand ça arrive, on commence par vérifier si le channel est bien celui que nous voulons écouter. Si c’est le cas, on crée un ByteStream d’entrée qui nous permettera de lire les données. Ensuite, on écrit dans le chat les données présentes dans le packet.
Crédits
Rédaction et correction:
- DiabolicaTrix
Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International