Cet article est le premier élément d’une série. Nous allons vous parler un peu du développement dans le cadre de Minecraft. Même si nous souhaitons rester accessibles à tous, nous vous prévenons, ça risque d’être un peu corsé. Accrochez-vous, car ça en vaut la peine.
Nous nous adressons donc aux débutants souhaitant se mettre au développement sur Minecraft. Mais si vous êtes déjà très compétents, nous vous inviterons tout de même à lire le 3ème article de cette série qui s’adressera aux personnes plus expérimentées et nous amènera beaucoup plus loin dans des sujets techniques.
Enfin si, au contraire, vous ne souhaitez pas vous mettre au développement, nous vous conseillons tout de même de parcourir ces articles. En effet, nous sommes convaincus que certaines parties présentent des éléments qui pourraient se révéler utiles pour de potentiels administrateurs de serveurs.
Accessoirement, nous espérons que vous n’avez pas peur de lire l’anglais ! En développement, beaucoup de ressources sont disponibles uniquement dans cette langue. Il est cependant possible d’utiliser un traducteur en ligne (Google translate ou DeepL par exemple), même s’ils traduisent assez mal les termes techniques. Néanmoins ne vous arrêtez pas non plus à cela car les ressources adaptées aux débutants sont souvent disponibles en français et vous apprendrez très vite le vocabulaire technique anglais si vous persévérez.
Une dernière chose avant de rentrer dans le vif du sujet : Nous n’avons pas la prétention de pouvoir vous former, au sein de quelques articles, à des connaissances et des savoir-faire que les personnes acquièrent après quelques années d’expériences. Nous cherchons plutôt à vous donner une vision globale en vous apportant les informations nécessaires pour poursuivre votre formation en autonomie. C’est pour cette raison que nous avons agrémenté l’article de liens pour les plus curieux d’entre vous.
Qu’est-ce que c’est que le développement ?
Le développement est un domaine extrêmement vaste. De manière générale, c’est un contexte dans lequel on imagine, on développe, on vérifie et enfin on intègre des logiciels.
Le vocabulaire peut varier mais les grandes étapes restent toujours les mêmes :
- La définition d’un logiciel : C’est l’expression du besoin, l’analyse et les spécifications fonctionnelles et techniques. Dans l’univers Minecraft, on va souvent moins loin et, même si ça leur joue parfois des tours, la majorité des projets se contentent de rédiger un cahier des charges.
- Le développement d’un logiciel : C’est le cœur du travail, le développement. C’est là que l’on écrit le code source. Et que l’on vérifie, à chaque petite étape, que la réalisation fonctionne (en automatisant souvent ces vérifications avec des tests). Dans l’univers Minecraft, les personnes testent souvent directement en jeu.
- La vérification d’un logiciel : On parle ici de tests d’intégrations. Cette étape est essentielle étant donné que l’introduction d’une nouvelle fonctionnalité peut faire bugger une fonctionnalité précédente. Il s’agit donc de vérifier non seulement les nouvelles fonctionnalités mais aussi celles qui marchaient auparavant. De nombreuses équipes testent l’ensemble de leur logiciel avant chaque publication d’une nouvelle version. Cette phase est souvent faite manuellement mais il est possible de l’automatiser, du moins en partie. Dans l’univers Minecraft, les tests ne sont presque jamais automatisés. Là encore les développeurs testent en jeu. Pour des raisons de temps et de coût, les tests sont souvent réalisés par les joueurs qui font ensuite leurs retours aux développeurs.
- L’intégration d’un logiciel : Il s’agit de le mettre à disposition des utilisateurs. Il est possible de l’envoyer simplement sur un site internet. On peut aussi lancer automatiquement les vérifications puis la publication dès qu’un changement a lieu dans le code. Cela peut se traduire par l’installation automatique sur les ordinateurs des utilisateurs ou sur les serveurs. Les possibilités d’automatisation de la distribution sont multiples et dépendent du type de logiciel que l’on développe.
Dans l’univers Minecraft, l’automatisation se démocratise. Bien sûr, encore aujourd’hui, la majorité des développeurs se contentent au départ d’envoyer leur plugin sur un site, comme celui de Spigot.
Lorsque l’on développe, on utilise le plus souvent un langage de programmation. Sur Minecraft c’est le Java. Contrairement aux langages de scripting (comme skript [1][2] par exemple), un langage de programmation est un langage compilé.
La compilation est une sorte de traduction : c’est l’action de traduire le code source des développeurs dans un langage lisible par la machine. Pour voir le résultat, il suffit de compiler le code et de l’exécuter pour faire fonctionner le programme/plugin/…
Le développement Java
Le langage de programmation Java est fait pour être exécuté, une fois compilé, par la JVM (Java Virtual Machine). Elle est disponible sur votre ordinateur après avoir installé Java (indispensable pour jouer à Minecraft). Cette JVM est capable d‘exécuter du code Java compilé par les développeurs, et c’est à travers elle que vous lancez tout programme codé en Java.
L’intérêt de la JVM est qu’elle est disponible sur Windows, MacOS ou Linux. C’est ce qu’on appelle du cross-plateforme. Pour en savoir plus vous pouvez consulter cet article.
Comme tous les langages de programmation, le Java a ses propres règles. Il rassemble ainsi de nombreuses fonctionnalités qui permettent de répondre aux besoins des développeurs.
Par exemple, la concaténation de caractères pour former une chaîne de caractères que l’on pourra afficher :
import java.util.Arrays;
import java.util.List;
public class Main {
//main est la méthode qui est appelée au lancement du programme
public static void main(String[] args) {
//On initialise une liste avec les caractères qui composent le fameux "Hello world !"
//Attention à bien utiliser des simples quotes pour les caractères et non des guillemets
//On utilise Arrays.asList() pour créer une liste à partir d'un tableau de caractères
List<Character> list = Arrays.asList(new Character[]{'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', ' ', '!'});
//On initialise une chaîne de caractères vide
String str = "";
//On parcourt chaque caractère de la liste
for(Character c : list){
//Pour chaque caractère on l'ajoute à la chaîne de caractères
str += c; //str = str + c fonctionne également
}
//À la fin on affiche la chaîne de caractères qui a été concaténée
System.out.println(str);
}
}
Résultat :
Hello World !
Process finished with exit code 0
Architecture client/serveur
Le terme serveur désigne deux notions différentes :
- Un ordinateur serveur (par exemple un ordinateur dans un data center) : ils sont souvent très puissants, ils ont la particularité d’être destinés à héberger des logiciels serveur.
- Un logiciel serveur (par exemple minecraft-server.jar) : c’est un logiciel qui sert uniquement à répondre à des requêtes et qui n’a pas forcément d’interface graphique (c’est-à-dire que l’on ne le manipule qu’avec des commandes ou en éditant ses fichiers de configuration).
L’architecture contient un client (le logiciel que constitue votre jeu) et un serveur (le logiciel auquel chaque jeu se connecte pour pouvoir jouer en groupe). Elle est présente dans énormément de contextes en informatique.
Par exemple, dans Minecraft, si vous avancez dans le jeu, alors le client envoie une requête au serveur, qui sera pris en compte en sauvegardant votre nouvelle position. Le serveur va vous envoyer les données de nouveaux paquets de blocs qui vont entrer dans votre champ de vision et que votre jeu pourra ainsi afficher (dans Minecraft ce sont des chunks).
Ceci est un exemple théorique visant à vous montrer comment fonctionne une architecture client/serveur. En effet, nous n’avons pas regardé précisément comment Minecraft gère les échanges client/serveur lors des déplacements des joueurs. Et ce qui est génial, c’est que nous n’avons pas besoin de le faire ! Et vous allez, dans cet article, en découvrir la raison.
Le développement Java sous Minecraft
Dans l’univers Minecraft, on dit généralement qu’il existe deux types de contenus développés en Java, que l’on peut intégrer au jeu : Des mods ou des plugins.
À l’origine, en informatique, un plugin se base sur le code d’un projet, sans le modifier. En revanche, il utilise l’interface que le projet met à disposition aux développeurs pour modifier ou ajouter des fonctionnalités au logiciel. Ça se base sur des API (telles que celles de Bukkit, Spigot, Paper ou d’autres encore). Retenez simplement, pour l’instant, qu’un logiciel peut contenir une API. Cette dernière est une interface, c’est-à-dire une sorte de prise sur laquelle on peut se brancher. En l’utilisant, on peut interagir avec le logiciel. Parfois, comme dans le cas de Minecraft, on peut ainsi modifier en profondeur son comportement. Suivant le type d’API, on peut interagir avec elle soit avec des requêtes (des données envoyées à travers le réseau) soit par programmation (en se branchant par exemple sur un événement comme le déplacement d’un joueur pour y réagir ensuite en programmant une action de notre choix).
Les mods, eux, apportent directement des modifications à un projet existant. Dans l’univers de Minecraft, il y a une légère confusion : certaines extensions que l’on nomme des mods se basent sur des API. Gardez simplement en tête que l’on parle le plus souvent de mods pour qualifier des modifications apportées au client, c’est-à-dire au jeu. Mais il existe aussi des mods serveur qui modifient le comportement du serveur de jeu et communiquent parfois avec des mods client.
Les différentes API et leur utilité
Quand Minecraft est sorti, nous n’avions accès qu’au serveur mis à disposition par Mojang. Si on voulait le modifier ou lui ajouter des fonctionnalités, il fallait décompiler le code (c’est-à-dire le traduire de nouveau pour qu’il soit lisible par un développeur). Sauf que le code avait été rendu volontairement illisible par Mojang pour protéger leur logiciel. Ainsi un espace mémoire contenant, par exemple, les points de vie d’un joueur et qui aurait dû normalement porter le nom “health” portait un nom incompréhensible : “a”, “b” ou “c”. Autant vous dire que comprendre un tel code source, c’est s’assurer de finir la journée avec une belle migraine.
C’est pourquoi les modifications se faisaient grâce à des mods, à l’origine. Mais c’était complexe. Heureusement il existe toujours des gens acharnés et très compétents. Et c’est ainsi qu’un groupe de personnes a construit “CraftBukkit”.
“CraftBukkit” c’est un serveur Minecraft modifié, qui contient le même serveur que celui fourni par Mojang mais qui lui ajoute une API nommée “bukkit”. C’est une sorte d’interface sur laquelle les autres développeurs peuvent se brancher pour apporter, à leur tour, des ajouts de fonctionnalités sur le serveur de jeu ou pour modifier son comportement.
Grâce à cette API, les développeurs n’ont pas besoin d’aller voir à quoi correspond telle ou telle donnée nommée “a”, “b” ou “c” dans le code incompréhensible du serveur distribué par Mojang. Par exemple, ils n’ont plus qu’à utiliser “player.getHealth();” et ils obtiennent ainsi l’information souhaitée, à savoir la vie du joueur. Ce fut un gigantesque pas en avant.
C’est grâce à leur travail qu’il n’est plus nécessaire de comprendre les échanges client/serveur lors des déplacements d’un joueur. Aujourd’hui grâce à ces outils mis à disposition des développeurs, il suffit de réagir, lorsqu’un événement de type “PlayerMoveEvent” est déclenché, en programmant, à partir de là, n’importe quel comportement de notre choix. Comme par exemple un message dans le chat. Ainsi, ce message apparaîtrait à chaque fois qu’un joueur se déplace. Attention au spam !
À partir de là, d’autres ont continué leur œuvre. Ils ont voulu améliorer les performances et ajouter des fonctionnalités à “CraftBukkit”, cela a donné “Spigot“ (et “Bungeecord” pour ceux qui souhaitent faire des réseaux de serveurs).
Plus récemment encore, d’autres ont souhaité améliorer Spigot et ils ont construit “Paper” qui semble notamment plus efficace en termes de performances.
C’est grâce au travail de tous ces développeurs qu’il est désormais très facile d’ajouter, sous la forme de plugin, des modifications au fonctionnement d’un serveur Minecraft et ce sans avoir à modifier le code du serveur en lui-même.
En parallèle, d’autres développeurs ne voulaient pas se contenter de modifier les fonctionnalités côté serveur. Ils voulaient aussi modifier le jeu côté client et permettre ainsi au joueur de voir, de faire ou d’entendre des choses qui auraient été impossibles en se contentant de modifier le serveur.
C’est ainsi que “Forge” puis, plus récemment, “Fabric”, ont vu le jour. Et aujourd’hui de nombreux développeurs créent leur propre launcher de Minecraft, incluant des ensembles de mods qu’ils mettent à disposition des joueurs sur des serveurs (que l’on qualifie de “moddés”).
Enfin, d’autres ont souhaité se détacher de Mojang pour éviter les problématiques de droit d’auteur et pour combiner tout cela (modifications côté client et modifications côté serveur) en fournissant un seul outil répondant à toutes ces problématiques, c’est ainsi que Sponge a vu le jour.
Comme il est impossible de parler de tout cela dans cet article, nous allons ici nous concentrer sur la création de plugins en se basant sur l’API que propose Spigot.
Mettre en place son environnement de développement
Pour programmer, les développeurs utilisent un IDE (Integrated Development Environment). Les IDE sont des logiciels dans lesquels on peut écrire du code source, le compiler et le débugger. Ils fournissent beaucoup de fonctionnalités qui facilitent toutes les étapes du développement.
Il en existe plusieurs. Pour la programmation en Java, les principaux sont IntelliJ, Eclipse et Netbeans.
Nous conseillons l’usage d’IntelliJ. Ce dernier possède une version “community” qui est disponible gratuitement pour tous.
Sa version “ultimate” contient quelques fonctionnalités additionnelles mais elle est payante (gratuit pour les étudiants en remplissant ce formulaire). Pour installer le logiciel, vous pouvez vous référer à la documentation ou au tutoriel officiel ou à ceux créés par d’autres personnes, comme celui-ci.
Comme tout IDE qui se respecte, IntelliJ supporte l’usage de plugins. Suivant ce que l’on développe et le langage que l’on utilise, certaines extensions deviennent nécessaires. Pour Minecraft et pour un débutant, nous vous conseillons les extensions suivantes :
Quelques plugins qui modifient l’apparence de l’interface utilisateur : Material Theme UI, Atom Material Icons, Rainbow Brackets. D’autres qui sont de l’ordre de l’utilitaire : Sonar, Json Parser, Gitlab CI.
Et un autre permettant de créer plus rapidement des projets prêts à l’emploi, pour le développement de plugins sous Spigot ou pour le développement de mods : Minecraft Development.
Enfin, certains plugins sont un peu plus… superficiels : Si vous souhaitez vous vanter de vos activités en montrant à tous que vous êtes en train de développer, vous pouvez installer ce plugin : Discord Integration. Il permet de mettre à jour votre statut discord si vous êtes en train d’utiliser IntelliJ.
Mettre en place son environnement de test
Pour pouvoir tester vos développements rapidement, le plus efficace est d’avoir un serveur Minecraft sur votre ordinateur.
Pour faire cela il vous faut obtenir et exécuter BuildTools [1] [2].
Pourquoi BuildTools ? Car ce logiciel est capable de récupérer le serveur Minecraft, de le décompiler, d’appliquer les modifications de Craftbukkit puis de Spigot et enfin de recompiler tout cela pour produire la version finale. C’est ainsi que l’on peut, chacun chez soi, obtenir un serveur Spigot prêt à l’emploi.
Nous vous invitons donc à suivre l’un des deux tutoriels suivants : [1] [2].
Une fois que vous possédez le fameux « spigot.jar », il s’agira de lancer le serveur pour la première fois. La création d’un fichier .bat qui vous servira de raccourci pour ce faire est également expliquée dans la documentation de Spigot.
La fenêtre noire qui s’ouvre est ce que l’on nomme la console ou, plus généralement, un terminal ou une invite de commande. Vous l’avez vu dans de nombreux films mais, au risque de contredire Hollywood, nous nous permettons de vous rassurer : le texte n’y défile pas forcément à la vitesse de la lumière. Vous pouvez donc ranger vos yeux bioniques.
Sachez que vous pouvez y inscrire des commandes liées à Minecraft comme par exemple “op VotrePseudo » pour pouvoir devenir administrateur du serveur. La liste des commandes est disponible ici. La plus importante à connaître est la commande “stop” permettant d’arrêter proprement le serveur lorsque vous n’en aurez plus besoin.
Au premier lancement, le serveur n’a pas pu démarrer. C’est normal. Arrêtez-le puis acceptez les conditions d’utilisation. Pour ce faire, changez la valeur du fichier texte eula.txt situé dans le dossier du serveur de false à true. De manière générale, si vous avez le moindre souci, nous vous invitons à lire la documentation de Spigot qui explique en détails toutes les étapes nécessaires. Relancez le serveur puis vérifiez qu’il fonctionne en vous connectant dessus avec votre client Minecraft. Pour cela, ajoutez un serveur à votre liste ayant, pour adresse, “localhost”. Localhost est le surnom qui est donné à l’adresse IP de votre ordinateur. C’est un peu comme marquer “ici” sur une lettre postale, ça ne marche donc pas partout…
Nous avons mis en place l’IDE et le serveur. Nous allons (enfin) pouvoir passer à la création de votre premier plugin !
Créer un plugin vide
Nous n’allons pas réinventer la roue. De nombreux tutoriels de qualité existent, sous la forme de textes ou de vidéos. Alors si, comme nous, vous avez fait le choix d’utiliser IntelliJ, vous pouvez suivre ce tutoriel : https://www.spigotmc.org/wiki/creating-a-blank-spigot-plugin-in-intellij-idea/
Si au contraire vous avez préféré utiliser Eclipse, un autre tutoriel a été posté ici : https://www.minecraft-france.fr/tutoriel-creer-un-plugin-minecraft-spigo
Une fois que cela est fait, compilez votre code (comme expliqué dans les tutoriels), puis déplacez le fichier jar généré dans le dossier /plugins/ de votre serveur. Lancez le serveur et vérifiez que le nom de votre plugin apparaît bien dans la liste des plugins qui démarrent. Dans notre cas, nous avons pu voir au sein de la console : “[SkyTuto] Enabling SkyTuto v1.0-SNAPSHOT”.
La suite au prochain épisode
C’est tout pour cette fois. Dans le prochain article de cette série consacrée au développement, nous allons (enfin) commencer à créer des fonctionnalités.
Sachez simplement que nos développeurs, lorsqu’ils préparaient le code nécessaire au tutoriel suivant, ont sauvagement assassiné une map !
À la suite de quoi ils se sont lâchement enfui, s’envolant tels des fusées, vers d’autres cieux.
Petite répetition ici, ces deux liens sont indiqués en double dans le meme paragraphe.
Pour faire cela il vous faut obtenir et exécuter BuildTools [1] [2].
(…)
Nous vous invitons donc à suivre l’un des deux tutoriels suivants : [1] [2].
Oups, j’ai fait un lapsus en inversant modpack et datapack dans ma réponse précédente. Je pense que ceux qui m’ont lu auront compris mais bon je préfère préciser.
Tu as raison sur deux points Yax:
Par contre je pense qu’il ne faut pas considérer nécessairement qu’une map aventure ne se réalise qu’en utilisant des blocs de commande ou des modpacks. Ce serait une erreur à mes yeux.
Le développement Java peut être utile pour créer une map aventure, que ce soit sous la forme de plugins (pour une map multijoueur destinée à être jouée sur un serveur) ou sous la forme de mods (principalement pour des maps solos mais aussi pour des maps multijoueurs).
L’utilité du développement, outre le fait que les mods peuvent permettre d’apporter des possibilités tout simplement inaccessibles sans modification du client, provient du fait qu’il est plus simple de faire des choses très complexes avec un langage de programmation objet largement reconnu tel que Java, plutôt qu’avec des modpacks. Ainsi, avec cet outil plus « puissant » qu’est Java, on peut aller plus loin dans nos créations.
Au final, à mes yeux, il n’y a pas UNE stratégie valide, il s’agit juste de comprendre et de choisir consciemment les contraintes que l’on s’impose, comme dans tout projet.
Tu peux très bien concevoir des mods pour qu’ils fonctionnent avec ta map aventure :)
Quel rapport avec des maps aventures ?