Minecraft: Iron Farm via Command Block

Command Blocks in Minecraft sind zwei Dinge: Nützlich und totaal unpraktisch. Als ich vor kurzem auf der Suche nach einer Möglichkeit war, sehr schnell automatisiert zu Testzwecken eine Eisenfarm zu bauen, fand ich erstaunlicherweise keinen Befehl dafür.  Obwohl es sonst sehr abgefahrenes Zeug gibt. Vielleicht war mein Anliegen ja zu profan.

Das heißt also, dass ich selbst ans Werk musste. Im Creative Mode kann man ja mit dem Kommandos /setblock und /fill Blöcke an definierte Koordinaten setzen. Diese Befehle kann man auch in Command Blocks hinterlegen. Das Problem: In so einen Block passt nur genau 1 Befehl. Eine ausgewachsene Eisenfarm (zum Beispiel diese lustigen Türme hier) braucht aber mehrere davon.

Die Lösung: Man schreibt einen Befehl, der mehrere weitere Command Blocks erstellt, die dann die eigentlichen Befehle ausführen. Dafür “beschwört” man Sandblöcke, die fallen (FallingSand), aber gar keine Sandblöcke sind, sondern Command Blocks, und die auf weiteren FallingSand-Blöcken “reiten”, die Command Blocks sind, und die wiederum auf weiteren Blöcken “reiten”… bis man einen stattlichen Turm beisammen hat. Klingt abgefahren, ist es auch.

Für die Umwandlung der eigentlichen Befehle in diese Kaskade aus FallingSand-Blöcken habe ich mir ein Python-Skript geschrieben, das mir diese lästige Arbeit abnimmt. Da es sich doch um arg viele Befehle handelt und dieser Turm aus Command Blocks nicht unbegrenzt hoch werden kann, musste ich außerdem noch etwas bei der Anordnung der Blöcke tricksen. Das Ergebnis funktioniert, solange man sich nicht allzu hoch hinaus wagt.

Es gibt auch ein kleines Demonstrationsvideo:

Den Command gibt es hier. Außerdem nervig: Command Blocks können nur Commands mit einer maximalen Länge von ca. 32.767 Byte speichern. Da komme ich mit meinen 29.000 Zeichen schon relativ nahe ran…

[Update] Durch ein bisschen Optimierung habe ich den Command auf nur noch 15881 Zeichen herunterbekommen. Außerdem ist er jetzt viel schneller und funktioniert auch in größerer Höhe als vorher. Klick.

Eine Minecraft-Straßenkarte für den Nether basteln

Für den Minecraft-Server auf ironhide.de gibt es seit Mitte Juli eine mit Mapcrafter erstellte Google-Maps-artige Onlinekarte. Die ist sehr cool, da sich mit ihr gut Entfernungen und relative Positionen abschätzen lassen. Und natürlich kann man auf ihr die vielen prächtigen Bauwerke bewundern.1

Im Nether, der anderen Dimension, klappt das leider nicht ganz so gut: Der hat nämlich unten und oben eine Decke, man kann also nur sehr schlecht von oben reinsehen. Abhilfe schaffen entweder die (sehr bunte und unübersichtliche) Cave-Ansicht oder ein Abschneiden aller Blöcke ab einer bestimmten Höhe. Während das auf der betreffenden Karte im Startgebiet noch relativ ansehlich aussieht, weil nach oben relativ viel Platz ist, sieht man anderswo nur noch die rote Decke.

Ich hätte deshalb gerne eine 2D-Karte, auf der die Verkehrswege übersichtlich eingezeichnet und vor allem die Bahnstrecken gut zu erkennen sind. Das lässt sich zwar händisch malen, aber da ich faul bin, suchte ich einen Weg, das Ganze zu automatisieren.

Zum Glück gibt es eine Python-Bibliothek, mit der sich Minecraft-Maps bearbeiten lassen: pymclevel. Mehr brauchte ich eigentlich nicht.

Praktischerweise sind die meisten wichtigen Wege auf unserer Karte aus ästhetischen und sonstigen Gründen aus Stein gebaut, der in dieser Dimension nicht “natürlich” vorkommt. Wenn man also die Position aller Steinblöcke kartographiert, sollte man ein akzeptables Abbild des Wegenetzes bekommen.

Ich schrob also zwei Skripte: Eins, das die Karte lädt, daraus die Nether-Dimension lädt und dann die Position aller Steinblöcke, Schienen, Obsidianblöcke (für Portale) und Netherziegel (für Netherfestungen) ausliest. Und ein zweites, das daraus eine SVG-Karte bastelt.

Für den ironhide-Server sieht die dann zum Beispiel so aus:

mcpaths

Klick misch für die interaktive Version!

Hübsch.

Das Projekt gibt es auf GitHub zum selbst ausprobieren. Bitte zunächst die README.md lesen 😉

Hinweis: Wie wir festgestellt haben (*hust*), sollte man das Tool nicht auf einer Karte ausführen, die gerade bespielt wird. pymclevel setzt offenbar einige Schreibsperren, wodurch sich Minecraft verschluckt und alle Änderungen an der Welt wieder verschwinden, sobald der entsprechende Teil der Welt (Chunk) aus dem Speicher fliegt und eigentlich auf der Festplatte gesichert werden müsste.

Mit Karten der neuen Version 1.8 funktioniert das Tool auch (eben getestet).

Oh, und pymclevel benötigt übrigens die python-Pakete numpy und PyYaml.

  1. Seit dem Upgrade auf die Minecraft-Version 1.8 verschwinden leider die Markierungen wieder, sobald man das betreffende Gebiet der Karte betritt. Hier wäre wohl mal ein Mapcrafter-Upgrade fällig.