概述
本文使用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/
└── /
├── blockstates/
│ └── .json
├── lang/
│ └── en_us.lang
├── models/
│ ├── block/
│ │ └── _model.json
│ └── item/
│ └── .json
└── textures/
└── blocks/
修改 block states文件
src/main/resources/targetblockmod/blockstates/target_block_registry.json
{
"variants": {
"normal": { "model": ":_model" }
}
}
将MODID替换为TargetBlockMod.MODID, BLOCK_UNLOCALIZED_NAME替换为TargetBlock.UNLOCALIZED_NAME.
修改mod语言文件
src/main/resources/targetblockmod/lang/en_us.lang
tile..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": ":blocks/",
"up": ":blocks/",
"north": ":blocks/",
"east": ":blocks/",
"south": ":blocks/",
"west": ":blocks/",
}
将MODID替换为TargetBlockMod.MODID, FACE_IMAGE则是用于block六个面的图形文件名, 去掉.png后缀.
修改item文件
src/main/resources/targetblockmod/models/item/target.json
"parent": ":block/_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文件也可以从这里下载.