Minecraft Mod-Entwickung

Nachdem es in dem letzten Blogpost gelungen ist, das eigene Smart Home mit Minecraft durch die Erweiterung ComputerCraft zu verbinden, geht es nun an eine erste eigene sogenannte Mod. Für die Minecraft-Laien: Eine Mod steht für das englische Modification und beschreibt Erweiterungen (Plug-ins) zur Anpassung von Spielen. So lässt sich Minecraft beinahe beliebig um eigene Ideen ergänzen.

iotworkshop
Connected Worlds and IoT: Digital Crafting Habitat Workshop vom 23. April 2016 gemeinsam mit der rheinjug Düsseldorf.

Diesen Weg geht auch das Digital Crafting Habitat. Hier wird die reale mit der virtuellen Welt verbunden. Zum Einsatz kommen Raspberry Pis, Sensoren, die Datenbank Redis und natürlich Minecraft. Dafür wird eine Minecraft Mod im Rahmen von Workshops weiterentwickelt. Den Java-Code auf Basis von Minecraft Forge 1.7. stellt das Digital Crafting Habitat in ihrem GIT-Repository inklusive zahlreicher Beispiele zur Verfügung.

Einrichten

Wer ganz von vorne anfangen möchte, der benötigt Java-Kenntnisse, ein wenig Gradle und eine Entwicklungsumgebung wie Eclipse IDE oder IntelliJ IDEA. Die wesentliche Zutat ist jedoch Minecraft Forge in Form eines Mod Development Kit, kurz MDK. Dieses kann in der gewünschten Version unter http://files.minecraftforge.net/ heruntergeladen werden. Die Version ist durchaus wichtig, da sich die Programmierschnittstelle (API) häufig verändert. In diesem Beispiel kommt Version 1.8.9 zum Einsatz. Eine eigenständige Version von Minecraft ist übrigens nicht unbedingt erforderlich, da diese schon im MDK enthalten ist.

Für das Setup sollte man sich unbedingt ein wenig Zeit nehmen und über eine ordentliche Internetverbindung verfügen. Als erstes wird nun das MDK heruntergeladen und entpackt – es handelt sich hierbei um ein normales Archiv. Innerhalb des entpackten Ordners fehlt noch eine optionale gradle.properties-Datei mit dem folgenden Inhalt, um die nächsten Schritte zu optimieren:

1
2
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx1024M

Anschließend wird über die Kommandozeile via gradle setupDecompWorkspace ein Arbeitsbereich inklusive einer Minecraft Programmierschnittstelle erzeugt und abschließend durch gradle eclipse bzw. gradle idea für die gewünschte Entwicklungsumgebung eingerichtet. Jetzt kann man schon den Workspace in Eclipse oder das Projekt in IntelliJ öffnen und Minecraft inklusive der Mod über die Kommandozeile gradle runClient bzw. direkt aus der Entwicklungumgebungen heraus starten. In Eclipse findet sich das innerhalb der RunConfiguration unter Java Application, in IntelliJ innerhalb des Gradle-Views unter Tasks/forgegradle.

Programmieren

