我的世界Minecraft Mod开发学习笔记 - 实现一个简单的红靶心Block


概述

本文使用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, grouparchivesBaseName

  version = "1.0.0"
  group= "minecraftfun"
  archivesBaseName = "target-block-mod"

修改 mcmod.info

编辑 mcmod.info以修改modid, namedescription.

  "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文件也可以从这里下载.


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM