4 Punkte von GN⁺ 2024-03-04 | 1 Kommentare | Auf WhatsApp teilen

Gedanken zu einem in Bash geschriebenen Minecraft-Server

  • Betrachtungen darüber, einen Minecraft-Server in Bash zu schreiben.
  • Zuvor wurde 2009 ein Versuch mit dem Classic-Protokoll unternommen, dabei wurden jedoch Grenzen beim Parsen von Binärdaten in Bash festgestellt.
  • Es wurde eine Methode entwickelt, um mit read und xxd Daten zu lesen und Hex-Dumps auszugeben.
  • Bash ignoriert Nullbytes, und es gibt keine Möglichkeit, sie zu erkennen, wodurch Daten beschädigt werden können.

Nullbytes in Bash lesen

  • Es wurde eine Methode entdeckt, um mit dd und xxd Binärdaten einschließlich Nullbytes zu verarbeiten.
  • Mit dieser Methode sind Pattern Matching, Datenextraktion und Ähnliches möglich.
  • Mit ncat wird auf dem Standard-TCP-Port von Minecraft gelauscht, und sobald eine Verbindung eingeht, wird das Haupt-Shell-Skript (mc.sh) ausgeführt.

Das Protokoll ist eigentlich nicht besonders gut

  • Das Erste, was implementiert werden muss, damit ein Minecraft-Server funktioniert, ist das Server-List-Ping-Paket.
  • Die Schwierigkeiten bei der Implementierung von Datentypen wie VarInts und VarLongs werden erläutert.
  • Zur Implementierung von VarInt-/VarLong-Zahlen wird das LEB128-Encoding verwendet.
  • Bei der Implementierung von IEEE754-Gleitkommazahlen traten Schwierigkeiten auf, die mit awk gelöst wurden.

Der Datentyp "Position"

  • Der von Mojang entwickelte Datentyp Position speichert X-, Y- und Z-Koordinaten in einem 64-Bit-Long-Wert.
  • Dieser Datentyp lässt sich in Bash relativ einfach implementieren.

Named Binary Tag

  • NBT ist ein von Mojang entwickeltes JSON-ähnliches Format für Binärdaten.
  • Der NBT-Parser war fast fertig, doch weil das Projektverzeichnis auf tmpfs lag und das System abstürzte, ging der Code verloren.

Den eigentlichen Server schreiben

  • Nach den mathematischen Aspekten beginnt der interessante Teil: das Bauen des eigentlichen Servers.
  • Damit ein Client dem Server beitreten kann, muss er den Handshake abschließen und einige Pakete senden.
  • Die Datenstrukturen im Join-Game-Paket und im Chunk-Paket sind die größten Hürden.

"Plugin"-System

  • Damit der Server über einfache Chunks hinaus mehr tun kann, wurden überschreibbare Funktionen als Hooks sowie eine Option geschaffen, mit der der Server Benutzercode laden kann.
  • Dadurch lässt sich alles Mögliche umsetzen: vom Verändern des Aussehens der Welt bis dazu, dass der Spieler beim Bewegen der Maus Tick-Geräusche macht.

Besonderheiten von Witchcraft

  • Bash hat Einschränkungen beim Umgang mit Dezimalzahlen.
  • Multiplayer funktioniert nicht vollständig.
  • Witchcraft ist ein Multithread-Server, verwendet für die Kommunikation zwischen Threads jedoch Hacks.
  • Der Datenaustausch ist langsam.
  • Es läuft nur, wenn ein aktuelles BusyBox (1.35.0) installiert ist.

FAQ

  • Fragen und Antworten dazu, woher die Block-IDs kommen und wie der Name "WitchCraft" entstanden ist.

Ressourcen

  • Links zu Ressourcen wie dem Witchcraft-Repository und der Protokolldokumentation von wiki.vg.

Meinung von GN⁺

  • Dieses Projekt zeigt die Kreativität und Problemlösungsfähigkeit eines Entwicklers, der die Grenzen von Bash überwinden will.
  • Die Implementierung eines Minecraft-Servers in Bash mag sehr ineffizient sein, doch ein solcher experimenteller Ansatz kann helfen, neue Lösungen zu finden.
  • Der Einsatz dieser Technik für einen echten Game-Server ist nicht empfehlenswert, kann aber nützlich sein, um die Grenzen von Skriptsprachen zu verstehen und zu lernen, wie man sie überwindet.
  • Effizientere Server-Implementierungen mit ähnlicher Funktionalität für Minecraft sind etwa in Java oder C++ geschrieben.
  • Das Projekt kann als nützliches Lehrmaterial dienen, um zu verstehen, wie man mit Bash komplexe Netzwerkprotokolle behandelt.

1 Kommentare

 
GN⁺ 2024-03-04
Hacker-News-Kommentare
  • Erfahrungen mit einem skriptbaren Minecraft-Server

    Ein Nutzer mit viel Erfahrung bei der Arbeit an skriptbaren Minecraft-Servern für Java und Bedrock (ScraM) bewertet dies als beeindruckend. Er würde gern Zusatzpunkte dafür vergeben, dass das Wort „duckduckgoing“ in einem Satz verwendet wurde. Die Diskussion hat 92 Kommentare.

  • Verständnis negativer Exponenten

    Es wird erwähnt, dass negative Exponenten, also 2^(-n), gleich 1/(2^n) sind, und Verwunderung darüber geäußert, dass der Autor sich nicht an sein eigenes Beispiel 2^-1 = 0.5 erinnerte und awk um Hilfe bat. Es wird vorgeschlagen, dass man mit der Bibliothek ctypes.sh in bash auf libm, poll(), select() usw. hätte zugreifen können.

  • Lob für eine echte Hacker-Seite

    Es wird gelobt, dass dies eine echte Hacker-Seite sei, und als sehr großartig bezeichnet.

  • Zuneigung zu bash

    Es wird gesagt, dass bash sehr geschätzt werde, ebenso wie vim und lua. Hervorgehoben wird, dass es sich um eine einzelne Binärdatei von weniger als 2 MB handelt und bash viel leistungsfähiger ist, als viele denken. Mit shellcheck und guten Gewohnheiten könne bash auch gut lesbar und sicher sein. Falls zusätzliche Funktionen nötig seien, könne man Utilities auch mit C/C++ ergänzen, ohne komplexe Methoden wie FFI zu nutzen, und müsse nicht mit pip/npm unzählige schwer durchschaubare Abhängigkeiten einbinden.

  • Überraschung über bash-Programmierung

    Obwohl keine große Vertrautheit mit bash-Programmierung besteht, wird Überraschung darüber ausgedrückt, wie leistungsfähig sie tatsächlich ist.

  • Neugier auf das Schreiben von Custom-Servern

    Es wird die Frage gestellt, ob das Schreiben von Custom-Servern für kommerzielle Spiele noch immer verbreitet ist.

  • Lob für Minecraft

    Minecraft wird als eines der großartigsten Spiele seit Quake bewertet.

  • Bewunderung für die Minecraft-Implementierung

    Es wird gesagt, dass zwar schon viele Artikel darüber gelesen wurden, wie Minecraft implementiert ist, dies hier aber wirklich erstaunlich sei und wahrscheinlich eine der besten technischen Erklärungen überhaupt, die man gelesen habe. Es wird als absolute Spitzenklasse gelobt.