Minecraft Modding 模组制作-自定义方块

目录

注意:本文代码只表现个人实现方式及习惯,本文解释只体现个人理解,不一定符合规范(除非声明了这是规范)

自定义方块

一般方块

定义物品所属类

类似物品的添加, M i n e c r a f t Minecraft Minecraft中所有方块都继承类 B l o c k Block Block,我们在<author>.<modid>.block包下新建一个ModBlock.java并输入以下代码

java 复制代码
package author.modid.block;

import author.modid.Modid;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;     //调用材料类

public class ModBlock extends Block {
    public ModBlock() {
        super(Material.SAND);     //参数为该物品的材料种类,此处为沙子
        this.setUnlocalizedName(Modid.MODID + ".modBlock");
        this.setRegistryName("mod_block");
        this.setHarvestLevel("shovel", 0);     //设置挖掘工具和挖掘等级,此处分别为锹,0级
        this.setHardness(0.5F);     //设置硬度(可以决定挖掘速度)
        this.setResistance(0.5F / 3.0F);     //设置爆炸抗性(但是爆炸抗性会将这里的数值翻三倍)
    }
}

代码中的super用于调用父类的含参构造方法,必须位于子类构造方法的第一句,如果没有super,子类的构造方法会在开始时自动调用父类的默认构造方法,而默认构造方法是无参的,并且如果子类含有默认构造方法而父类没有默认构造方法则会报错

注册方块

类似物品的注册,我们在<author>.<modid>.block包下新建一个BlockRegistryHandler.java并输入以下代码

java 复制代码
package author.modid.block;

import ...

@Mod.EventBusSubscriber
public class BlockRegistryHandler {
    public static final ModBlock MOD_BLOCK = new ModBlock();
    @SubscribeEvent
    public static void onRegistry(Register<Block> event) {
        event.getRegistry().registerAll(
                MOD_BLOCK
        );
    }
}

这简直和物品一模一样啊,但是不一样的马上就来了

注册方块对应物品

现在需要注册刚才那个方块对应的物品,这也有现成的类可用------ I t e m B l o c k ItemBlock ItemBlock,它的构造函数的参数就是一个注册了的方块,接下来要在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加语句定义一个 I t e m B l o c k ItemBlock ItemBlock来对应刚才那个方块

java 复制代码
    public static final ItemBlock MOD_ITEM_BLOCK = new
            ItemBlock(BlockRegistryHandler.MOD_BLOCK);

但是forge的 I t e m B l o c k ItemBlock ItemBlock的构造方法唯一没有完成的初始化是设置registry name,为避免对于每个方块都要在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加语句来设置registry name而导致冗长,可以给 I t e m B l o c k ItemBlock ItemBlock写一个子类并在其构造方法中加入初始化registry name的语句,具体操作为在<author>.<modid>.item包下新建一个MyItemBlock.java并输入以下代码

java 复制代码
package author.modid.item;

import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;

import java.util.Objects;

public class MyItemBlock extends ItemBlock {
    public MyItemBlock(Block block) {
        super(block);     //必须要加,因为ItemBlock没有默认的构造方法
        this.setRegistryName(Objects.requireNonNull(block.getRegistryName()));     //设置registry name
    }
}

当然,在此之后还要把 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler的那条定义语句中的ItemBlock改为MyItemBlock

添加材质

方块的材质需要用它对应的 I t e m B l o c k ItemBlock ItemBlock进行添加,方法和普通物品是一样的,为了以后都可以方便地添加普通物品的材质,可在 I t e m R e g i s t r y H a n d l e r ItemRegistryHandler ItemRegistryHandler中添加一个方法如下

java 复制代码
    @SideOnly(Side.CLIENT)
    private static void setResourceLocation(Item item) {
        ModelLoader.setCustomModelResourceLocation(item, 0,
                new ModelResourceLocation(Objects.requireNonNull(item.getRegistryName()), "inventory"));
    }

这个方法类似于含metadata的物品的setSubtypeResourceLocation,所以在指定资源位置时只需要在onModelRegistry中加入一行

java 复制代码
        setResourceLocation(MOD_ITEM_BLOCK);

接下来在相应位置放入资源,先在main.resources.assets.modid.blockstates中新建一个mod_block.json文件,输入以下内容

java 复制代码
{
  "forge_marker" : 1,
  "defaults" : {
    "model" : "minecraft:cube_all",     //说明该方块各面完全相同
    "textures" : { "all" : "modid:blocks/mod_block" }     //指定图片文件位置
  },
  "variants" : {
    "normal" : [{}],     //说明该方块的显示方式
    "inventory" : [{ "transform" : "forge:default-block" }]     //说明该方块对应的物品显示方式与原版方块对应的物品一样
  }
}

接下来新建文件夹及放入图片文件的操作和物品类似

添加各面不同的材质

陆续更新中...

本地化

方块的本地化与物品的唯一不同点在于它将item换为了tile,即

java 复制代码
tile.modid.modBlock.name=模组方块

该本地化同时作用于方块及其对应物品

更多样的方块的实现方式会在之后陆续更新

参考

Harbinger

土球球的《我的世界Minecraft模组开发指南》
Forge文档
我的世界开发者中文指南


打赏

制作不易,若有帮助,欢迎打赏!

相关推荐
计算机学姐3 小时前
基于SpringBoot的社团管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
天上掉下来个程小白3 小时前
微服务-25.网关登录校验-网关传递用户到微服务
java·数据库·微服务
vivi_and_qiao4 小时前
HTML的form表单
java·前端·html
Slaughter信仰4 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm
心灵宝贝4 小时前
Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)
java·开发语言·macos
ta是个码农4 小时前
Mysql——日志
java·数据库·mysql·日志
今***b5 小时前
Python 操作 PPT 文件:从新手到高手的实战指南
java·python·powerpoint
David爱编程5 小时前
volatile 关键字详解:轻量级同步工具的边界与误区
java·后端
fatfishccc7 小时前
Spring MVC 全解析:从核心原理到 SSM 整合实战 (附完整源码)
java·spring·ajax·mvc·ssm·过滤器·拦截器interceptor
没有bug.的程序员7 小时前
MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术
java·数据库·sql·mybatis