Show HN : Pumpkin, un serveur Minecraft moderne écrit en Rust
(github.com/Snowiiii)- Pumpkin est un serveur Minecraft conçu uniquement en Rust, avec pour objectif d’offrir une expérience serveur rapide, efficace et personnalisable, tout en respectant les mécanismes fondamentaux du jeu
- Ses objectifs sont les suivants : performance basée sur le multithreading, compatibilité avec les dernières versions des serveurs Minecraft Java et Bedrock, respect des mécaniques de jeu Vanilla, prévention des vulnérabilités de sécurité connues, haut niveau de configuration et base pour le développement de plugins
- Le périmètre fonctionnel est réparti entre les domaines protocole, monde, joueur, entités, serveur et proxy, avec notamment Server Status/Ping, Encryption, Packet Compression, Java/Bedrock, World Loading/Saving, Lighting, Entity Spawning, Inventory, RCON, Permissions, Bungeecord et Velocity
- Le projet est actuellement en phase de développement active avant la 1.0.0 ; Advancements et Villagers sont marqués comme incomplets, tandis que Mobs, Animals et Non-Living Entities sont indiqués comme W.I.P
- L’exécution suit la documentation Quick Start, et le projet propose la documentation, Discord, GitHub Sponsors et CONTRIBUTING.md comme points d’entrée pour l’usage, la participation communautaire, le soutien et les contributions
Objectif et état de Pumpkin
- Pumpkin est un serveur Minecraft écrit uniquement en Rust
- Il vise à fournir une expérience rapide, efficace et personnalisable, tout en respectant les mécaniques de jeu fondamentales de Minecraft
- Le projet est actuellement en état de heavy development
- Les travaux nécessaires avant la sortie de la version 1.0.0 peuvent être consultés dans l’issue correspondante
Objectifs de conception
- Performance : l’objectif est d’améliorer la vitesse et l’efficacité grâce au multithreading
- Compatibility : prise en charge des dernières versions des serveurs Minecraft Java et Bedrock, avec respect des mécaniques de jeu Vanilla
- Security : priorité à la prévention des exploits de sécurité connus
- Flexibility : offre un haut niveau de configuration permettant de désactiver les fonctionnalités inutiles
- Extensibility : fournit une base pour le développement de plugins
Périmètre des fonctionnalités implémentées
-
Configuration
- Prise en charge d’une configuration basée sur TOML
-
Protocole
- Tracking: Protocol
- Server Status/Ping, Encryption, Packet Compression et Java/Bedrock sont cochés comme pris en charge
-
Monde
- Tracking: World
- Prise en charge de Player Tab-list, Scoreboard, World Loading, World Time, World Borders, World Saving, Lighting, Entity Spawning et Bossbar
- Chunk Loading et Chunk Saving sont cochés sous les formes Vanilla, Linear et Pump
- Comprend aussi les éléments Chunk Generation, Redstone et Liquid Physics
-
Joueur
- Tracking: Player
- Skins, Teleport, Movement, Animation, Inventory, Experience, Hunger, Off Hand et Eating sont cochés
- Combat est relié comme élément de suivi séparé
- Advancements est indiqué comme incomplet
Entités, serveur et proxy
-
Entities
- Les entités non vivantes incluent Minecart, Eggs, etc., et sont marquées comme W.I.P
- Entity Effects, Players, Boss et Entity Saving sont cochés
- Mobs et Animals sont marqués comme W.I.P
- Entity AI est relié comme élément de suivi séparé
- Villagers est indiqué comme incomplet
-
Server
-
Proxy
- Bungeecord et Velocity sont cochés
Exécution, documentation et communauté
- La méthode d’exécution est disponible dans le guide Quick Start
- La documentation est fournie sur pumpkinmc.org
- Les contributions sont les bienvenues, avec invitation à consulter CONTRIBUTING.md
- Un serveur Discord est proposé pour les mises à jour, les événements et les échanges entre membres
- Il est possible de soutenir le projet via GitHub Sponsors
1 commentaires
Avis sur Hacker News
https://dayssincelastrustmcserver.com/
Vu l’ampleur du jeu, créer un serveur Minecraft dans n’importe quel langage n’a rien de simple, et c’est surprenant qu’il en existe déjà sept rien qu’en Rust
L’écart de performances dans les benchmarks est assez impressionnant, mais il semble que la génération et la sauvegarde du monde soient absentes, alors que ce sont deux opérations coûteuses
La génération de chunks, en particulier, peut mettre à genoux un petit VPS. Les benchmarks ont probablement été mesurés au repos, donc je serais curieux de voir la comparaison une fois ces fonctions ajoutées et utilisées en conditions réelles
Je ne vois pas non plus de prise en charge de la destruction/pose de blocs ; dans ce cas, le serveur devra sans doute recalculer l’éclairage et mettre à jour les chunks
Enfin, je me demande s’il est prévu d’ajouter des fonctions avancées comme les tableaux de score, les équipes ou le parsing des blocs de commande. Mojang a publié Brigadier en open source pour cela
J’espère que le projet deviendra assez mature pour faciliter l’exploitation de serveurs même sur du matériel modeste
La pose et la destruction de blocs sont déjà prises en charge, mais pas encore l’éclairage, donc pour l’instant tout apparaît sombre. C’est en cours
J’aimerais aussi ajouter des fonctions comme les tableaux de score et les équipes, et il existe déjà une API utilisable pour les commandes, proche de Brigadier
Je veux permettre aux joueurs d’héberger des serveurs même sur du matériel peu puissant, et j’ai l’intention de tester un jour Pumpkin sur quelque chose comme un Raspberry Pi
Comme le temps de résidence est stocké dans les chunks, si l’on veut appliquer plus tard une logique de génération de chunks mise à jour, on peut aussi ne régénérer que les chunks qui n’ont pas encore été visités
Les réimplémentations de serveurs Minecraft sont assez intéressantes, et c’est toujours agréable d’en voir de nouvelles. Il existe aussi des implémentations de serveurs à usage spécifique, comme MCHPRS pour la compilation rapide de redstone destinée au Minecraft technique
Je me demande s’il y a des benchmarks. À quel point est-ce plus rapide qu’un serveur vanilla ?
Les serveurs Minecraft voient leur consommation de ressources exploser à mesure que le nombre de joueurs augmente, et même avec un serveur très puissant, on obtient souvent un mauvais TPS
https://snowiiii.github.io/Pumpkin/about/benchmarks.html
J’ai récemment développé Pumpkin. C’est un serveur Minecraft efficace et rapide, entièrement écrit from scratch en Rust, donc j’aimerais bien que vous y jetiez un œil
Un paquet de Uno n’est pas un remplaçant drop-in d’un paquet pour Hearts, mais ce sont simplement deux jeux de cartes ; pour autant, ce ne sont pas tous les deux des paquets de Uno
À moins que cela veuille dire que Pumpkin se comporte différemment de vanilla en dehors du réseau, et qu’un monde créé avec vanilla pourrait ne pas s’ouvrir avec Pumpkin ?
Je connaissais ce projet depuis un moment et j’étais aussi sur le Discord. J’ai depuis supprimé mon compte Discord pour préserver ma santé mentale
Je suis content de voir que Hacker News semble bien apprécier ce projet. 140 upvotes, c’est plutôt correct à mon avis
Dans mon souvenir, il existait aussi un autre serveur écrit en Rust, mais je ne sais plus exactement lequel
La dernière fois que je l’ai vu, c’était vraiment un logiciel en alpha très précoce, mais le rythme de développement était bon. Je ne sais pas où il en est maintenant, et je me souviens que l’auteur était parti passer des examens à cette période
J’ai terminé mes examens la semaine dernière et je suis maintenant en vacances, donc les commits sont revenus à leur rythme habituel
Je me demande si le thread principal est shardé par région, comme avec Paper Folia par exemple, ou si seules les entités non-bloc sont séparées dans un thread distinct
J’attends que Minecraft soit suffisamment rétro-ingéniéré pour que plusieurs implémentations de serveurs et de clients deviennent simplement compatibles comme avec un protocole propre
Je vais essayer. Les performances du jar vanilla pur sont vraiment trop mauvaises. C’est quelque chose que j’aimerais voir Mojang améliorer
Pour autant que je sache, la génération de nouveaux chunks est au moins multithreadée
J’aimerais aussi qu’il y ait un support officiel pour le contrôle de base des serveurs SMP. Une région définie par deux coordonnées de sommets, avec des permissions de base comme poser, casser et interagir, suffirait
Un simple fichier de configuration ferait l’affaire, et les requêtes ou les mises à jour pourraient être gérées par d’autres outils. Un petit utilitaire de ligne de commande en jeu pour les administrateurs serait aussi acceptable
Je voudrais simplement ne pas toujours devoir utiliser une liste blanche fermée. Je sais qu’il existe des plugins pour Paper/Waterfall, etc., mais il y a des avantages à rester en vanilla pur
Je maintiens un serveur en vie depuis longtemps
J’aimerais que tout ce que tu as listé soit configurable via un fichier de configuration, donc il y a de bonnes chances que ça te plaise
En cas de problème, tu peux consulter https://snowiiii.github.io/Pumpkin/troubleshooting/common_is... ou demander de l’aide sur Discord
Cela fait 0 jour qu’un nouveau serveur Minecraft écrit en Rust est sorti
https://dayssincelastrustmcserver.com/
Sur 7 au total, les 3 premiers sont morts, et les 3 plus récents sont tous des projets de 2024, Pumpkin compris. Les projets de 2024 indiquent tous explicitement ce qui les distingue de Valence, qui ressemble davantage à un framework axé sur la modularité
Les 3 plus récents semblent être des concurrents sains et bienveillants les uns envers les autres
C’est une bonne référence pour quiconque veut apprendre comment faire ce genre de choses sur la BEAM : https://github.com/thecodeboss/minecraft
Que signifie modern ici ?
Minecraft a été créé en 2011 et, selon Wikipédia, la dernière version de l’édition « classic » est sortie en 2017. Donc tout ce qui date d’après 2017 n’est pas vraiment ancien
Réécrire quelque chose n’est pas un problème en soi, mais mettre en avant « modern » comme une valeur est assez vague, et il est souvent discutable que ce soit objectivement meilleur
On veut aussi utiliser des fonctionnalités modernes comme le multithreading ou Rust. Je considère Rust comme un langage moderne conçu pour corriger les erreurs des anciens langages
Par exemple, SQLite ne serait probablement pas qualifié de modern, mais comme tout le monde l’aime, ça n’a pas d’importance