4 points par GN⁺ 2024-03-04 | 1 commentaires | Partager sur WhatsApp

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

 
GN⁺ 2024-03-04
Avis sur Hacker News
  • Expérience avec un serveur Minecraft scriptable

    Un utilisateur ayant beaucoup d'expérience sur des serveurs Minecraft scriptables pour Java et Bedrock (ScraM) juge cela impressionnant. Il voudrait attribuer des points bonus pour l'utilisation du mot « duckduckgoing » dans une phrase. La discussion compte 92 commentaires.

  • Compréhension des exposants négatifs

    Il mentionne qu'un exposant négatif, c'est-à-dire 2^(-n), est égal à 1/(2^n), et se dit surpris que l'auteur ne se soit pas souvenu de son propre exemple 2^-1 = 0.5 et ait demandé de l'aide à awk. Il suggère qu'en utilisant la bibliothèque ctypes.sh, il aurait été possible d'accéder à libm, poll(), select() et autres depuis bash.

  • Éloge d'un vrai site de hackers

    Il dit que c'est un véritable site de hackers et que c'est excellent.

  • Affection pour bash

    Il dit aimer bash, autant que vim et lua. Il souligne qu'avec un binaire unique de moins de 2 Mo, c'est bien plus capable que beaucoup ne l'imaginent. Il mentionne qu'avec shellcheck et de bonnes pratiques, bash peut aussi être lisible et sûr. Si des fonctionnalités supplémentaires sont nécessaires, il explique qu'on peut ajouter des utilitaires en C/C++ sans recourir à des méthodes complexes comme la FFI, et sans faire venir d'innombrables dépendances obscures via pip/npm, etc.

  • Surprise face à la programmation en bash

    Il n'est pas très à l'aise avec la programmation en bash, mais exprime sa surprise devant ses capacités réelles.

  • Curiosité sur l'écriture de serveurs personnalisés

    Il se demande si l'écriture de serveurs personnalisés pour des jeux commerciaux est encore à la mode.

  • Éloge de Minecraft

    Il considère Minecraft comme l'un des plus grands jeux depuis Quake.

  • Admiration pour l'implémentation de Minecraft

    Il dit avoir lu de nombreux articles sur la manière dont Minecraft est implémenté, mais que celui-ci est vraiment stupéfiant, probablement l'une des meilleures explications techniques qu'il ait lues. Il qualifie cela de tout premier ordre.