概述
本文使用Forge MDK (Mod Development Kit)实现一个显示红靶心图案的Block.
运行环境
-
Java 1.8 JDK
-
Minecraft Java Edition 1.12.2
-
Forge and MDK 1.12.2
安装Forge和MDK
-
从Minecraft Forge官网下载Minecraft Forge - MC 1.12.2 installer和Mod Development Kit (MDK)包.
-
运行Forge installer安装Forge
-
将MDK压缩包解压的指定目录, 例如
C:\mdk
.
设置Mod项目
在MDK目录下, 运行gradlew setupDecompWorkspace
命令以创建如下Mod项目结构
mdk/
├── build/
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── src/
│ ├── main/
│ ├── java/
│ └── resources/
│ ├── mcmod.info
│ └── pack.mcmeta
├── build.gradle
├── gradlew
└── gradlew.bat
设置Gradle build文件
编辑build.gradle
并修改version
, group
和archivesBaseName
version = "1.0.0"
group= "minecraftfun"
archivesBaseName = "target-block-mod"
修改 mcmod.info
编辑 mcmod.info
以修改modid
, name
和description
.
"modid": "targetblockmod",
"name": "Target Block Mod",
"description": "Target Block Mod",
提示: modid
只能使用小写字母.
创建target block Java类
src/main/java/minecraftfun/TargetBlock.java
package minecraftfun;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.util.BlockRenderLayer;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TargetBlock extends Block {
public static final String NAME = "target";
private static final String UNLOCALIZED_NAME = "target_block";
private static final String REGISTRY_NAME = "target_block_registry";
public TargetBlock() {
super(Material.ROCK);
this.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
this.setUnlocalizedName(UNLOCALIZED_NAME);
this.setRegistryName(REGISTRY_NAME);
}
@SideOnly(Side.CLIENT)
public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.SOLID;
}
}
创建mod Java类
src/main/java/minecraftfun/TargetBlockMod.java
package minecraftfun;
import org.apache.logging.log4j.Logger;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.client.model.ModelLoader;
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.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
@Mod(modid = TargetBlockMod.MODID, name = TargetBlockMod.NAME, version = TargetBlockMod.VERSION)
public class TargetBlockMod
{
public static final String MODID = "targetblockmod";
public static final String NAME = "Target Block Mod";
public static final String VERSION = "1.0.0";
public static final String RESOURCE_INVENTORY = "inventory";
public static TargetBlock targetBlock;
public static ItemBlock itemTargetBlock;
private static Logger logger;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
logger = event.getModLog();
preInitTargetBlock();
}
@EventHandler
public void init(FMLInitializationEvent event)
{
logger.info("Mod initlialised :" + NAME);
}
private void preInitTargetBlock() {
targetBlock = new TargetBlock();
ForgeRegistries.BLOCKS.register(targetBlock);
itemTargetBlock = new ItemBlock(targetBlock);
itemTargetBlock.setRegistryName(targetBlock.getRegistryName());
ForgeRegistries.ITEMS.register(itemTargetBlock);
ModelResourceLocation chinaModelResourceLocation = new ModelResourceLocation(
MODID + ":" + TargetBlock.NAME, RESOURCE_INVENTORY);
final int DEFAULT_ITEM_SUBTYPE = 0;
ModelLoader.setCustomModelResourceLocation(itemTargetBlock, DEFAULT_ITEM_SUBTYPE, chinaModelResourceLocation);
}
}
使用@preInitTargetBlock
方法来初始化红靶心Block.
设置resource目录结构
在src/main/resources
目录下, 创建如下目录和文件, 将MODID
替换为TargetBlockMod.MODID
, BLOCK_REGISTRY_NAME
替换为TargetBlock.REGISTRY_NAME
, BLOCK_UNLOCALIZED_NAME
替换为TargetBlock.UNLOCALIZED_NAME
,BLOCK_NAME
替换为TargetBlock.NAME
.
src/main/resources/
└── <MODID>/
├── blockstates/
│ └── <BLOCK_REGISTRY_NAME>.json
├── lang/
│ └── en_us.lang
├── models/
│ ├── block/
│ │ └── <BLOCK_UNLOCALIZED_NAME>_model.json
│ └── item/
│ └── <BLOCK_NAME>.json
└── textures/
└── blocks/
修改 block states文件
src/main/resources/targetblockmod/blockstates/target_block_registry.json
{
"variants": {
"normal": { "model": "<MODID>:<BLOCK_UNLOCALIZED_NAME>_model" }
}
}
将MODID
替换为TargetBlockMod.MODID
, BLOCK_UNLOCALIZED_NAME
替换为TargetBlock.UNLOCALIZED_NAME
.
修改mod语言文件
src/main/resources/targetblockmod/lang/en_us.lang
tile.<BLOCK_UNLOCALIZED_NAME>.name=Bullseye Target
将BLOCK_UNLOCALIZED_NAME
替换为TargetBlock.UNLOCALIZED_NAME
.
修改block model文件
src/main/resources/targetblockmod/models/block/target_block_model.json
"parent": "block/cube",
"textures": {
"down": "<MODID>:blocks/<FACE_IMAGE>",
"up": "<MODID>:blocks/<FACE_IMAGE>",
"north": "<MODID>:blocks/<FACE_IMAGE>",
"east": "<MODID>:blocks/<FACE_IMAGE>",
"south": "<MODID>:blocks/<FACE_IMAGE>",
"west": "<MODID>:blocks/<FACE_IMAGE>",
}
将MODID
替换为TargetBlockMod.MODID
, FACE_IMAGE
则是用于block六个面的图形文件名, 去掉.png
后缀.
修改item文件
src/main/resources/targetblockmod/models/item/target.json
"parent": "<MODID>:block/<BLOCK_UNLOCALIZED_NAME>_model"
将MODID
替换为TargetBlockMod.MODID
, BLOCK_UNLOCALIZED_NAME
替换为TargetBlock.UNLOCALIZED_NAME
.
block图形文件
创建16*16的PNG图形文件, 放在src/main/resources/targetblockmod/textures/blocks/
目录下.
编译Mod
运行如下命令以编译Mod
gradlew build.
该命令在build/libs
目录下生成[archivesBaseName]-[version].jar
文件.
测试Mod
将编译生成的mod jar文件放入Minecraft mods目录(在Windows下为 %appdata%.minecraft\mods), 运行Minecraft.
打开inventory并找到"Bullseye Target"block.
小结
对Minecraft Mod开发感兴趣的朋友不妨试一试, 所有源代码和mod jar文件也可以从这里下载.