Make Magazin 1/2017
S. 94
Grundlagen
Aufmacherbild

Minecraft programmieren, generationenübergreifend

So richtig erschlossen hat sich mir erst nicht, was mein Nachwuchs da eigentlich stundenlang in der virtuellen Welt von Minecraft macht. Doch nach einer kurzen Einführung durch meinen elfjährigen Sprössling hat es mich dann gepackt – nur anders. Denn in Minecraft bewege ich mich immer noch recht unbeholfen, dafür gibt es aber nun gemeinsame Programmiersessions, von denen alle Seiten profitieren.

Wer wünscht sich nicht eine Welt, in der man beinahe grenzenlos alles aus Klötzchen bauen und alleine oder gemeinsam mit anderen Abenteuer erleben kann? Quasi eine Art virtuelles Lego-Spielen. Genau das macht den Reiz von Minecraft aus und fesselt Millionen Kinder und Erwachsene weltweit. Und es wird nie langweilig, denn aus der Community heraus entstehen immer neue Ideen für die Nutzung und Erweiterung von Minecraft.

Alles fing damit an, dass der Schwede Markus Persson (auch bekannt als Notch) im Mai 2009 damit begann, in seiner Freizeit ein Computerspiel namens Cave Game (Höhlenspiel) zu programmieren. Angelehnt an das zu der Zeit populäre Spiel Starcraft benannte er sein Spiel kurz darauf in Minecraft (Minengewerbe) um. Notchs Aufwand wurde belohnt und Minecraft erhielt im September 2014 dank rund 24 Millionen Verkäufen die Auszeichnung als bestverkauftes PC Spiel. Ebenfalls 2014 übernahm Microsoft Minecraft inklusive des zugehörigen Unternehmens Mojang AB.

Es gibt eine verwirrende Vielzahl an Versionen von Minecraft. Darunter die Konsolenedition, unter anderem für Playstation und Xbox. Für mobile Geräte optimiert ist die Pocket Edition, die auch als Grundlage von Minecraft für Microsofts Augmented Reality Brille HoloLens dient. Daran angelehnt ist außerdem eine spezielle Version für den Raspberry Pi. Um diese Pi-Edition ist es jedoch leider recht ruhig geworden. Seit 2012 erschien keine neue Version. Allerdings ist die kostenlose Pi-Edition dank geringer Anforderungen an die Hardware und einfacher Programmierbarkeit mit Sprachen wie Python immer noch sehr beliebt.

Die größte Vielfalt an Erweiterungsmöglichkeiten bietet die auf Java basierende Computer Edition, die für Windows und MacOS auf der Minecraft-Webseite für circa 20  erhältlich ist. In den folgenden Beispielen wird diese in der Version 1.8.9 genutzt, andere Versionen haben möglicherweise einen abweichenden Funktionsumfang und etwas andere Programmierschnittstellen – die Konzepte und Vorgehensweisen sind jedoch identisch.

Crash-Kurs für Erwachsene

Glücklicherweise ist Minecraft gar nicht so schwierig, sofern sich der eigene Anspruch auf das virtuelle Spaziergehen und das Programmieren beschränkt. Es sollte nur klar sein, dass man damit seine Kinder nicht beeindrucken kann – sich aber zumindest auch nicht mehr blamiert. Und falls doch mal Wissenslücken existieren, dann gibt es neben der Homepage von Minecraft noch umfangreiche Nachschlagewerke wie das Minecraft Wiki auf Gamepedia.

Mit der F3-Taste lassen sich zusätzliche Informationen einblenden und mit F5 die Perspektive verändern.

