创建简单方块
在学习了创建物品之后,我们还要学习创建方块。创建方块和物品有些类似,但还是有一些不同。因为我们平时在物品栏中的方块,其实都是物品,只有放在世界中的方块才是真正的方块。因此,我们创建方块时,不仅要注册这个方块,还需要注册这个方块的物品形态。例如末地传送门,它只能放在世界中,却不能拿在手上,就是因为末地传送门只注册了方块,而没有注册它的物品形态。
直接开始
实例化并创建方块的部分和物品差不多,代码如下:
src/main/java/xyz/bzstudio/modderguide/block/MGBlocks.java (部分)
:
public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, ModderGuide.MODID);
public static final RegistryObject<Block> TEST_BLOCK = BLOCKS.register("test_block", () -> {
return new Block(Block.Properties.create(...));
});
区别就在于Properties
,这里的Properties
与物品的有区别,需要使用create()
方法进行创建,还需要传入一个Material
。
Material
,顾名思义,就是方块的材质。Minecraft会通过Material
来判定方块的一些属性。例如,如果读者传入Material.WOOD
,那么该方块将具有类似于木头的属性,例如可燃烧、可使用斧头加快挖掘速度等。在本文则以Material.ROCK
(岩石) 为例。
new Block(Block.Properties.create(Material.ROCK));
别忘了Properties
的其它方法,例如sound()
、hardnessAndResistance()
等方法。至于意思,你应该能理解。
最后,别忘了在主类添加事件监听。
打开游戏,你应该可以通过/setblock
指令放置方块了。
方块的物品形态
但你会发现,我们的方块无法拿在手上。因为我们没有注册它的物品形态。
Minecraft提供了一个叫BlockItem
的类,这个类其实就是个Item
,但它充当着沟通物品与方块的角色。我们只要在MGItems
里注册即可。
src/main/java/com/github/modderguide/item/MGItems (部分)
:
public static final RegistryObject<Item> TEST_BLOCK = ITEMS.register("test_block", () -> {
return new BlockItem(MGBlocks.TEST_BLOCK.get(), new Item.Properties().group(MGItemGroup.MODDERGUIDE));
});
方块的战利品表
但你应该会发现,我们在生存模式时挖掉该方块却不会掉落物品。这是因为我们的方块还没有战利品表。战利品表就是掉落物表,不仅方块的掉落物要靠战利品表指定,实体的掉落物也要靠它。
Minecraft的方块的战利品表存放在data/minecraft/loot_tables/blocks
,因此我们也在src/main/resources
下新建目录data/<modid>/loot_tables/blocks
,然后我们参考原版的写法,自己写一个战利品表即可。
src/main/resources/data/modderguide/loot_tables/blocks/test_block.json
:
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "modderguide:test_block"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
现在打开游戏,我们的方块应该已经成功创建了~