矿物生成
在这节中我们将来学习如何进行矿物生成。在学习这件之前请阅读本章的介绍,对世界生成有个大概的印象。
正如我们之前所说的,矿物生成属于Biome
的个Feature
,而如果你想要添加矿物生成,其实也就是向生物群系中添加一个新的Feature
。接下来看代码
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class OreGen {
@SubscribeEvent
public static void onSetUpEvent(FMLCommonSetupEvent event) {
for (Biome biome : ForgeRegistries.BIOMES) {
biome.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES,
Feature.ORE.withConfiguration(
new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE,
BlockRegistry.obsidianBlock.get().getDefaultState(),
3)
).withPlacement(Placement.COUNT_DEPTH_AVERAGE.configure(new DepthAverageConfig(30, 30, 20)))
);
}
}
}
没错就这么简单。
因为所有的世界生成都是服务端的行为,所以这里我们自然需要订阅FMLCommonSetupEvent
事件。
然后我们通过ForgeRegistries.BIOMES
获取所有注册好的生物群系,并且调用biome.addFeature
向生物群系中添加Feature
(也就是我们的矿物)。Feature
有不同的阶段,这里我们填入的是GenerationStage.Decoration.UNDERGROUND_ORES
代表矿物生成阶段。然后就是通过Feature.ORE.withConfiguration
来创建一个矿物生成的Feature
。
Feature.ORE.withConfiguration(
new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE,
BlockRegistry.obsidianBlock.get().getDefaultState(),
3))
.withPlacement(Placement.COUNT_DEPTH_AVERAGE.configure(new DepthAverageConfig(30, 30, 20)))
)
Feature.ORE.withConfiguration
需要传入一个OreFeatureConfig
用来配置我们的矿物生成Feature
,因为我们是在主世界生成矿物,所以一个参数填入的是OreFeatureConfig.FillerBlockType.NATURAL_STONE
,第二个参数指定你要生成方块的默认状态,这里我们选择生成我们之前创建的黑曜石方块,第三个参数控制了每次生成的最大数量。
光这样你的矿物还没发生成,因为你还没有指定你的矿物需要生成在哪里,生成几次。这就是withPlacement
的作用,这里你要传入一个Placement
,这个Placement
是用来控制你的Feature
需要生成在哪里的,原版提供了很多的Placement
,这里我们使用Placement.COUNT_DEPTH_AVERAGE
,调用它的configure
的方法,里面需要传入一个DepthAverageConfig
,这里的三个参数分别控制的,每个区块的生成次数,最低生成高度,以及生成范围。
至此,我们的矿物生成以及创建完毕。
可以看见我们的矿物正常的生成了。
如果你想要更加复杂的自定义矿物生成,可以重写Feature<OreFeatureConfig>
。