自定义生物群系——浅谈Minecraft地形生成(八)
上一章节中我们学会了如何在Minecraft中控制生物群系在世界中的生成。在本章节中,我们将会学到如何自定义一个生物群系,之后你就可以利用上一章节所学的知识,把你的生物群系加入到你的世界中了。
生物群系JSON
生物群系存储在数据包的data/<命名空间>/worldgen/biome
路径中的JSON文件中。
生物群系的JSON也比较长,因此我们拆成几个部分进行
生物群系属性
生物群系属性用于控制这个自定义生物群系的特殊属性,比如温度、降水等。
特别注意的是,这里生物群系的温度和之前上一章节说的温度不是同一种东西。上一章节中的温度是一个噪声参数,而这里的温度仅仅是用于控制生物群系是否会下雪,是否会伤害雪傀儡,是否会让叶子变得更黄一样。比如沙漠的温度比森林高,因此沙漠的叶子偏黄,而且雪傀儡会在其中受到伤害。在本章节中,我们把上一章节中作为噪声参数的温度称为“噪声温度”,而将此章节中用于控制生物群系表现效果的温度称为“气候温度”,以此区分。
不过一般来说,高气候温度的生物群系都会被控制在高噪声温度的地方生成。这样的好处是,由于温度噪声的变化是平滑的,高噪声温度和低噪声温度之间必然会出现一个中等的过渡区域,因此可以避免高温生物群系和低温生物群系相接的情况,比如沙漠和冰山相连,之类的情况发生,让生物群系的衔接更加的自然。
生物群系效果
生物群系效果用于控制生物群系中的颜色、声音、粒子效果等视觉听觉效果部分。
树叶(foliage_color
)和草地(grass_color
)的颜色除了手动指定以外,如果不填写,就会通过之前在生物群系属性中设置的temperature
和downfall
共同决定。
生物群系植被颜色的通用计算过程
在原版资源包中,在assets/minecraft/textures/colormap
文件夹下存在两个分辨率为256*256的颜色图,表示在不同的生物群系属性下树叶和草地应该是什么样的颜色。
首先,将这个生物群系中温度(temperature)和降水(downfall)进行钳制,将其控制在0.0~1.0之间(即高于1.0记作1.0,低于0.0记作0)。然后将钳制后的降水乘以钳制后的温度,记作d。将钳制后的温度记作t。此后,以颜色图的右下角为原点,取坐标点为(255 – t * 255 , 255 – d * 255),就得到这个生物群系中树叶和草地的颜色了。
grass_color_modifier
表示对生物群系的颜色进行进一步的修饰,提供了两种修饰方式,即沼泽和黑森林。
沼泽和红树林沼泽的草丛、花盆中的蕨、草方块、甘蔗以及粉红色花簇的茎的颜色会使用一个XZ平面上的柏林噪声函数来改变,当该函数的值低于-0.1时,沼泽和红树林沼泽中的草丛、草方块及甘蔗会使用颜色 #4c763c,否则使用 #6a7039。沼泽中的橡树、丛林、金合欢、深色橡树及红树的树叶以及藤蔓的颜色为 #6a7039,红树林沼泽中为 #8db127,均不受颜色图的影响。
黑森林中的草丛、花盆中的蕨、草方块、甘蔗以及粉红色花簇的茎颜色为对应颜色图中的颜色与 #fefefe进行按位与运算,然后与 #28340a取平均后的结果。
生物群系的粒子效果和命令particle
的格式比较相似。particle
能使用的粒子也都能使用在生物群系中,并且如果是有参数的粒子,在JSON中也需要把参数写明。详细如下:
生物群系的声音效果在Wiki中写的相当详细,这里就不赘述了。
生物群系地形雕刻器*
这个部分的内容我们以后补充
生物群系地物生成
生成地物是经过多个步骤完成的,即生成地物存在一个阶段性的顺序区别。在不同的阶段,会生成的不同的地物,而这个阶段的控制就是通过feature
列表完成的。至于地物和结构地物是什么呢,我们将会在之后的章节中讲到它们,现在可以将其理解为地面上花花草草之类的装饰物。在Wiki中,我们可以看到每个阶段大致对应的会生成什么样的地物。在主世界的平原群系(minecraft:plains
)中,它的feature
如下所示:
{... "features": [ [], [ "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ], [ "minecraft:amethyst_geode" ], [ "minecraft:monster_room", "minecraft:monster_room_deep" ], [], [], [ "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ], [], [ "minecraft:spring_water", "minecraft:spring_lava" ], [ "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:trees_plains", "minecraft:flower_plains", "minecraft:patch_grass_plain", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane", "minecraft:patch_pumpkin" ], [ "minecraft:freeze_top_layer" ] ], ...}
其中的每个字符串都对应的原版的一个地物的命名空间ID。但是一般情况下,如果你直接把这些命名空间ID填写到你自己的生物群系中,大概率是不会正常生成的。因为在地物的设置中,也多半会有一个条件控制这个地物会在什么生物群系中生成。如果你更改了地物的顺序的话,甚至还会出现报错,导致进入“安全模式”的情况发生,因为“两个生物群系中同一步骤中相同已放置地物不能以不同的顺序排列”。不理解也没有关系,等到我们之后讲解了地物以后,你就可以在你自己的生物群系里面添加地物啦。现在,让我们先把这部分暂时空着,或者就直接复制粘贴原版的就好了。
生物群系生物生成
生物群系JSON最后的部分控制了这个生物群系中生物的生成情况。
第一个键用于控制这个生物群系中会有多少的动物,如果动物太多,而creature_spawn_probability
没有足够大,那么生物群系就不会再倾向于生成动物了。
第二个键用于给生物群系要生成的生物分类,以及控制生物生成的权重以及每次成群生成的时候这群生物的数量。不同的种类将会用于控制生物的比例,防止一类生物生成过多。详细可以参考生物类别与生物上限。
第三个键是生成势。怎么理解生成势呢,这个概念和真空中的点电荷相似,每个生物相当于一个点电荷,可以在世界中产生一个势能(电势)。它所带的电荷,也就是能产生的势,由JSON中的charge
决定。而当要生成一个生物的时候,首先会根据周围的生物,计算这个位置的势有多大。计算的方式和点电荷的类似,也就是 charge
/直线距离 。多个生物的话,就是这些生物产生的势的和。如果计算出的这个地点的势大于energy_budget
,那么就不会在这个地方尝试生成生物了。也就是说,charge
控制这个生物能产生的势有多大,而energy_budget
控制这个生物最大能生成在势能多大的地方。如果charge
越大,相同生物密度下环境中的势就会越高,生成生物的可能就会越小,生成的生物就会越少;而若energy_budget
越大,那么这个生物生成时能容忍的势就会越高,生成生物的可能性就会越大,生成的生物就会越多。
小栗子
下面是梦境数据包中一个自定义生物群系的小栗子
{ "has_precipitation": false, "temperature": 0.5, "temperature_modifier": "none", "downfall": 0.2, "has_precipitation":false, "effects":{ "sky_color": 5364460, "fog_color": 12124154, "foliage_color": 1223646, "grass_color": 6475774, "water_color":2001905, "water_fog_color": 1404609 }, "carvers": { "air": [ "minecraft:cave" ], "liquid": [ "minecraft:cave" ] }, "features": [ [], [], [ "minecraft:amethyst_geode" ], [], [], [], [ "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_diamond", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ], [], [ "minecraft:spring_water" ], [ "minecraft:glow_lichen", "minecraft:flower_forest_flowers", "minecraft:trees_flower_forest", "minecraft:flower_flower_forest", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane", "minecraft:patch_pumpkin" ], [ "minecraft:freeze_top_layer" ] ], "starts": [ ], "creature_spawn_probability": 0.3, "spawners": { "creature": [ { "type": "minecraft:chicken", "weight": 10, "maxCount": 4, "minCount": 4 }, { "type": "wolf", "weight": 10, "maxCount": 2, "minCount": 1 }, { "type": "minecraft:cow", "weight": 10, "maxCount": 4, "minCount": 2 }, { "type": "minecraft:pig", "weight": 10, "maxCount": 4, "minCount": 2 } ], "water_ambient": [ { "type": "minecraft:squid", "weight": 10, "maxCount": 4, "minCount": 4 }, { "type": "minecraft:cod", "weight": 25, "maxCount": 8, "minCount": 4 }, { "type": "minecraft:pufferfish", "weight": 25, "maxCount": 8, "minCount": 4 } ], "monster": [] }, "spawn_costs": {} }