概述
本文使用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文件也可以從這里下載.