Grundsätzlich unterscheidet man in Minecraft den Überlebens- (Survival) und den Kreativmodus. Ersterer erfordert, dass man die Rezepte kennt, mit denen besondere Gegenstände im sonst recht leeren Inventar produziert werden. Minecraft-Spieler sprechen hier von „craften“: Beispielsweise ergeben 8 Bruchsteine im Crafting-Inventar so angeordnet, dass die Mitte freibleibt, einen Ofen. Beim Kreativmodus hingegen sind alle Dinge in unbegrenzter Menge im Inventar verfügbar. Hier gelingt der Einstieg in Minecraft-Programmierexperimente deutlich schneller. In das Inventar gelangt man mit der E-Taste. Die benötigten Gegenstände legt man in die unten eigeblendete Schnellzugriffsleiste. Deren Fächer werden im Spiel mit den Tasten 1 bis 9 oder mit dem Scrollrad der Maus gewählt. Ein weiterer angenehmer Nebeneffekt des Kreativmodus ist, dass man normalerweise nicht sterben kann und deshalb anders als im Überlebensmodus auch keine Herzen für den Gesundheitszustand zu sehen sind.

Die Navigation erinnert an gängige Open-World-Spiele und First-Person-Shooter: Mit der Maus schaut man sich um. Durch die Tasten W, A, S und D erfolgt die Bewegung. Die Leertaste erlaubt es zu springen und durch doppeltes Drücken sogar zu fliegen. Einfaches Halten der Leertaste lässt einen weiter aufsteigen und wiederholtes doppeltes Drücken wieder hinunterfallen. Mit der linken Maustaste werden Blöcke abgebaut und andere Wesen attackiert. Die rechte Maustaste dient zum einen dem Platzieren von Blöcken und zum anderen dem Einsatz von einigen Werkzeugen wie zum Beispiel Scheren und Feuerzeugen. Diese Aktionen beziehen sich auf den gerade gewählten Gegenstand (engl. item) aus dem Inventar.

Eine weitere wichtige Funktion von Minecraft sind Befehle, um das Spielgeschehen und Einstellungen zu verändern. Befehle kann man unter anderem in der Chat-Konsole eingeben, die über die T-Taste erreicht wird. In der Chat-Konsole muss einem Befehl ein vorwärts gerichteter Schrägstrich vorangestellt werden, um diesen von normalen Chat-Eingaben zu unterscheiden. Je nachdem welchen Befehl man verwendet, wird auch von Cheat-Befehlen (Mogeleien) gesprochen. Abhängig vom Spielmodus und den Einstellungen sind auch nicht immer alle Befehle für jeden verfügbar.

Elektronikbaukasten

Der Einstieg in die Welt der Programmierlogik gelingt bereits ohne Code. Es gibt physische Komponenten wie Kolben, die andere Elemente verschieben und elektrische Elemente auf Basis eines Erzes, das Redstone genannten wird. Damit erstellte Schaltkreise ermöglichen komplexe logische Schaltungen inklusive Sensoren und Aktoren: Zu den gängigen Elementen zählen unter anderem Redstone-Staub für kabelähnliche Verbindungen, Hebel als Schalter und unerschöpfliche Energiequelle, sowie Redstone-Lampen als Verbraucher.

Eine einfache Und-Schaltung sieht so aus: Die beiden Hebel sind die Eingänge, die Redstone-Lampe der Ausgang. Die Redstone-Fackeln haben eine umkehrende Wirkung, so dass bei aktiviertem Hebel der Energiefluss ausgeschaltet wird.
Modifikationen müssen als Java-Archiv (*.jar) in den mods-Ordner kopiert werden und stehen ab dann in Minecraft zur Verfügung, wenn man Minecraft Forge verwendet.

Es mag manchmal mühsam erscheinen, aber die Ergebnisse in der Minecraft-Community sind trotz des Aufwandes durchaus eindrucksvoll. Einem 16jährigen soll es gelungen sein, aus 250 × 200 × 100 Blöcken (umgerechnet fünf Millionen virtuelle Kubikmeter) einen wissenschaftlichen Rechner zu bauen. Außerdem gibt es einen virtuellen 8-Bit-Prozessor mit 8 Byte RAM sowie die dazu passende Festplatte.

Virtuelle Computer und Zubehör

