
Hey liebe Com,
um

Bei jeglichen Problemen, Fragen oder Sonstigem könnt ihr mich natürlich gern anschreiben!

Set-Up
Bevor wir überhaupt anfangen können, Mods zu programmieren, benötigen wir einige Dinge. Der Vorteil bei Forge ist, dass es mehrere Methoden gibt, ihn zum Coden bereit zu machen, ich erkläre euch die (meiner Meinung nach) einfachste Methode.
1. Forge Source downloaden
Einige von euch werden sicherlich bereits Forge besitzen, aber so gut wie Keiner die Source Version, die zum Coden gedacht ist. Daher laden wir uns diese nun
runter, unter der recommended src Version:

Haben wir das heruntergeladen, erstellen wir uns der Ordnung wegen ein kleines Verzeichnis namens "Minecraft Development". In diesen Ordner einen neuen Ordner namens "Forge [eventuell Version]". Hier können wir nun Forge hinein extrahieren. Hier doppelklicken wir nun einfach die Datei "install.bat" und Forge erledigt alles weitere für uns. Das ganze Forge Setup kann ein Weilchen dauern, da er die ganzen Assets up2date von den Minecraft Server runterläd und Minecraft decompiled, was ebenfalls ein Weilchen dauert. Ihr könnt euch jetzt also erst mal nen Kaffee machen!
Ist er dann fertig, können wir uns Eclipse runterladen. Das ist später unsere Entwicklungsumgebund, mit der wir programmieren werden.
Ladet euch hier die "Eclipse IDE for Java Developers" herunter:

Nachdem der Download fertig ist, geht wieder in euren Ordner "Minecraft Development" und erstellt über dem Forge Ordner einen Neuen namens "Eclipse". Extrahiert Eclipse hier rein und öffnet Eclipse. Dieses Fenster wird sich öffnen:

Er fragt euch nach einem Workspace, welcher einen Ordner definiert. Diesen Ordner findet ihr unter diesem Pfad:
".../Minecraft Development/Forge [eventuell Version]/mcp/eclipse/
Fertig! Ihr habt das Setup überstanden und seid nun bereit, Mods zu coden!
1. Forge Source downloaden
Einige von euch werden sicherlich bereits Forge besitzen, aber so gut wie Keiner die Source Version, die zum Coden gedacht ist. Daher laden wir uns diese nun


Haben wir das heruntergeladen, erstellen wir uns der Ordnung wegen ein kleines Verzeichnis namens "Minecraft Development". In diesen Ordner einen neuen Ordner namens "Forge [eventuell Version]". Hier können wir nun Forge hinein extrahieren. Hier doppelklicken wir nun einfach die Datei "install.bat" und Forge erledigt alles weitere für uns. Das ganze Forge Setup kann ein Weilchen dauern, da er die ganzen Assets up2date von den Minecraft Server runterläd und Minecraft decompiled, was ebenfalls ein Weilchen dauert. Ihr könnt euch jetzt also erst mal nen Kaffee machen!

Ist er dann fertig, können wir uns Eclipse runterladen. Das ist später unsere Entwicklungsumgebund, mit der wir programmieren werden.
Ladet euch hier die "Eclipse IDE for Java Developers" herunter:

Nachdem der Download fertig ist, geht wieder in euren Ordner "Minecraft Development" und erstellt über dem Forge Ordner einen Neuen namens "Eclipse". Extrahiert Eclipse hier rein und öffnet Eclipse. Dieses Fenster wird sich öffnen:

Er fragt euch nach einem Workspace, welcher einen Ordner definiert. Diesen Ordner findet ihr unter diesem Pfad:
".../Minecraft Development/Forge [eventuell Version]/mcp/eclipse/
Fertig! Ihr habt das Setup überstanden und seid nun bereit, Mods zu coden!
Die Basis eines Mods
Nun fängt der Ernst des Lebens an: Wir fangen an zu coden. Die nachfolgenden Zeilen sind fast nur Copy & Paste.
Ist Eclipse geöffnet und der Workspace gewählt, so klicken wir oben links auf "File -> New -> Other" oder einfach STRG + N. Hier scrollen wir runter zu "Java", öffnen diesen Unterordner und wählen "Package". Das sollte sich öffnen:

