Every mod has a main mod class that Forge loads and uses as a starting point when it runs your mod. Before getting started, you’ll want to delete all the existing code that comes in the MDK by deleting the com.example.examplemod package. For this tutorial, I’ll be putting all of the code in the net.shadowfacts.tutorial package, so you’ll need to create that in your IDE. Next, create a class called TutorialMod.
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
package net.shadowfacts.tutorial;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
@Mod(modid = TutorialMod.modId, name = TutorialMod.name, version = TutorialMod.version)
public class TutorialMod {
public static final String modId = "tutorial";
public static final String name = "Tutorial Mod";
public static final String version = "1.0.0";
@Mod.Instance(modId)
public static TutorialMod instance;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
System.out.println(name + " is loading!");
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
}
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event) {
}
}
Now if we run the Minecraft Client through IDEA, Tutorial Mod is loading! should be printed out in the console. Now that we’ve got some code that’s actually running, let’s take a look at what it does.
@Mod(...)(L8): This marks ourTutorialModclass as a main mod class so that Forge will load it.@Mod.Instance(modId)(L15-L16): The@Mod.Instanceannotation marks this field so that Forge will inject the instance of our mod that is used into it. This will become more important later when we’re working with GUIs.@Mod.EventHandlermethods (L15, L20, L25): This annotation marks ourpreInit,init, andpostInitmethods to be called by Forge. Forge determines which method to call for which lifecycle event by checking the parameter of the method, so these methods can be named anything you want.