Modern Minecraft Modding with Forge
What do we want to build?
-
When a player
- hits a monster
- with a golden axe
- named Stormbreaker,
- strike the monster with lightning and
- make an explosion.
-
When a player
- uses the
/thunder
command - summon lightning around the player
- uses the
Download Forge
Using 1.13.2 because it's more mature. 1.14 is still under active development.
- https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.13.2.html
unzip forge-1.13.2-25.0.219-mdk.zip -d storm-hammer
cd storm-hammer
Set up dev environment
Must use Java 8. Java 9+ not supported. jenv local 1.8
./gradlew genIntellijRuns
- Open Intellij Idea
- Import project > select directory
- Import as gradle project
- Execute
tasks > fg_runs > runClient
- Verify example mod
- Create new singleplayer world
- See logs in Idea
:runClient
task
Set up mod metadata
- Edit
src > main > resources > META-INF > mods.toml
- Set
modId
,displayName
, anddescription
- Edit
ExampleMod.java
- Set
@Mod("stormhammer")
- Delete unused lifecycle event handlers
Create first event handler
@SubscribeEvent
public void onHurt(LivingHurtEvent event) {
LOGGER.info(">>> " + event.getSource().getImmediateSource().getName().getString() + " hurt " +
event.getEntity().getName().getString());
}
Summon lightning
World world = event.getEntityLiving().getEntityWorld();
// Summon lightning
world.addWeatherEffect(new EntityLightningBolt(
world,
event.getEntity().posX,
event.getEntity().posY,
event.getEntity().posZ,
false));
Create an explosion
World world = event.getEntityLiving().getEntityWorld();
// Make an explosion
world.createExplosion(
event.getEntity(),
event.getEntity().posX,
event.getEntity().posY,
event.getEntity().posZ,
8,
true);
Package jar
- Set
group
andarchivesBaseName
inbuild.gradle
- Execute
tasks > build > build
(don't usejar
) - Extract built jar from
build/libs
directory
Run with Forge
- Copy mod into Forge mods directory
- Start Forge from Minecraft launcher