Hier gebt ihr als Package Namen "[euername].[euermodname].common" ein. Ihr solltet alles klein schreiben, da ihr sonst während dem Coden Probleme bekommen könntet, da in Java (wir coden hier in Java, Eclipse ist lediglich die IDE) Groß- und Kleinschreibung wie in der Schule wichtig ist!
Geht jetzt sicher, dass das Package, das links in der Liste das Ausgewählte ist, euer soeben erstelltes ist.
Jetzt erstellen wir eine Class, was einfach nur die ".java" Dateien sind, daher, wo all unser Schnodder (aka Code) reinkommt. Wir drücken also wieder STRG + N und wählen bei "Java" "Class" aus. Das sollte sich öffnen:

Lasst alles so wie es ist, nur den Namen ändert ihr in den von eurem Mod. Hier könnt ihr nun gern großschreiben.
Nun öffnet sich das Codefenster. Fügt diesen Code ein:
Der Code wird Fehler machen, die werden wir aber ruckzuck beheben.
Dinge, die ihr abändern müsst:
Euer Packagename
Statt "infinity.mymod" die ersten zwei Stellen eures Packagenamens
Sonst überall da, wo "MyMod", "My Mod" bzw. "infinity.mymod" steht. Achtet auf Groß- und Kleinschreibung bei Packages (und Classes...)!
Hier:
bestimmen wir die ersten "Metadaten" (mir fällt gerade kein anderes Wort für ein
) für unseren Mod. modid ist die ID des Mods, keine Leerzeichen oder Sonderzeichen! name ist euer Modname, eben so, wie euer Mod später in Minecraft angezeigt werden soll. Und version ist die Version des Mods. Hier kommt aber nicht die Nummerierung der Version wie "1.0.0.0" hin, sondern Release, Alpha, Beta oder Development. Die Versionsnummer werden wir später in einer externen Datei bestimmen.
Um nun die letzten paar Fehler zu beheben, werden wir noch einige Klassen erstellen. Also: STRG + N, Java, Class und den entsprechenden Namen, der über den einzelnen Codes steht. Bearbeitet die Codes einfach so, wie oben angesprochen: "mymod", "MyMod", "My Mod" und "infinity.mymod" müssen natürlich abgeändert werden (auch in den Klassennamen! Also wenn euer Mod "YourMod" heißt, nicht "MyModCommonProxy", sondern "YourModCommonProxy"!)
MyModCommonProxy
Hier wurden bereits die wichtigsten Dinge, die ihr im Laufe des Tutorials brauchen könntet, eingefügt.
Bevor wir die restlichen drei Klassen erstellen können, müssen wir nun zwei weitere Packages erstellen. Also: STRG + N, Java, Package. Als Namen wählt ihr:
"infinity.mymod.client" und
"infinity.mymod.common.handlers"
Natürlich für euch abgeändert.
Jetzt noch die restlichen drei Klassen. Ich schreibe euch dazu, in welches Package welche Klasse gehört.
MyModClientProxy (infinity.mymod.client)
MyModClientPacketHandler (infinity.mymod.common.handlers)
MyModServerPacketHandler (infinity.mymod.common.handlers)
Nun solltet ihr keine Fehler mehr bekommen. Wenn doch, ist die meistgesuchte Lösung, dass Eclipse irgendwelche Klassen nicht findet. Das liegt daran, dass sie nicht importiert wurden. Beim betreffenden Codefenster (wo der Fehler drin ist), klickt im Code links in der kleinen Bar auf das rote X, das den Fehler markiert und wählt die Option, (beispielsweise) "infinity.mymod.XXX" zu importieren. Das sollte die meisten Fehler beheben. Wenn nicht, meldet euch hier im Thread! 
Das war's, das ist die Base für jeden Mod.
Ist Eclipse geöffnet und der Workspace gewählt, so klicken wir oben links auf "File -> New -> Other" oder einfach STRG + N. Hier scrollen wir runter zu "Java", öffnen diesen Unterordner und wählen "Package". Das sollte sich öffnen:

