Easy Minecraft Client / Bot - Open Source Release
Die letzten Tage und Stunden habe ich mit dem Schreiben eines Minecraft-Clients zugebracht. Entstanden ist eine Mischung aus Client und Bot, beides ist nicht vollständig implementiert. Die Features belaufen sich daher auf mehr oder weniger ein Minimum:
- Handshake, Login, Keep-Alive
- Empfangen von Prechunks und Chunks
- Parsen dieser Chunks
- Chat senden
- Bewegung in der Minecraft Welt
- Finden von beliebigen Blöcken, u.a. Diamant
- Fliegen zum nächsten Diamant oder zum SpawnPoint
Das Problem des Minecraft-Protokolls ist folgendes: Es werden mehrere zu parsende Packets in einer Reihe gesendet, daher müssten ALLE Pakete geparsed werden um an Folgepakete zu kommen. Viele Pakete haben eine dynamische Größe und können daher nicht einfach “übersprungen” werden.
Im Internet gibt es genügend Informationen, besonders Hilfreich war die detaillierte Protokollbeschriebung einer fleißigen Community sowie der Leitfaden zu “How to write a Minecraft Client”. Das beiliegende Projekt ist komplett selbst geschrieben, es wurde auf Vorlagen wie z.B. den Uberminer verzichtet. Gerade das Paket-Handling hätte man eleganter über Delegates lösen können, aber ich war zu faul das alles nochmal umzuschreiben.
Es gab 2 Punkte an denen ich das Projekt gerne gelöscht hätte, aber bekanntlich wird man von allem stärker was einen nicht umbringt. Zunächst war da die allererste Positionsangabe des Clienten. Egal was ich machte, der Server schickte einfach kein 0X0D (Player Position + Rotation) Paket. Schlussendlich stelle sich herraus, dass ich ein früheres Paket fehlerhaft parste, was zu einem Abbruch des Parsings führte.
Die zweite Krise liegt nur ein paar Stunden zurück. Nachdem für alle Chunks Speicher reserviert wurde (= Prechunk 0×32), musste exakt alle 50 ms die aktuelle Position gesendet werden um Chunks zu erhalten. Im Wiki wurde dafür das 0x0D Packet (Player Position + Rotation) verwendet. Egal was ich machte, ich erhielt einfach keine Chunks! In einem letzten Versuch ändere ich den Pakettype von 0x0D auf 0x0A (Nur Position, keine Rotation) und es klappte. Das Parsen der Chunks war dann nach 2 Stunden auch soweit funktionstüchtig.
Der Bot arbeitet komplett Konsolenbasiert, vielleicht wird bei Gelegenheit noch eine UI dazugeschrieben. In der Konsole werden z.Z ein paar Debugausgaben dargestellt, ein komplettes Logfile (Achtung, groß!) befindet sich unter Logfile/Logfile.txt.
Der Bot ist keineswegs Vollständig! Alle Packets bezüglich der Interaktion mit der Umgebung (Blocks, Mining, Item Spawn) werden ignoriert, genau wie alle Bewegungspakete von sog. Entities, also auch Mitspielern.
Die Steuerung zum Testen des Bots erfolgt über folgende Keys:
- Up und Down Key: Verschiebung in X-Richtung
- Left und Right Key: Verschiebung in Z-Richtung (Y = Höhe!)
- X und Y Key: Verschiebung in Y-Richtung
Die Summe der Commands ist ebenfalls in Grenzen gehalten:
- !FINDD - Findet Diamanten im aktuellen Chunk
- !flytod - Fliegt über den ersten gefundenen Diamanten (danach einfach Runtergraben)
- !flytospawn - Fliegt an den Spawn-Punkt
Hier noch meine server.properties, falls jemand den Bot lokal testen will. Diese beinhaltet die Erlaubnis zu fliegen (sonst nach 5 Sekunden Kick) und schaltet alle Entites (Monster, NPCs, Tiere) aus ( = weniger Pakete zu parsen :D)
Der Herzschlag des Bots (ServerManager und PacketManager) ist ausreichend kommentiert, alle andere Klassen haben eine kleine Beschreibung beliegend. Das Projekt hat damit ca. 3000 Zeilen, sollte überschaubar sein Allerdings ist fast keine Fehlerprüfung eingebaut, unter Normalbedingungen hatte ich aber nie irgendwelche Exceptions.
Das Projekt sollte gut erweiterbar sein, würde mich freuen wenn jemand ein paar “Erweiterungen” schreiben würde.
DOWNLOAD:
Easy Minecraft Bot (1152 Downloads)Greez Easy
Hey,
wirklich gute Arbeit!! Dürfte ich vielleicht deine ICQ Nummer haben?
Danke
Hast eine EMail
Hallo,
ich finde das sehr Interessant.
Ist das ganze auf C++ geschrieben wenn ja würde ich mich freuen wenn du den Quellcode mal Öffentlich machst oder mir den mal schickst.
Der Source ist unten zum Download verfügbar. Viel Spass
Echt tolle Arbeit! Wars schwierig, das alles zu machen?
Gruß, Michey
Danke!
Es war zwar schwierig, aber man lernt dabei immer was neues und es hat Spass gemacht, den Bot endlich zum laufen zu bringen. Hat sich also gelohnt.
Hallo,
ich hab mir das ganze mal angeschaut und so. Bloß wenn ich MCBot\bin\Debug\MCBot.exe starte steht das log würde erstellt und dann stürtzt das Programm ab. Ich hab Win7 64 Bit. Außerdem ist mir ausgefallen das es nur ein Debug Ordner gibt. Wieso kein Release? Ich bin C++ Programmiere und weiß nicht wie das in C# abläuft gibt es da kein Release?
Noch ne Frage auf welcher Version läuft der Bot?
Kann ich den auch für 1.4.5 nutzen?
Der Bot ist keineswegs Stable oder fertig für eine Release, es geht mehr um den Source des Bots. Und dieser Source hat fast kein Error-Handling drin, es ging ja nur ums Prinzip. Soweit ich weiß ich die Server-IP hardcoded, daher stürzt der Bot ab. Lad Dir Visual Studio Express und builde eine Release, dann siehst Du auch welche Exceptions geworfen werden. Ich denke das Mincraft Protokoll hat sich nicht gravierend geändert, sollte also noch gehen. Aber Probieren geht über studieren
Ich wollte mich auch mal an das Bot schreiben wagen

