Sous le capot de BeiDou-Server : Une approche moderne de l'émulation de serveur MapleStory avec Java 21
Ceulx qui ont assisté à l'âge d'or des MMORPG côté client à la fin des années 2000 se souviennent probablement de MapleStory. À son apogée, ce jeu de grinding 2D a engendré une immense communauté de fans. À l'époque, les serveurs privés étaient assemblés tant bien que mal : on prenait le code source d'OdinMS ou HeavenMS, on y collait une multitude de correctifs pour Java 6, on importait manuellement un dump de base de données massif via une ancienne version de Navicat, et on espérait que ça ne planterait pas dès que cent joueurs se connecteraient.
La plupart de ces émulateurs se sont enlisés dans du code hérité vieux de quinze ans. Les développeurs du projet BeiDou-Server ont décidé d'emprunter une voie différente. En s'appuyant sur le projet Cosmic, ils se sont donné pour mission de réécrire et d'optimiser le code côté serveur en utilisant une pile technologique moderne : JDK 21, MySQL 8, API REST avec Swagger, et un frontend Node.js isolé pour l'administration.
De quoi se compose l'architecture de BeiDou-Server
Le projet est divisé en deux composants principaux : le backend gms-server, responsable de la logique de jeu et de l'API, et l'interface web gms-ui. Les développeurs ont abandonné la prise en charge des anciennes versions de MySQL — la version 8.0 ou supérieure est requise pour l'exécution.
La surprise la plus agréable lors de la première examination du code est l'automatisation des tâches routine au premier lancement. Le serveur vérifie automatiquement si le schéma requis existe dans le SGBD, crée les tables et applique les scripts SQL initiaux. Il n'est plus nécessaire d'installer des utilitaires tiers pour l'importation de la base de données.
Points forts de l'architecture backend
- Migration vers OpenJDK 21. L'utilisation de la dernière version de Java a permis d'éliminer les constructions obsolètes et d'appliquer des fonctionnalités modernes du langage pour la gestion des paquets réseau et de la mémoire.
- API REST sur le port 8686. Les développeurs ont intégré Swagger UI, disponible immédiatement après le démarrage du service. Cela simplifie considérablement le débogage et l'intégration avec les services externes.
- Gestion de version des endpoints. Le projet implémente un schéma de versioning d'API propre via la constante
ApiConstant.LATEST. Si une méthode n'a pas changé dans la nouvelle version de l'application, il n'est pas nécessaire de la dupliquer — le routage redirige automatiquement les requêtes vers le contrôleur actuel. - Moteur de ressources multilingue. Le serveur peut charger dynamiquement les données de jeu et les scripts localisés depuis différents répertoires (par exemple,
wz-zh-CNpour le chinois ouscript-en-USpour l'anglais).
Panneau d'administration web et gestion des graphiques
L'interface gms-ui est construite sur Node.js v20.15.0 en utilisant le gestionnaire de paquets Yarn. Contrairement aux anciens émulateurs où le panneau d'administration était un chaos de formulaires Swing intégrés au serveur lui-même, ici le panneau est entièrement basé sur le web.
Le problème du stockage et de l'affichage de milliers de sprites d'objets, de monstres et de graphiques de cartes est résolu de manière élégante. Pour éviter d'encombrer le dépôt avec des gigaoctets de ressources graphiques, le panneau web demande les images directement via l'API externe du service maplestory.io.
Déploiement et gestion des conteneurs
Déploiement et travail avec les conteneurs
Auparavant, les configurations Docker vivaient directement dans le dépôt principal, mais avec le temps, les auteurs ont déplacé tout ce qui concernait la conteneurisation vers un projet séparé BeiDou-docker. Une image prête à l'emploi beidou-server-all est déjà disponible dans GitHub Packages, vous pouvez donc déployer un environnement de test en quelques minutes sans compiler depuis les sources.
Pour le développement local, vous aurez besoin de l'outillage standard :
- OpenJDK 21
- IntelliJ IDEA 2023.3 ou version ultérieure
- SGBD MySQL 8
- Git et Maven
Les binaires du serveur pré-construits et les clients sont disponibles dans la section Releases, et pour ceux qui souhaitent tester les versions expérimentales, il existe une branche séparée avec les premières versions bêta.
Défis potentiels auxquels vous pourriez être confronté
Le principal écueil de BeiDou-Server est la barrière linguistique. Le projet est créé par une communauté sinophone, donc la plupart des commentaires de code, des discussions sur les issues et des pages Wiki sont rédigés en chinois.
Cependant, avec Swagger et une structure de répertoires claire, la navigation dans le code est devenue beaucoup plus facile même sans connaissance de la langue. De plus, les auteurs ont rendu le Wiki du projet entièrement ouvert aux contributions de la communauté, de sorte que la documentation est progressivement complétée en anglais également.
À qui ce projet pourrait-il plaire
BeiDou-Server est un excellent exemple de la façon dont des passionnés transforment un code hérité monstrueux d'un ancien jeu en ligne en un projet comprehensible avec une pile technologique moderne.
Si vous êtes passionné par le développement de jeux, que vous souhaitez explorer le fonctionnement des protocoles réseau des MMORPG, voir des exemples concrets d'organisation d'API REST multi-versions en Java, ou simplement ressentir de la nostalgie pour les anciens jeux — ces codes sources méritent définitivement d'être explorés.
Projets similaires