地物——浅谈Minecraft地形生成(九)
之前的章节中,我们提到了地物(Feature)。什么是地物呢?在Wiki的定义中,地物是在世界生成中用以生成特殊元素的功能。如花、树木、矿物的团簇等。
地物类型
地物类型决定了一个地物包含了哪些东西,比如如果它的类型为树,就会拥有树干和树叶,如果是花,就有各种类型的花朵。
定义地物类型的json文件储存在数据包的data/<命名空间>/worldgen/configured_feature
文件夹下,它的基本格式如下:
其中,config
的内容根据type
中的内容决定。而type的类型相当多样(见Wiki)。而比较重要的或者说比较常用的,就有tree
(树木),fossil
(自定义结构,以后会说),netherrack_replace_blobs
/replace_single_block
/(都是替换方块),以及还有三个功能性的,random_boolean_selector
(随机从两个地物中选择一个),simple_random_selector
(随机从列表中选择一个地物且概率均等),random_selector
(按照设置的权重随机从列表中选择一个地物)。
地物放置
放置修饰器(Placement Modifier)决定了一个地物类型在世界中应该如何被生成,而放置修饰器则是在已放置的地物(Placed Feature)文件中配置的。它存放在数据包的data/<命名空间>/worldgen/placed_feature
目录下,其格式如下:
而放置修饰器的具体类型可以在这里找到:放置修饰器。
在放置地物的过程中,首先将会获取到要放置的地物的初始坐标。对于直接放置的地物而言,这个初始坐标是一个区块的西北角,即一个区块中xz坐标较小的位置;对于被其他地物放置的地物而言,这个初始坐标就是调用此地物的地物在经过放置修饰器修饰后的坐标。
随后,初始坐标将会被传入放置修饰器列表的第一个放置修饰器进行处理(如果没有放置修饰器就直接返回原坐标),然后继续将放置修饰器处理后的结果传给下一个放置修饰器,直到列表完成。值得注意的是,放置修饰器可能会传回”空“的坐标,也就是阻止此地物生成,此时此后的放置修饰器将不会被进行,转而直接放弃此次生成。
例如,我们有一个简单的例子:
{ "feature": "minecraft:oak", "placement": [ { "type": "minecraft:biome" }, { "type": "minecraft:count", "count": 4 }, { "type": "minecraft:in_square" }, { "type": "minecraft:rarity_filter", "chance": 4 } ] }
这个例子中,按照顺序有四个放置修饰器。第一个放置修饰器是biome
,它用于限制地物只能被放置在可以放置此地物的生物群系中,也就是说只有我们上一章里面的features
地物列表中包含此地物的生物群系才会生成这种地物。第二个放置修饰器是count
,它的值为四,所以会返回四个和输入坐标一样的坐标,而这四个返回的坐标每一个都会分别执行一次后续的放置修饰器。第三个放置修饰器是in_square
,它将会让输入的坐标在xz轴上随机增加一个值从而实现地物的随机分布。现在,这四个坐标将会被传入最后一个放置修饰器,也就是rarity_filter
,它只会以1/chance
的概率通过输入的坐标,因此四个输入的坐标,平均而言只会有一个坐标能成功通过。最后,这个坐标将会被放置这个地物。值得注意的是,rarity_filter
中的chance
是一个正整数,且不是直接通过的概率。相反,它的倒数才是通过的概率。
小结
我们用了三个章节来讲解自定义生物群系的生成过程。在这简短的三章中,我们首先讲解了生物群系是如何生成的,然后是生物群系如何定义的,最后是如何生成生物群系中的花花草草来丰富我们的世界。从下一个章节开始,我们将会开始讲解结构的生成,包括自定义结构,自定义地物结构,模板池,拼图等内容。