我的世界1.20.1模组开发---4.添加方块

发布时间 2023-10-27 16:20:47作者: 小明同学404

介绍

  在游戏中添加方块的方法和之前添加物品的方法类似,都是先通过DeferredRegister.create方法获取对应类型的注册表,然后再把对应的方块添加到注册表中,最后在Mod事件总线上添加该注册表即可。但是由于是方块,会有一些地方和物品不太一样的地方。添加一个方块要分别注册方块方块对应的物品,前者是可以放置在游戏中的实体方块,后者是可以通过一些指令获得或者参与合成用的方块物品,注册方块物品的方法就是前面的注册物品的方法,添加方块后我们还可以为方块设置一些属性,例如方块的硬度、破坏是否获得经验、掉落物是什么之类的属性。由于大部分和添加物品的步骤差不多,下面直接上代码部分了解。

  代码

  我们创建一个ModBlocks类来管理我们添加的方块。

package com.hmy.test1mod.block;

import com.hmy.test1mod.Test1Mod;
import com.hmy.test1mod.block.custom.JumpBlock;
import com.hmy.test1mod.item.ModItems;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

import java.util.function.Supplier;

public class ModBlocks {
    //获取方块注册表
    public static final DeferredRegister<Block>BLOCKS=
            DeferredRegister.create(ForgeRegistries.BLOCKS, Test1Mod.MOD_ID);

    //用我们封装好的方法注册方块和对应物品,第一个参数为方块名字,第二个参数为Block对象
    public static final RegistryObject<Block>BLUE_BLOCK=registryBlock("blue_block",
            ()->new Block(BlockBehaviour.Properties.of()//创建一个空属性
                    .strength(1.5F, 6.0F)//设置硬度和爆炸防护强度
            ));
    //添加这个方块对应的矿石
    public static final RegistryObject<Block>BLUE_ORE=registryBlock("blue_ore",
            //返回一个掉落经验的方块
            ()->new DropExperienceBlock(BlockBehaviour.Properties.of()//创建一个空属性
                    .strength(1.5F, 3.0F)//设置硬度和爆炸防护强度
                    ,UniformInt.of(1, 2)));//设置经验值掉落范围

    //自定义注册方法方法,因为要同时注册方块和方块对应的物品,就写在一起了
    private static <T extends Block> RegistryObject<T> registryBlock(String name, Supplier<T>block){
        RegistryObject<T>toReturn= BLOCKS.register(name,block);//注册方块
        registerBlockItem(name,toReturn);//注册对应物品
        return toReturn;
    }

    //把方块对应的物品注册的Item注册表上
    private static <T extends Block> RegistryObject<Item> registerBlockItem(String name,RegistryObject<T> block){
        return  ModItems.ITEMS.register(name,()->new BlockItem(block.get(),new Item.Properties()));
    }

    //添加注册
    public static void register(IEventBus eventBus){
        BLOCKS.register(eventBus);
    }
}

  由于注册方块时还要注册对应的物品,所有专门写了一个方法,用来同时注册 方块及对应的物品。创建方块时,我们使用了BlockBehaviour.Properties.of()来创建了一个方块的空属性,之后我们可以用链式编码的方式继续在后面设置我们想要的属性,也可以直接用BlockBehaviour.Properties.copy(BLOCKS.STONE)方法先复制原版某个方块的属性,在此基础上修改我们需要的属性,具体有哪些属性可以去源码看看原版怎么写的,这里不在过多赘述。

  上面的代码中添加的第二个方块是DropExperienceBlock类的方块,字面意思不难看出这是破坏掉落经验的方块,有很多类似这样的类都继承于Block类,实现了各种各样的方块,大家可以根据需要去源码里看一下,都有哪些方块。不同的方块类创建时有不同的参数需要传递,下面以DropExperienceBlock类的方块为例。

    //第一个参数为方块的属性,第二个参数为掉落的经验值的范围
    public DropExperienceBlock(BlockBehaviour.Properties pProperties, IntProvider pXpRange) {
      super(pProperties);
      this.xpRange = pXpRange;
   }

  第一个参数就是正常的方块属性,和前面的写法一样,第二个参数我们是设置经验掉落的范围,我们可以传入他所需要类型的一个子类UniformInt类,使用其中的of方法可以返回一个设置好最大者最小值的该类,类似于这样UniformInt.of(1, 2),这样就设置了方块破坏时掉落经验为1-2点之间。

  最后在我们的Test1Mod主类中向Mod事件总线添加方块注册表即可。

        ModBlocks.register(modEventBus);//添加方块注册表到Mod事件总线

   以上步骤完成后,我们就把对应的方块以及物品都添加完成了,后面需要设置相应的json文件,我们这里同样采用自动生成的方式生成json文件,具体的步骤将在3.数据生成文章中具体介绍,这里不再过多说明。