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
Hacker-News-Kommentare
Erfahrungen mit einem skriptbaren Minecraft-Server
Verständnis negativer Exponenten
Lob für eine echte Hacker-Seite
Zuneigung zu bash
Überraschung über bash-Programmierung
Neugier auf das Schreiben von Custom-Servern
Lob für Minecraft
Bewunderung für die Minecraft-Implementierung