Wer Computer und deren Zubehör nicht in mühsamer Kleinarbeit in Minecraft nachbauen möchte, der kann mit der kostenlosen Erweiterung ComputerCraft auf fertige virtuelle Computer und gängige Peripheriegeräte wie Drucker, Bildschirme und Diskettenlaufwerke zurückgreifen. Außerdem gibt es die sogenannten Turtles (Wasserschildkröten). Dabei handelt es sich um eine Art beweglicher Computer beziehungsweise programmierbarer Roboter. Der Code wird in ComputerCraft wahlweise in der vergleichsweise einfachen Programmiersprache Lua verfasst oder – sofern man die darauf aufbauende Erweiterung ComputerCraftEdu nutzt – in einer visuellen Programmiersprache zusammengeklickt. Programmcode und die visuelle Herangehensweise können auch parallel verwendet werden.

Die Installation einer Mod (kurz für englisch modification) genannten Erweiterung gelingt am einfachsten mit Minecraft Forge. Dabei handelt es sich sowohl um einen Mod-Loader zum unkomplizierten Einbinden von Modifikationen als auch um eine vereinfachte Programmierschnittstelle (kurz API für engl. application programming interface) zum Programmieren solcher Erweiterungen.

Letztendlich muss nicht mehr getan werden als die passende Version des Forge-Installers aus einer vertrauenswürdigen Quelle herunterzuladen und zu installieren. Forge sucht im Verzeichnis .minecraft/mods nach Erweiterungen. Unter Windows findet sich dieser Ordner normalerweise unter %AppData%/.minecraft, bei MacOS unter ~/Library/Application Support/minecraft. Abschließend muss nur noch ComputerCraft heruntergeladen und in diesen Ordner kopiert werden – eine häufige Fehlerquelle sind zueinander inkompatible Versionen von Mod und Minecraft.

Blöcke und Gegenstände im Inventar (Kreativmodus), die durch ComputerCraft hinzugefügt wurden.

Im Kreativmodus von Minecraft stehen nun Computer und Zubehör im Inventar zur Verfügung (normalerweise auf der zweiten Seite der Blockübersichten im Register für ComputerCraft). Sobald man einen Computer-Block in der Minecraft-Welt erzeugt und mit Rechtsklick auswählt, erscheint die Kommandozeilenoberfläche des CraftOS-Betriebssystems. Die Kommandozeile erlaubt ähnliche Operationen wie andere Betriebssysteme. Dazu zählen das Anzeigen, Kopieren, Umbenennen und Löschen von Dateien und Verzeichnissen sowie eine generelle Hilfe help. Die Tastenkombination Strg+R startet einen Computer bei Bedarf neu (Reset), Strg+T beendet ein laufendes Programm (Terminate) und Strg+S schaltet den Computer aus (Shutdown). Am wichtigsten für die Programmierung ist der leider recht spartanische Editor, der über den Kommandozeilenbefehl edit und der Angabe eines Dateinamens gestartet wird. Hier kann endlich Lua programmiert werden:

print "Hello world!"

Sobald die Datei gespeichert und der Editor verlassen wurde, steht das Programm unter dem zuvor gewählten Dateinamen zur Verfügung und wird darüber auch gestartet. Ein etwas umfangreicheres Beispiel ist der folgende Programmcode, der – rechts neben einer Tür platziert – als Zahlenschloss dient, sobald man das Programm startet. Falls die Programmdatei startup genannt wurde, geschieht die Ausführung des Codes automatisch, sodass von Beginn an ein Rechtsklick auf den Computer zur Anzeige der Eingabeaufforderung ausreicht:

-- do forever

while true do

-- clear screen

term.clear()

term.setCursorPos(1,1)

write("Enter password: ")

-- read password while showing *

local password = read("*")

if password == "1234" then

-- open door on the left via redstone signal

rs.setOutput("left", true)

-- wait a few seconds...

sleep(3)

-- ...before closing the door on the left

rs.setOutput("left", false)

else

print("Wrong password!")

sleep(2)

end

end

