本篇教程的视频
本篇教程的源代码
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这个是随机偏移,当我们放置花这种比较小的东西时,你会发现它并不是放置在方块正中央的,
而是向X和Z轴上随机偏移了一些,这正是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);
|
测试
那么放好贴图文件之后,我们就可以进入游戏进行测试了