我的世界1.20.1模组开发---4.添加方块
介绍
在游戏中添加方块的方法和之前添加物品的方法类似,都是先通过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点之间。
然后就要把方块添加到我们的创造模式物品栏中,在ModCreativeModeTab类中照着之前的添加物品方法添加方块即可。
pOutput.accept(ModBlocks.BLUE_BLOCK.get());
pOutput.accept(ModBlocks.BLUE_ORE.get());
最后在我们的Test1Mod主类中向Mod事件总线添加方块注册表即可。
ModBlocks.register(modEventBus);//添加方块注册表到Mod事件总线
以上步骤完成后,我们就把对应的方块以及物品都添加完成了,后面需要设置相应的json文件,我们这里同样采用自动生成的方式生成json文件,具体的步骤将在3.数据生成文章中具体介绍,这里不再过多说明。
注意:这里放置贴图的位置一定要按照要求放到指定的文件夹下,贴图的名称也要和你设置物品或方块的name属性值一样。出来特别标注的要注意一下,其他的都要和图中的结构和命名一样,不然可能无法找到贴图。