Hier gebt ihr als Package Namen "[euername].[euermodname].common" ein. Ihr solltet alles klein schreiben, da ihr sonst während dem Coden Probleme bekommen könntet, da in Java (wir coden hier in Java, Eclipse ist lediglich die IDE) Groß- und Kleinschreibung wie in der Schule wichtig ist!

Geht jetzt sicher, dass das Package, das links in der Liste das Ausgewählte ist, euer soeben erstelltes ist.
Jetzt erstellen wir eine Class, was einfach nur die ".java" Dateien sind, daher, wo all unser Schnodder (aka Code) reinkommt. Wir drücken also wieder STRG + N und wählen bei "Java" "Class" aus. Das sollte sich öffnen:

Lasst alles so wie es ist, nur den Namen ändert ihr in den von eurem Mod. Hier könnt ihr nun gern großschreiben.
Nun öffnet sich das Codefenster. Fügt diesen Code ein:
Code:
package infinity.mymod.common; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.Mod.PreInit; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; import cpw.mods.fml.common.SidedProxy; import infinity.mymod.common.MyModCommonProxy; @NetworkMod(clientSideRequired=true,serverSideRequired=true, clientPacketHandlerSpec = @SidedPacketHandler(channels = {"MyMod"}, packetHandler = MyModClientPacketHandler.class), serverPacketHandlerSpec = @SidedPacketHandler(channels = {"MyMod"}, packetHandler = MyModServerPacketHandler.class)) @Mod(modid="MyMod",name="My Mod",version="Beta") public class MyMod { @Instance("MyMod") public static MyMod instance = new MyMod(); @SidedProxy(clientSide = "infinity.mymod.client.MyModClientProxy", serverSide = "infinity.mymod.common.MyModCommonProxy") public static MyModCommonProxy proxy; @PreInit public void PreInit(FMLPreInitializationEvent e){ } @Init public void InitMyMod(FMLInitializationEvent event){ NetworkRegistry.instance().registerGuiHandler(this, proxy); } }
Dinge, die ihr abändern müsst:
Code:
package infinity.mymod.common;
Code:
import infinity.mymod.common.MyModCommonProxy;
Sonst überall da, wo "MyMod", "My Mod" bzw. "infinity.mymod" steht. Achtet auf Groß- und Kleinschreibung bei Packages (und Classes...)!
Hier:
Code:
@Mod(modid="MyMod",name="My Mod",version="Beta")

Um nun die letzten paar Fehler zu beheben, werden wir noch einige Klassen erstellen. Also: STRG + N, Java, Class und den entsprechenden Namen, der über den einzelnen Codes steht. Bearbeitet die Codes einfach so, wie oben angesprochen: "mymod", "MyMod", "My Mod" und "infinity.mymod" müssen natürlich abgeändert werden (auch in den Klassennamen! Also wenn euer Mod "YourMod" heißt, nicht "MyModCommonProxy", sondern "YourModCommonProxy"!)
MyModCommonProxy
Code:
package infinity.mymod.common; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; public class MyModCommonProxy implements IGuiHandler{ public void registerRenderInformation() { } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } public void registerTiles(){ } public void registerBlocks(){ } public void registerItems(){ } }
Bevor wir die restlichen drei Klassen erstellen können, müssen wir nun zwei weitere Packages erstellen. Also: STRG + N, Java, Package. Als Namen wählt ihr:
"infinity.mymod.client" und
"infinity.mymod.common.handlers"
Natürlich für euch abgeändert.
Jetzt noch die restlichen drei Klassen. Ich schreibe euch dazu, in welches Package welche Klasse gehört.
MyModClientProxy (infinity.mymod.client)
Code:
package infinity.mymod.client; import infinity.mymod.common.MyModCommonProxy; import net.minecraftforge.client.MinecraftForgeClient; public class MyModClientProxy extends MyModCommonProxy { public void registerRenderInformation(){ } }
Code:
package infinity.mymod.common.handlers; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; import cpw.mods.fml.relauncher.*; @SideOnly(Side.CLIENT) public class MyModClientPacketHandler implements IPacketHandler{ @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload payload, Player player){ DataInputStream data = new DataInputStream(new ByteArrayInputStream(payload.data)); } }
Code:
package infinity.mymod.common.handlers; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; public class MyModServerPacketHandler implements IPacketHandler{ @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload payload, Player player){ DataInputStream data = new DataInputStream(new ByteArrayInputStream(payload.data)); EntityPlayer sender = (EntityPlayer) player; } }