Der Programmierung steht nun nichts mehr im Wege, abgesehen von einer etwas verteilten und unvollständigen Dokumentation. Gute Quellen sind der YouTube-Kanal „Minecraft Forge Modding 1.8”. Gamepedia und natürlich die Website von Minecraft Forge (http://www.minecraftforge.net/) sowie dessen GIT-Repository.

Meist benötigt man eine Java-Klasse, um den Mod zu initialisieren und die eigenen Erweiterungen dort zu registrieren. Die Initialisierung erfolgt über die Annotation @Mod unter Angabe eines eindeutigen Bezeichners.

1
2
3
4
5
@Mod(modid = SmartHomeMod.MODID, version = SmartHomeMod.VERSION)
public class SmartHomeMod {
 
	public static final String MODID = "smarthomemod";
	public static final String VERSION = "0.1";

Dazu passend muss noch die mcmod.info-Datei im Ressourcen-Verzeichnis src/main/resources angepasst werden – insbesondere die Bezeichnungen (modid) müssen identisch sein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
 {
  "modid": "smarthomemod",
  "name": "SmartHome",
  "description": "My Minecraft Smart Home",
  "version": "${version}",
  "mcversion": "${mcversion}",
  "url": "http://wolter.biz",
  "updateUrl": "",
  "authorList": ["Sascha Wolter"],
  "credits": "",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
 }
]

Innerhalb der Klasse können nun verschiedene Ereignisse verarbeitet werden. Gängig sind

  • FMLPreInitializationEvent für alles vor dem Start,
  • FMLInitializationEvent für alles währen des Starts,
  • FMLPostInitializationEvent für alles nach dem Start und zum Schluss
  • FMLServerStartingEvent während des Starts des Servers (auch lokal ohne expliziten Server).

Der richtige Ort für den eigenen Code hängt davon ab, was genau man in Minecraft verändern möchte. Beispielsweise kann man eigene Kommandos erst während des Starts des Servers registrieren. Die komplette Klasse sieht dann so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package biz.wolter.minecraft;
 
import biz.wolter.minecraft.commands.HelloCommand;
import net.minecraft.command.CommandBase;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
 
/**
 * @author Sascha Wolter
 */
@Mod(modid = SmartHomeMod.MODID, version = SmartHomeMod.VERSION)
public class SmartHomeMod {
 
	public static final String MODID = "smarthomemod";
	public static final String VERSION = "0.1";
 
	/* Commands */
	public static CommandBase HELLO_COMMAND = new HelloCommand();
 
	// FMLPreInitializationEvent happens as #1 right before Minecraft loads. Used for most registration.
	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
	}
 
	// FMLInitializationEvent happens as #2 when Minecraft loads.
	@EventHandler
	public void init(FMLInitializationEvent event) {
	}
 
	// FMLPostInitializationEvent happens #3 when World generators and alike are loaded.
	@EventHandler
	public void postInit(FMLPostInitializationEvent event) {
		System.out.println("postInit");
 
	}
 
	// FMLServerStartingEvent happens #4 right before starting the server.
	@EventHandler
	public void registerCommands(FMLServerStartingEvent event) {
		event.registerServerCommand(HELLO_COMMAND);
	}	
 
}

Das zugehörige Kommando wird von der CommandBase-Klasse abgeleitet und überschreibt die folgenden Methode:

  • getCommandName, um den eigenen Namen anzugeben,
  • getCommandUsage erklärt die Nutzung und
  • processCommand führt letztendlich das Kommando aus.

Der vollständige Code könnte dann so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package biz.wolter.minecraft.commands;
 
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
 
/**
 * @author Sascha Wolter
 */
public class HelloCommand extends CommandBase {
 
	public static final String COMMAND_NAME = "hello";
 
	@Override
	public String getCommandName() {
		return COMMAND_NAME;
	}
 
	@Override
	public String getCommandUsage(ICommandSender sender) {
		// TODO
		return String.format("/%s <name>", COMMAND_NAME);
	}
 
	@Override
	public void processCommand(ICommandSender sender, String[] args) throws CommandException {
 
		if (sender instanceof EntityPlayer) {
			sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Hello " + args[0]));
		} else {
			sender.addChatMessage(new ChatComponentText(
					EnumChatFormatting.RED + "This command is not available inside the console."));
		}
 
	}
 
}

Das Kommando wird in Minecraft nun über den Chat (Taste T) und mit einem führenden Schrägstrich eingegeben. Innerhalb der processCommand-Methode könnten nun natürlich auch komplexerer Anweisungen platziert werden, die beispielsweise ein Smart Home steuern. Oder man erfindet gleich eigene Gegenstände und Blöcke, die mit der Außenwelt kommunizieren…

Mein Minecraft-Smart-Home

Vernetzte, smarte und autonome Alltagsgegenstände sind unaufhaltsam. Doch wie können wir die Generation Z darauf vorbereiten? Wie vermitteln wir das Verständnis und die Kompetenz für dieses Internet der Dinge? Wie können wir Kollegen, Schüler oder die eigenen Kinder dafür begeistern, diese Zukunft verantwortungsbewusst mitzugestalten?

