Hey liebe Com,
um mal up-2-date zu machen und gleich einem neuen Technikstandard gleich zu machen (Forge), möchte ich euch zeigen, wie ihr für 1.6.2 mit Forge Mods programmieren könnt.
Bei jeglichen Problemen, Fragen oder Sonstigem könnt ihr mich natürlich gern anschreiben!
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!
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:
Code:
package infinity.mymod.common;
Euer Packagename
Code:
import infinity.mymod.common.MyModCommonProxy;
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:
Code:
@Mod(modid="MyMod",name="My Mod",version="Beta")
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
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(){
}
}
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)
Code:
package infinity.mymod.client;
import infinity.mymod.common.MyModCommonProxy;
import net.minecraftforge.client.MinecraftForgeClient;
public class MyModClientProxy extends MyModCommonProxy {
public void registerRenderInformation(){
}
}
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;
}
}
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!
Zunächst ändern wir unsere MyMod Class (in infinity.mymod.common) um. Der neue Code sieht so aus:
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);
}
}
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:
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(){
}
}
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:
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");
}
}
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
Wie du meinst Ich hab hier nur kurz Schluss gemacht, da ich gerade von 8 Std Arbeit zurück kam und jetzt erstmal ne Pause einlegen wollte Ich schreib gleich weiter, trotzdem danke.
Es ist jetzt seit fast einem Monat nichts mehr gekommen. Lohnt es sich noch ein Wenig zu warten?
PS: Sonst ist alles Top!!
Nein es lohnt sich nicht! Alleine für Forge schon Tutorials zu machen ist der größte Schwachsinn. Forge hat die instabilste API, die ich kenne und bei jeder neuen Version, müssen Tutorialer, neue Videos machen, nur weil sich Beispielsweise ein Klassennamen geändert hat.
Macht lieber Tutorials zu purem Java, da lernen die Dummies wenigstens, wie man mit einer API umzugehen hat und somit nicht C & P betreiben.
Nein es lohnt sich nicht! Alleine für Forge schon Tutorials zu machen ist der größte Schwachsinn. Forge hat die instabilste API, die ich kenne und bei jeder neuen Version, müssen Tutorialer, neue Videos machen, nur weil sich Beispielsweise ein Klassennamen geändert hat.
Macht lieber Tutorials zu purem Java, da lernen die Dummies wenigstens, wie man mit einer API umzugehen hat und somit nicht C & P betreiben.
Mit freundlichen Grüßen
Probber
Forge und instabil? Du hast anscheinend noch nie was damit gemacht... Modloader gibt es zum glück in der 1.7 nicht mehr, nicht nur weil es die BaseClasses überschreibt, sondern auch weil Forge viel flüssiger und dynamischer läuft. Daher bitte ich dich, dich mehr zu erkundigen bevor du so etwas sagst
Forge und instabil? Du hast anscheinend noch nie was damit gemacht... Modloader gibt es zum glück in der 1.7 nicht mehr, nicht nur weil es die BaseClasses überschreibt, sondern auch weil Forge viel flüssiger und dynamischer läuft. Daher bitte ich dich, dich mehr zu erkundigen bevor du so etwas sagst
Instabil sollte nicht heißen, dass es immer abstürzt oder Ahnliches, sondern viel mehr, dass die API einfach nicht gleich bleibt.
Bei jedem größeren Minecraftupdate macht Forge irgendeine Verrenkung, sodass die Mods von der vorherigen Version nicht mehr funktionieren.
Ein Beispiel für eine stabile API ist Bukkit, da kannst du auch ältere Plugins problemlos auf neueren Servern einsetzen.
Forge und instabil? Du hast anscheinend noch nie was damit gemacht... Modloader gibt es zum glück in der 1.7 nicht mehr, nicht nur weil es die BaseClasses überschreibt, sondern auch weil Forge viel flüssiger und dynamischer läuft. Daher bitte ich dich, dich mehr zu erkundigen bevor du so etwas sagst
Computerbaer hat ja berreits alles dazu gesagt. Einfach nächstes mal meinen Beitrag etwas besser durchlesen, dann versteht du auch, was ich mit instabil meine.
Instabil sollte nicht heißen, dass es immer abstürzt oder Ahnliches, sondern viel mehr, dass die API einfach nicht gleich bleibt.
Bei jedem größeren Minecraftupdate macht Forge irgendeine Verrenkung, sodass die Mods von der vorherigen Version nicht mehr funktionieren.
Ein Beispiel für eine stabile API ist Bukkit, da kannst du auch ältere Plugins problemlos auf neueren Servern einsetzen.
Forge Mods sind viel komplexer als Plugins. Und die grösten Changes macht nicht Forge, die API, sonder Minecraft... Obwohl das bei jedem Modloader gleich ist.. Würde eine API sich nicht ändern, dann hätten wir jetzt noch das problem das Mod Developer eine eigene Server Version machen müssten, wir selber IDs einstellen müssten und dass kein Mod kompatibel miteinander wäre. Bukkit ist was ganz, ganz anderes als Forge, dass kann man eigentlich garnicht vergleichen...
Forge Mods sind viel komplexer als Plugins. Und die grösten Changes macht nicht Forge, die API, sonder Minecraft... Obwohl das bei jedem Modloader gleich ist.. Würde eine API sich nicht ändern, dann hätten wir jetzt noch das problem das Mod Developer eine eigene Server Version machen müssten, wir selber IDs einstellen müssten und dass kein Mod kompatibel miteinander wäre. Bukkit ist was ganz, ganz anderes als Forge, dass kann man eigentlich garnicht vergleichen...
Mfg.
xD mach dich nicht lächerlich, Bukkit ist auch nur ne Severmod und die ist nicht ansatzweise so instabil wie Forge. Auch wenn Forge mehr ist als nur ne Severmod ist das kein Grund für die instabilität
[Forge] Welche Mods? 12/15/2012 - Minecraft - 1 Replies Ich suche ein paar "Forge Mods" also mods, die ich einfach in den "mods" ordner packen muss die ABER! auch auf nem Server gehen, habe schon Invasions mod auf meinem MC Server laufen, aber was gibt es noch für welche? Hatte gestern den Traincraft drin, aber der ist z.z. noch ein wenig Buggy.
mfg.