Und das ist nur ein Bruchteil der Möglichkeiten, die durch die Programmierung mit Lua eröffnet werden. Es gibt eine umfangreiche Programmierschnittstelle, die zum Beispiel auch die Verarbeitung von Ereignissen und den Aufruf externer http-Adressen erlaubt. Wem das nicht reicht, der darf die API natürlich auch durch eigenen Code ergänzen.

Virtuelle Computer und physische Dinge mit openHAB

Der Code im Spiel: So sieht unsere Programmierung in Minecraft aus.

Als Tor (Gateway) zur physischen Welt eignen sich Frameworks wie Eclipse SmartHome oder darauf aufbauende Lösungen wie openHAB 2. Für die Lua-Programmierung von Minecraft gibt es eine umfangreiche Programmierschnittstelle, die zum Beispiel auch die Verarbeitung von Ereignissen und den Aufruf externer http-Adressen erlaubt und so die Kommunikation mit anderen vernetzten Geräten ermöglicht. Frameworks wie Eclipse SmartHome oder darauf aufbauende Lösungen wie openHAB 2 bieten zu diesem Zweck eine http basierte REST-Schnittstelle. Darüber lassen sich eine Vielzahl an unterstützten Diensten und Geräten ansprechen – darunter zum Beispiel Philips hue Leuchten. Egal für welche Lösung man sich entscheidet, Zugriff auf eine über http erreichbare Schnittstelle des Gateways oder der Geräte ist notwendig, um Minecraft und das Internet der Dinge miteinander sprechen zu lassen. Die Endpunkte, also die genauen URLs dafür, können sich durchaus unterscheiden. Bei Eclipse SmartHome und openHAB 2 findet man diese aber normalerweise komfortabel über die lokale REST-Dokumentation unter http://127.0.0.1:8080/doc/index.html. Dort oder direkt in einem REST-Client erhält man alle steuerbaren Elemente (http://localhost:8080/rest/items), diese verfügen über eine URL wie http://localhost:8080/rest/items/hue_LLC011_001788167515_1_color/ und werden je nach Typ beispielsweise durch das Kommando ON oder OFF ein- oder ausgeschaltet. In ComputerCraft benötigt man nun diese URL, um Werte an die zu steuernden Geräten beziehungsweise Gerätekanäle über die HTTP-API zu senden. Eine Kleinigkeit ist jedoch noch zu beachten: Der genaue Typ der zu übertragenen Daten muss über den http-Header angegeben werden. Der entsprechende Quellcode in Lua sieht dann so aus:

-- URL for item

local url = "http://localhost:8080/rest/items/hue_LLC01

1_001788167515_1_color/"

-- Set content type - otherwise it's form

encoded and will be refused

local headers = {[ "Content-Type" ] =

"text/plain"}

-- Send command ON to turn on given item

(OFF for the opposite)

http.post(url, "ON", headers)

Dieser Programmcode mag nun etwas abstrakt wirken, aber glücklicherweise gibt es Abhilfe. Man kann komplexen Code verstecken, indem man eine eigene wiederverwendbare Programmierschnittstelle entwickelt und sie für alle Computer in Minecraft verfügbar macht. Dies gelingt indem man den Programmcode in das ROM der Computer legt. Innerhalb von Minecraft handelt es sich hier zwar um einen reinen Lesespeicher (Read Only Memory), doch den kann man über Minecraft-Ressourcenpakete beeinflussen.

Der Eclipse SmartHome Startbildschirm mit verschiedenem Minecraftzubehör.
Der Speicherort für die Ressource „Smart Home“ mit der Beschreibungsdatei „pack.mcmelo“.

Ein allgemeines Ressourcenpaket legt man unter %AppData%/.minecraft/resourcepacks/ an. Das Ressourcenpaket benötigt einen eigenen Ordner wie zum Beispiel SmartHome und darin eine Beschreibungsdatei pack.mcmeta mit dem folgenden Inhalt:

{

"pack": {

"pack_format": 1,

"description": "SmartHome API"

}

}