Ich sehe hier allerdings garkeinen Quellcode bzw. kann das Projekt nicht mit VB2010 Express öffnen, ein Quellcode sieht bei mir anders aus
@ mit Note++ kann ich das auch nicht so öffnen wie ich es möchte
Liebe Grüße
Naja, das ist ein C# Projekt, kein VB.NET. Wenn du nur VB2010 Express hast, so kannst du damit leider keine *.csproj-Dateien öffnen.
Lad Dir also Entweder C# 2010 Express oder gleich VS 2012, das hat auch C# Unterstützung…
Viel Erfolg
Hallo,
ich bin bei Google über die Suche “minecraft bot” bei Dir gelandet. Beim Ausführen deines Quellcodes bekomme ich eine Exception geworfen:
SeverManager.cs Zeile 75: int iRead = BS.Stream.EndRead(As);
Eine nicht behandelte Ausnahme des Typs “System.IO.IOException” ist in System.dll aufgetreten.
Zusätzliche Informationen: Von der Übertragungsverbindung können keine Daten gelesen werden: Eine vorhandene Verbindung wurde vom Remotehost geschlossen.
Server Host + Port habe ich natürlich angepasst. Nun ist dein Beitrag ja schon ein paar Monate alt - kannst Du vielleicht eruieren ob Dein Beispielprojekt noch zur aktuellen Minecraft-Server-Version verbinden kann?
Grüße,
martin
Dass der Host die Verbindung getrennt hat deutet darauf hin, dass das Protokoll zuvor nicht gepasst hat und der Server dann sagt “Bye, du hast ein falsches Protokoll”.
Schau Dir den verlinkten Wiki-Artikel an, der ist eigentlich auf dem neusten Stand. Ich selbst hab leider grad keine Zeit, aber das dürften nur geringfügige Änderungen sein…
Vier Erfolg!