本篇教程的视频:

本篇教程源代码

GitHub地址:TutorialMod-Flower-1.21

介绍

在游戏中作为一种小型植被,和一样,是一种装饰性的方块

当然,在里面也分大小,比如玫瑰花,就是两格高的花,而像蒲公英,就是一格高的花

在游戏中可以制作染料,也可以制作谜之炖菜(不同的花有不同的效果,这个等会会讲)

相比较而言,这种是小植被的写法要简单得多

本篇教程我们来写一个单方块的花,这样它也可以种植在花盆里

查看源代码

常规操作,我们先来看看源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static final Block DANDELION = register(
"dandelion",
new FlowerBlock(
StatusEffects.SATURATION,
0.35F,
AbstractBlock.Settings.create()
.mapColor(MapColor.DARK_GREEN)
.noCollision()
.breakInstantly()
.sounds(BlockSoundGroup.GRASS)
.offset(AbstractBlock.OffsetType.XZ)
.pistonBehavior(PistonBehavior.DESTROY)
)
);

我们以DANDELION为例,这个是蒲公英

可以看到它实例化的是FlowerBlock,里面的参数是效果持续时间(秒)方块设置

这里的效果是SATURATION,也就是饱和,持续时间和前面写食物时不一样,这里的单位是秒,这个效果也就是合成谜之炖菜时会带上的效果

方块设置里面的大部分东西我们都讲过,这里就讲一个offset,这个是一个偏移方法

因为在实际游戏中,我们在放置这些花草的时候,它是有一个偏移的,并不是完完全全在一个方块的正中央,这里使用的是AbstractBlock.OffsetType.XZ,即在XZ轴方向进行随机偏移

接下来我们看看盆栽蒲公英的写法

1
2
3
4
5
public static final Block POTTED_DANDELION = register("potted_dandelion", createFlowerPotBlock(DANDELION));

public static Block createFlowerPotBlock(Block flower) {
return new FlowerPotBlock(flower, AbstractBlock.Settings.create().breakInstantly().nonOpaque().pistonBehavior(PistonBehavior.DESTROY));
}

这里的POTTED_DANDELION是盆栽蒲公英,它的注册方法是createFlowerPotBlock,其实实例化的是FlowerPotBlock,里面的参数是方块设置

渲染层设置

1
2
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.SIMPLE_FLOWER, RenderLayer.getCutout());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.POTTED_SIMPLE_FLOWER, RenderLayer.getCutout());

这个是直接写在模组的ClientModInitializer中的

1
2
BLOCKS.put(ModBlocks.SIMPLE_FLOWER, RenderLayer.getCutout());
BLOCKS.put(ModBlocks.POTTED_SIMPLE_FLOWER, RenderLayer.getCutout());

而这个是写在我们之前写的Mixin类中,两者取其一即可

添加花

随后,我们来添加花

注册花

1
2
public static final Block SIMPLE_FLOWER = register("simple_flower",
new FlowerBlock(StatusEffects.NIGHT_VISION, 4f, AbstractBlock.Settings.copy(Blocks.DANDELION)));

我们简单写一个SIMPLE_FLOWER,它的效果是夜视,持续时间是4秒,方块设置copyDANDELION

注册盆栽花

再写一个盆栽花

1
2
public static final Block POTTED_SIMPLE_FLOWER = Registry.register(Registries.BLOCK, Identifier.of(TutorialMod.MOD_ID, "potted_simple_flower"),
new FlowerPotBlock(SIMPLE_FLOWER, AbstractBlock.Settings.copy(Blocks.POTTED_DANDELION)));

但要注意的是,我们这里注册盆栽花的时候,是直接调用Registry.register方法,因为它不需要返回方块物品,所以我们不能用之前的那个方法

加入物品栏

1
entries.add(ModBlocks.SIMPLE_FLOWER);

数据文件

语言文件

1
translationBuilder.add(ModBlocks.SIMPLE_FLOWER, "Simple Flower");

模型文件

1
blockStateModelGenerator.registerFlowerPotPlant(ModBlocks.SIMPLE_FLOWER, ModBlocks.POTTED_SIMPLE_FLOWER, BlockStateModelGenerator.TintType.NOT_TINTED);

这里我们用到了registerFlowerPotPlant方法,传入盆栽花,以及TintType,这个是用来设置颜色的,这里我们用的是NOT_TINTED,即不着色

这个语句可以生成盆栽花的模型文件,就写这一个即可

随后我们跑完数据生成之后,将花的材质放在对应的位置,我们就可以启动我们的游戏了