(Ein Beispiel zum Download finden Sie in meinem Blog, wir verweisen darauf unter den Links zum Artikel). Für die eigentliche Programmierschnittstelle benötigen wir ein Verzeichnis wie %AppData%/.minecraft/resourcepacks/SmartHome/assets/computercraft/lua/rom/apis in dem die APIs abgelegt werden. Entscheidend ist hier der Dateiname, da dieser als Bezeichner für die API in Minecraft dient – es bietet sich zum Beispiel smarthome an (ohne Dateiendung). Der Programmcode könnte dann wie folgt aussehen:

-- REST specific settings

endpoint =

"http://127.0.0.1:8080/rest/items/"

local headers = {[ "Content-Type" ] =

"text/plain"}

function sendCommand(item, command)

-- http should be enabled by default, but

better check here

if (not http) then

error("http not enabled")

end

-- Construct full URL

local url = endpoint..item

-- Post command to item

http.post(url, command, headers)

return true

end

Sobald das Ressourcenpaket in Minecraft aktiviert ist, kann die API in allen Computern mit Lua genutzt werden. Es reicht ab jetzt die folgende Codezeile zum Steuern einer Leuchte aus:

smarthome.sendCommand(hue_LLC011_001788167

515_1_color,ON)

Wem das nicht genügt, der kann die API natürlich durch eigenen Code ergänzen, oder sich gleich an die Entwicklung eigener Minecraft-Modifikationen machen.

Modifikationen selbst gemacht

Mods wie ComputerCraft lassen sich durchaus selber programmieren, wenn man über Java-Kenntnisse verfügt. Zu diesem Zweck gibt es von Minecraft Forge das sogenannte Mod Development Kit (kurz MDK). Außerdem wird noch das Automatisierungs-Werkzeug Gradle und eine Entwicklungsumgebung für Java wie zum Beispiel die Eclipse IDE benötigt. Die einzelnen Schritte zum Einrichten einer Arbeitsumgebung sind dann:

1. Download Mod Development Kit (MDK) in der gewünschten Version (zum Beispiel 1.8.9);

2. Entpacken des MDK-Archivs;

Minecraft erfährt von dem Ressourcenpaket über das Menü Options… | Resource Packs…
Tipp: Sobald man lua in einem ComputerCraft-Computer eingibt, erhält man eine interaktive Eingabeaufforderung, die Lua-Befehle direkt ausführt.

3. Es sollte eine gradle.properties-Datei im Wurzelverzeichnis des MDK angelegt und mit dem folgenden Inhalt versehen werden, um Speicherplatzprobleme zu vermeiden – je nach Rechner und Betriebssystem kann es sein, dass die Einstellung für den Arbeitsspeicher variiert werden muss. Auf unserem Windows-10-Testsystem funktionierte die Angabe von org.gradle.jvmargs=-Xmx1G gut, die Empfehlung für MacOS ist org.gradle.jvmargs=-Xmx2G.

4. Nun wird mit gradlew setupDecompWorkspace eine dekompilierte Version von Minecraft für die Mod-Entwicklung erzeugt;

5. gradlew eclipse erstellt einen Eclipse Workspace im gleichnamigen Ordner eclipse, der dann in der Eclipse IDE für die Programmierung geöffnet werden kann (für IntelliJ IDEA kann mit gradlew idea ein entsprechendes Projekt angelegt werden);

6. Abschließend kann Minecraft durch die Eclipse Run Configuration „Client“ oder über die Kommandozeile und gradlew runClient gestartet werden. Hilfreich ist nicht nur, dass man so ein kostenloses Minecraft erhält, sondern dass das MDK im Verzeichnis src/main gleich auch eine Beispiel Mod liefert (siehe Abbildung). Dieses ist ein guter Startpunkt für eigene Projekte.

Im zweiten Teil dieses Artikels in der kommenden Make zeigen wir, wie man einen Multiplayer-Server aufsetzt und mit eigenen Plug-ins erweitert.