Minecraft
In Minecraft kann auch programmiert werden.

Es gilt Berührungsängste abzubauen und das Internet der Dinge auf spielerische Art und Weise erlebbar zu machen. Dank der Kombination aus Minecraft und Smart-Home-Lösungen wie Eclipse SmartHome ist das auch ohne Lötkolben möglich. Minecraft ist dabei mehr als eine Spielerei. Beispielsweise nutzt Microsoft im Rahmen des Projektes Malmo Minecraft zur Erforschung künstlicher Intelligenz. Continue reading Mein Minecraft-Smart-Home

Programmieren lernen mit Minecraft

Das gemeinsame Ferienprojekt meines 10jährigen Sohnes und mir lautete: Programmieren in Minecraft. Um genau zu sein, ich habe einen Einstieg in Minecraft gesucht und mein Sohn wollte „richtiges“ Programmieren mit Lua lernen. Unser Ziel haben wir erreicht: Nun können wir Schalter in der Minecraft-Welt betätigen und so eine echte Leuchte in unserem Eclipse basierten Smart Home steuern.

Dank des ansprechend gestalteten Video-Training „Let’s code Minecraft!” von Tom Wendel und Patrick Kirsch gelang dieser Einstieg in kurzer Zeit: die beiden erklären aufeinander aufbauend im Wechsel die verschiedenen Themen – und das überwiegend sehr unterhaltsam gleich innerhalb einer Minecraft-Welt. Gut fanden wir auch, wie noch einmal die Grundlagen von Minecraft erläutert, „elektrische Schaltungen“ auf Basis von Redstones (Stromleitungen in Minecraft) eingeführt und die Installation von Erweiterungen (sogenannte Mods) sowie der Aufbau von Ressourcen gezeigt werden. Okay, für meinen Sohn als Minecraft-Experten war das ein Klacks, aber für mich genau der richtige Einstieg, um nicht mehr ganz so hilflos durch die Block-Welt zu irren.

Und dann ging es schon los mit der Programmierung auf Basis der Erweiterung Computercraft. Hier haben sich die beiden Autoren dann ab und zu doch ein wenig viel vorgenommen, so dass die Erklärungen einen Programmieranfänger durchaus vor Herausforderungen stellen und ein erfahrener Programmierer sich ein wenig mehr Tempo und weniger Grundlagen wünscht. Vielleicht wäre es besser gewesen, für die jeweilige Zielgruppe eigene Video-Trainings zu produzieren. Mein Sohn hätte sich außerdem eine größere Vielfalt eher einfacherer Programmbeispiele gewünscht und dafür lieber auf die umfangreicheren Beispiele verzichtet. Uns beiden fehlt darüber hinaus so eine Art Referenz der Befehle, die über das englischsprachige und etwas spröde Computerkraft-Wiki im Internet hinausgeht. Unterschiedlicher Meinung sind wir bei dem letzten Teil, der Minecraft verlässt und die gelernten Konzepte auf die Webprogrammierung mit JavaScript und HTML überträgt. Für mich ist das eine großartige Inspiration für eigene Trainings und Vorlesungen. Für einen jungen Einsteiger ist eine Einführung in die Webprogrammierung in nicht mal 90 Minuten ohne weitere Unterstützung verständlicherweise kaum mehr Nachvollziehbar.

Insgesamt können wir beide das Training für Kinder und Erwachsene ob Programmierneuling oder erfahrener Entwickler empfehlen und hoffen sehr auf weitere Video-Trainings dieser Art. Übrigens: Wer unser Ergebnis sehen und eine Einführung in das Internet der Dinge und die Programmierung mit Minecraft bekommen möchte, der kann uns bei unserem gemeinsamen Vortrag auf der Maker Faire Bodensee treffen.

„Let’s code Minecraft!“ – Programmieren lernen mit Minecraft
Autoren: Tom Wendel, Patrick Kirsch
Preis: ca. Euro 30,-
ISBN: 978-3-8362-4056-7
Erscheinungsdatum: Rheinwerk, 2016
Link: Rheinwerk Verlag