Das war's, das ist die Base für jeden Mod.
Einen einfachen Block machen
Zunächst ändern wir unsere MyMod Class (in infinity.mymod.common) um. Der neue Code sieht so aus:
Schaut mal, was genau sich geändert hat, ihr werdet es schnell finden und euch den Code selbst erklären können mittels ein wenig Englischkenntnissen!
"BasicBlock" und "Basic Block" könnt ihr abändern in euren Blocknamen.
Nun ändern wir auch die MyModCommonProxy Class:
Hier hat sich im Prinzip nur die Void "registerBlocks()" um unseren BasicBlock erweitert, der nun im Spiel registriert wird. "BasicBlock" ist sozusagen die ID, "Basic Block" der Name, wie er später angezeigt wird.
Nun erstellt ein neues Package namens "infinity.mymod.common.blocks" (ich sage es nun das letzte mal: abändern natürlich!). In diesem Package erstellen wir die Class "BlockBasicBlock", in die folgender Code kommt:
Nun haben wir den Block an sich fertig. Ganz unten seht ihr die Definition von "blockIcon". Dies wird später die Textur unseres Blocks, die 16x16 Pixel sein MUSS! Erstellt diese zunächst im PNG Format, im Fotoeditor eurer Wahl wie mspaint.exe 
Sobald ihr diese habt, weiß Forge natürlich noch nicht, wo die Textur denn nun ist. Nun kommen wir an das absolut Nervigste dieses Tutorials: Ordner. Ordner. Hab ich schon Ordner gesagt? Ordner.
In euren "Minecraft Development" Ordner erstellt ihr einen neuen Ordner namens "Ready". In diesen kommt ein neuer namens "My Mod" (<- ABÄNDERN!!! grr), in diesen einen Ordner namens "1.0.0.0" (<- eure Version), in diesen einen Ordner namens "assets". Nun einen neuen Ordner (wir haben es gleich geschafft), mit dem Namen, den ihr im Code an dieser Stelle angegeben habt:
Ich habe "mymod:BasicBlock" angegeben, also nenne ich den Ordner "mymod". In DIESEN Ordner kommt nun ein Ordner (was ein Zufall) namens "textures", in welchen ein schöner Ordner namens "blocks" hinein kommt. Und HIER könnt ihr jetzt eure Textur platzieren!
Achja, wichtig war das übrigens nicht, es dient nur bürokratischen Zwecken, der Ordnung! 
Nachdem eure Textur drin ist, kopiert den von euch erstellten Ordner "assets" (in welchem die ganzen anderen Ordner drin sind
) per STRG + C oder Rechtsklick, kopieren. Geht nun in das Verzeichnis "Minecraft Development/Forge [eventuell Version]/mcp/eclipse/Minecraft/bin". Hier fügt ihr den kopierten Ordner "assets" nun ein. Falls er euch fragt, ob er ihn integrieren soll, klickt ihr auf Ja.
Nun, habt ihr eigentlich gemerkt, dass das so gesehen euer erster Mod mit Funktion ist? In Eclipse könnt ihr nun oben auf den grünen Pfeil in der Toolbar oder ganz oben (wo auch File, Edit und alles andere ist) auf "Run" und dann wieder auf "Run" klicken. Minecraft wird sich öffnen. Wenn alles richtig ist, könnt ihr eine Welt erstellen und spielen. Nur könnt ihr den Block ja im Moment gar nicht bekommen, da es noch keine Möglichkeiten wie Rezepte, Ofen oder sonstiges gibt... Das gibts dann im nächsten Tutorial
Code:
package infinity.mymod.common; import net.minecraft.block.Block; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.Mod.PreInit; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; import cpw.mods.fml.common.SidedProxy; import infinity.mymod.common.MyModServerPacketHandler; import infinity.mymod.common.MyModClientPacketHandler; import infinity.mymod.common.blocks.BlockBasicBlock; @NetworkMod(clientSideRequired=true,serverSideRequired=true, clientPacketHandlerSpec = @SidedPacketHandler(channels = {"MyMod"}, packetHandler = MyModClientPacketHandler.class), serverPacketHandlerSpec = @SidedPacketHandler(channels = {"MyMod"}, packetHandler = MyModServerPacketHandler.class)) @Mod(modid="MyMod",name="My Mod",version="Beta") public class MyMod { @Instance("MyMod") public static MyMod instance = new MyMod(); @SidedProxy(clientSide = "infinity.mymod.client.MyModClientProxy", serverSide = "infinity.mymod.common.MyModCommonProxy") public static MyModCommonProxy proxy; public static Block BasicBlock; @PreInit public void PreInit(FMLPreInitializationEvent e){ BasicBlock = new BlockBasicBlock(3200).setUnlocalizedName("Basic Block"); //<- 3200 ist die Block ID! Diese sorgt sehr häufig für Inkompatibilität mit anderen Mods, also informiert euch zuerst, welche IDs andere Mods verwenden, wenn ihr mit X Mod unbedingt kompatibel sein wollt. Block IDs gehen bis zu 4096 in Forge. } @Init public void InitMyMod(FMLInitializationEvent event){ proxy.registerBlocks(); NetworkRegistry.instance().registerGuiHandler(this, proxy); } }

Nun ändern wir auch die MyModCommonProxy Class:
Code:
package infinity.mymod.common; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; public class MyModCommonProxy implements IGuiHandler{ public void registerRenderInformation() { } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } public void registerTiles(){ } public void registerBlocks(){ GameRegistry.registerBlock(MyMod.BasicBlock, "BasicBlock"); LanguageRegistry.addName(MyMod.BasicBlock, "Basic Block"); } public void registerItems(){ } }
Nun erstellt ein neues Package namens "infinity.mymod.common.blocks" (ich sage es nun das letzte mal: abändern natürlich!). In diesem Package erstellen wir die Class "BlockBasicBlock", in die folgender Code kommt:
Code:
package infinity.mymod.common.blocks; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockFlower; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; public class BlockBasicBlock extends Block { public BlockBasicBlock(int par1) { super(par1, Material.wood); //Hier setzt ihr die Vorlage für das Material des Blocks. Euer Block wird die Eigenschaften dieses Materials annehmen. Es gibt viele verschiedene, probiert beispielsweise statt wood mal "stone", "glass" oder viele Andere! } public void registerIcons(IconRegister iconRegister) { blockIcon = iconRegister.registerIcon("mymod:BasicBlock"); } }

Sobald ihr diese habt, weiß Forge natürlich noch nicht, wo die Textur denn nun ist. Nun kommen wir an das absolut Nervigste dieses Tutorials: Ordner. Ordner. Hab ich schon Ordner gesagt? Ordner.
In euren "Minecraft Development" Ordner erstellt ihr einen neuen Ordner namens "Ready". In diesen kommt ein neuer namens "My Mod" (<- ABÄNDERN!!! grr), in diesen einen Ordner namens "1.0.0.0" (<- eure Version), in diesen einen Ordner namens "assets". Nun einen neuen Ordner (wir haben es gleich geschafft), mit dem Namen, den ihr im Code an dieser Stelle angegeben habt:
Code:
blockIcon = iconRegister.registerIcon("mymod:BasicBlock");


Nachdem eure Textur drin ist, kopiert den von euch erstellten Ordner "assets" (in welchem die ganzen anderen Ordner drin sind

Nun, habt ihr eigentlich gemerkt, dass das so gesehen euer erster Mod mit Funktion ist? In Eclipse könnt ihr nun oben auf den grünen Pfeil in der Toolbar oder ganz oben (wo auch File, Edit und alles andere ist) auf "Run" und dann wieder auf "Run" klicken. Minecraft wird sich öffnen. Wenn alles richtig ist, könnt ihr eine Welt erstellen und spielen. Nur könnt ihr den Block ja im Moment gar nicht bekommen, da es noch keine Möglichkeiten wie Rezepte, Ofen oder sonstiges gibt... Das gibts dann im nächsten Tutorial

Weitere Tutorials folgen bald...
Danke für's Lesen und..
HAPPY CODING!
- Infinity'