Réflexions sur un serveur Minecraft écrit en Bash
- Réflexion sur l’idée d’écrire un serveur Minecraft en Bash.
- Une tentative avait déjà été faite en 2009 avec le protocole classique, mais les limites de Bash pour analyser des données binaires s’étaient fait sentir.
- Une méthode a été imaginée pour lire les données avec
read et afficher un dump hexadécimal avec xxd.
- Bash ignore les octets nuls et il n’existe aucun moyen de les détecter, ce qui peut corrompre les données.
Lecture des octets nuls dans Bash
- Une méthode a été trouvée pour traiter des données binaires contenant des octets nuls à l’aide de
dd et xxd.
- Cette méthode permet d’effectuer du pattern matching, de l’extraction de données, etc.
ncat est utilisé pour écouter sur le port TCP par défaut de Minecraft et, lorsqu’une connexion arrive, exécuter le script shell principal (mc.sh).
Le protocole n’est en fait pas très bon
- La première chose à implémenter pour qu’un serveur Minecraft fonctionne est le paquet de ping de la liste des serveurs.
- Les difficultés liées à l’implémentation de types de données comme VarInts et VarLongs sont expliquées.
- L’encodage LEB128 est utilisé pour implémenter les nombres VarInt/VarLong.
- L’implémentation des nombres à virgule flottante IEEE754 a posé problème, et
awk a été utilisé pour le résoudre.
Le type de données "Position"
- Le type de données Position créé par Mojang stocke les coordonnées X, Y, Z dans une valeur Long de 64 bits.
- Ce type de données peut être implémenté assez facilement en Bash.
Named Binary Tag
- NBT est un format comparable à JSON pour les données binaires, créé par Mojang.
- L’implémentation d’un parseur NBT était presque terminée, mais le répertoire du projet utilisait un tmpfs et un plantage du système a entraîné la perte du code.
Écriture du vrai serveur
- Au-delà des aspects mathématiques, on arrive à la partie amusante consistant à construire le vrai serveur.
- Pour rejoindre le serveur, le client doit terminer le processus de handshake et envoyer quelques paquets.
- Les structures de données des paquets Join Game et Chunk constituent le principal obstacle.
Système de "plugins"
- Pour permettre au serveur de faire davantage que gérer de simples chunks, des fonctions surchargeables appelées
hooks ont été créées, ainsi qu’une option permettant au serveur de charger du code utilisateur.
- Cela permet d’implémenter des fonctionnalités variées, allant de la modification de l’apparence du monde au fait de faire produire au joueur un bruit de clic à chaque mouvement de souris.
Particularités de Witchcraft
- Bash a des limites pour manipuler les nombres décimaux.
- Le multijoueur ne fonctionne pas complètement.
- Witchcraft est un serveur multithread, mais il utilise des hacks pour la communication entre threads.
- Les échanges de données sont lents.
- Il ne fonctionne que si une version récente de BusyBox (1.35.0) est installée.
FAQ
- Questions-réponses sur l’origine des ID de blocs, celle du nom "WitchCraft", etc.
Ressources
- Liens vers des ressources comme le dépôt Witchcraft et la documentation du protocole sur wiki.vg.
L’avis de GN⁺
- Ce projet montre la créativité et la capacité de résolution de problèmes d’un développeur cherchant à dépasser les limites de Bash.
- Implémenter un serveur Minecraft en Bash peut être très inefficace, mais ce type d’approche expérimentale peut aider à trouver de nouvelles solutions.
- Il n’est pas recommandé d’appliquer cette technique à un vrai serveur de jeu, mais elle peut être utile pour comprendre les limites d’un langage de script et apprendre à les dépasser.
- Parmi les implémentations de serveur Minecraft plus efficaces offrant des fonctions similaires, on trouve des serveurs écrits en Java ou en C++.
- Ce projet peut constituer un support pédagogique utile pour comprendre comment traiter des protocoles réseau complexes avec Bash.
1 commentaires
Avis sur Hacker News
Expérience avec un serveur Minecraft scriptable
Compréhension des exposants négatifs
Éloge d'un vrai site de hackers
Affection pour bash
Surprise face à la programmation en bash
Curiosité sur l'écriture de serveurs personnalisés
Éloge de Minecraft
Admiration pour l'implémentation de Minecraft