自定义生物群系——浅谈Minecraft地形生成(八)

上一章节中我们学会了如何在Minecraft中控制生物群系在世界中的生成。在本章节中,我们将会学到如何自定义一个生物群系,之后你就可以利用上一章节所学的知识,把你的生物群系加入到你的世界中了。

生物群系JSON

生物群系存储在数据包的data/<命名空间>/worldgen/biome路径中的JSON文件中。

生物群系的JSON也比较长,因此我们拆成几个部分进行

生物群系属性

生物群系属性用于控制这个自定义生物群系的特殊属性,比如温度、降水等。

特别注意的是,这里生物群系的温度和之前上一章节说的温度不是同一种东西。上一章节中的温度是一个噪声参数,而这里的温度仅仅是用于控制生物群系是否会下雪,是否会伤害雪傀儡,是否会让叶子变得更黄一样。比如沙漠的温度比森林高,因此沙漠的叶子偏黄,而且雪傀儡会在其中受到伤害。在本章节中,我们把上一章节中作为噪声参数的温度称为“噪声温度”,而将此章节中用于控制生物群系表现效果的温度称为“气候温度”,以此区分。

不过一般来说,高气候温度的生物群系都会被控制在高噪声温度的地方生成。这样的好处是,由于温度噪声的变化是平滑的,高噪声温度和低噪声温度之间必然会出现一个中等的过渡区域,因此可以避免高温生物群系和低温生物群系相接的情况,比如沙漠和冰山相连,之类的情况发生,让生物群系的衔接更加的自然。

生物群系效果

生物群系效果用于控制生物群系中的颜色、声音、粒子效果等视觉听觉效果部分。

树叶(foliage_color)和草地(grass_color)的颜色除了手动指定以外,如果不填写,就会通过之前在生物群系属性中设置的temperaturedownfall共同决定。

生物群系植被颜色的通用计算过程

在原版资源包中,在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.png
foliage.png

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": {}
}

类似文章

发表回复