本篇教程的视频

本篇教程的源代码

GitHub地址:

查看源代码

这篇教程我们来看看小植物如何添加,并添加它们的盆栽

当然,这里我们只讲一个方块大小的花,像玫瑰花这种两个方块大小的,感兴趣的同学可以自行研究

这里我们还是来看看源代码

1
2
3
4
5
6
7
8
public static final Block DANDELION = register("dandelion", 
new FlowerBlock(MobEffects.SATURATION, 7, BlockBehaviour.Properties.of()
.mapColor(MapColor.PLANT)
.noCollission()
.instabreak()
.sound(SoundType.GRASS)
.offsetType(BlockBehaviour.OffsetType.XZ)
.pushReaction(PushReaction.DESTROY)));

这里我们以DANDELION为例,这也就是蒲公英

可以看到,它实例化的是FlowerBlock

FlowerBlock的第一个参数是合成谜之炖菜时携带的效果,第二个参数是持续时间,单位

后面就是方块的设置,里面的参数除了offsetType,其他我们也都见过了,这里就不解释了

offsetType这个是随机偏移,当我们放置花这种比较小的东西时,你会发现它并不是放置在方块正中央的,
而是向XZ轴上随机偏移了一些,这正是offsetType方法起的作用

接下来再看看盆栽花

1
2
3
4
5
6
7
8
9
10
public static final Block POTTED_DANDELION = register("potted_dandelion", flowerPot(DANDELION));

private static FlowerPotBlock flowerPot(Block pContent, FeatureFlag... pRequiredFeatures) {
BlockBehaviour.Properties blockbehaviour$properties = BlockBehaviour.Properties.of().instabreak().noOcclusion().pushReaction(PushReaction.DESTROY);
if (pRequiredFeatures.length > 0) {
blockbehaviour$properties = blockbehaviour$properties.requiredFeatures(pRequiredFeatures);
}

return new FlowerPotBlock(pContent, blockbehaviour$properties);
}

盆栽花的注册封装了一个方法,不过它也没有什么特别的地方,实例化的是FlowerPotBlock

pRequiredFeatures这个参数是可选的,用来指定这个盆栽花需要哪些世界生成特性,但原版似乎没有用到这个

注册花

接下来我们就来注册自己的盆栽花

注册方块

1
2
3
4
5
public static final RegistryObject<Block> SIMPLE_FLOWER = registerBlocks("simple_flower",
() -> new FlowerBlock(() -> MobEffects.NIGHT_VISION, 4, BlockBehaviour.Properties.copy(Blocks.DANDELION)));

public static final RegistryObject<Block> POTTED_SIMPLE_FLOWER = BLOCKS.register("potted_simple_flower",
() -> new FlowerPotBlock((() -> (FlowerPotBlock) Blocks.FLOWER_POT), SIMPLE_FLOWER, BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION)));

花实例化的是FlowerBlock,盆栽花实例化的是FlowerPotBlock

注意,盆栽花是没有对应的方块物品的,所以我们直接使用BLOCKS.register来注册

加入物品栏

1
pOutput.accept(ModBlocks.SIMPLE_FLOWER.get());

添加映射

接下来我们到模组主类的commonSetup方法下添加以下语句

1
2
3
event.enqueueWork(() -> {
((FlowerPotBlock) Blocks.FLOWER_POT).addPlant(ModBlocks.SIMPLE_FLOWER.getId(), ModBlocks.POTTED_SIMPLE_FLOWER);
});

这是让我们的盆栽花能正确放置我们的花

数据文件

战利品列表

1
2
3
dropSelf(ModBlocks.SIMPLE_FLOWER.get());
add(ModBlocks.POTTED_SIMPLE_FLOWER.get(),
createPotFlowerItemTable(ModBlocks.POTTED_SIMPLE_FLOWER.get()));

盆栽花的战利品列表同样特殊

语言文件

1
2
add(ModBlocks.SIMPLE_FLOWER.get(), "Simple Flower");
add(ModBlocks.POTTED_SIMPLE_FLOWER.get(), "Simple Flower Pot");

模型文件

1
2
3
4
5
6
7
8
9
10
simpleBlock(ModBlocks.SIMPLE_FLOWER.get(), 
models().cross("simple_flower", modLoc("block/simple_flower")).renderType("cutout"));

pottedFlower(ModBlocks.POTTED_SIMPLE_FLOWER, "simple_flower");

private <T extends Block> void pottedFlower(RegistryObject<T> block, String flowerName) {
simpleBlock(block.get(), models().withExistingParent(block.getId().getPath(), mcLoc("block/flower_pot_cross"))
.texture("plant", modLoc("block/" + flowerName))
.renderType("cutout"));
}

这个方法与树苗的差不多,不过盆栽花我们需要使用额外的方法创建

还有物品的模型文件

1
simpleBlockItem(ModBlocks.SIMPLE_FLOWER);

测试

那么放好贴图文件之后,我们就可以进入游戏进行测试了