浅析Minecraft地形生成(一)

|

要在Minecraft中自定义世界,首先需要学会的便是定义一个新的维度。有了新的维度,你可以在里面做很多的事情,哪怕是一个超平坦世界,也可以意味着你能在一个普通的世界中通过添加一个新的超平坦维度来加入一个超平坦的世界。同时,一个简单的多维度世界也能作为很好的测试场地,避免直接对主世界造成破坏。

首先,让我们找到wiki中相应的参考页面——自定义维度 – Minecraft Wiki_BWIKI_哔哩哔哩 (biligame.com)。参考wiki是一个很重要的能力,因为随着版本的更新,会新增或者改变很多东西,在没有其他人的介绍的时候,wiki就是最好的参考的资料了。

wiki告诉我们,自定义维度主要由两个部分组成,一个是维度定义(dimension),一个是维度类型(dimension_type)。前者主要用于控制维度的地形生成和定义,后者则用于维度中的各种设置例如昼夜循环、床会不会爆炸。

维度类型(Dimension Type)

维度类型以Json文件的形式存储在数据包的data/<命名空间>/dimension_type/<维度类型名称>.json内。它的基本格式如下:

Wiki中的描述很详细,每一个键都有对应的详细解释,我们这里就不赘述了。唯一需要说明的一点东西便是这个整数提供器,这里其实只用写一个整数就好了,不用考虑那么多。

给出一个主世界的维度类型作为例子:

{
  "ambient_light": 0.0,
  "bed_works": true,
  "coordinate_scale": 1.0,
  "effects": "minecraft:overworld",
  "has_ceiling": false,
  "has_raids": true,
  "has_skylight": true,
  "height": 384,
  "infiniburn": "#minecraft:infiniburn_overworld",
  "logical_height": 384,
  "min_y": -64,
  "monster_spawn_block_light_limit": 0,
  "monster_spawn_light_level": {
    "type": "minecraft:uniform",
    "value": {
      "max_inclusive": 7,
      "min_inclusive": 0
    }
  },
  "natural": true,
  "piglin_safe": false,
  "respawn_anchor_works": false,
  "ultrawarm": false
}

维度(Dimension)

维度以JSON文件的形式存储在数据包的data/<命名空间>/dimension/<维度名称>.json下。它的基本内容如下:

首先一个便是type,即维度类型,也就是咱们上面刚刚提到过的东西了。当然,除了自定义以外,你也可以使用原版的四种设置,也就是wiki中列出来的四个(从左到右分别是,主世界,地下版的主世界,下届,末地)。

然后是一个被折叠的生成设置,它展开后是这样样子的:

哇,又是超级多的设置,不过仔细一看,其实是包含了很多种类。具体来说,生成设置分为噪声、超平坦和调试世界三种。噪声就是普通的主世界使用的方式,超平坦应该是非常熟悉的了,调试模式可能冷门一些,是一种技术性的内容,基本不会用到。如果不知道的话,可以看看这里:调试模式 – Minecraft Wiki_BWIKI_哔哩哔哩 (biligame.com)

那么,让我们着重把目标放在噪声和超平坦这两个类型中。

记得填写一下type的说!

超平坦(flat)

超平坦,也就是,没有地形的起伏,每一层都是一样的方块。它的生成设置相当简单:

咱们一个一个看。

首先是layers。正如wiki中所说,这是一个列表,控制了每一层方块的合成。例如

{
    "layers":[{
        "height":1,
        "block":"minecraft:stone"  
    }]
}

就代表了会在y=1的位置生成一层石头。很可惜,即使是多层连续生成相同的方块也不能写一个范围区间什么的(mojang你给点劲儿呀!)

第二、三、四个键按照wiki填写即可。地物就是地面生成的各种装饰物,例如树、草、花等等。

第五个参数表示了一些将会生成的结构集。至于结构集具体是什么,会在以后的内容中说明,这里的话,就把它理解为结构的命名空间id,也就是你在/locate后面会填写的东西,比如minecraft:stronghold代表一个要塞。

下面是一个例子,这是最常见的超平坦,也就是一层基岩加三层泥土和草方块的那种:

"settings": {
    "biome": "minecraft:plains",
    "features": false,
    "lakes": false,
    "layers": [
      {
        "block": "minecraft:bedrock",
        "height": 1
      },
      {
        "block": "minecraft:dirt",
        "height": 2
      },
      {
        "block": "minecraft:grass_block",
        "height": 1
      }
    ],
    "structure_overrides": "minecraft:villages"
  }

它的结构中只会生成村庄,因为structure_overrides中只有minecraft:villages这一种。

噪声(noise)

噪声是最常用的世界生成方式,也是Minecraft中默认世界的所有维度采用的生成方式。它的格式如下:

在这里,我们看到第三个键,即biome_source又有五种类型,即minecraft:vanilla_layeredminecraft:fixedminecraft:checkerboardminecraft:multi_noiseminecraft:the_end。其中,minecraft:multi_noise就是噪声生成,是最复杂也是最常用到的,因为它的自定义程度最高。但是我们这一章节主要讲解维度的基本定义和注册方式,目标是让你能够在几分钟内学会定义一个新的维度,因此不会细细讲解世界生成的过多内容。为了简便起见,我们只会讲另外四种,而噪声相关的内容,我们会放在下一个章节中详细讲解。

minecraft:vanilla_layered就是主世界生成的方式。如果填写这个,将会用主世界一样的方式生成生物群系。minecraft:fixed代表了单一的生物群系,它会让世界中只存在一种生物群系。minecraft:checkerboard则会像棋盘一样生成格子状的生物群系。minecraft:the_end则会用和末地一样的方式生成生物群系。

棋盘状的生物群系

第二个键是setting,它是世界地形生成的核心部分,我们也会放在接下来的几个章节进行详细介绍。这一章节中,为了简便起见,你可以使用原版预设好的噪声设置,比如overworld代表主世界,nether代表下届,caves代表洞穴,end代表末地,floatning_islands代表空岛,large_biomes是超大生物群系等等。

总结

可以看到,即使我们已经进行了大量的简化,维度的注册和定义依然耗费了我们相当的篇幅来讲解。现在,我们来稍微总结一下在Minecraft中新建一个维度需要一些什么。

首先,维度分为两个部分进行定义,一个是维度类型,代表了维度会有的各种性质,另一个是维度设置,即维度是如何生成的。维度的设置又分为生物群系的设置和地形的设置两种,我们这篇文章主要讲解的是几种比较简单的生成方式,但是也足够玩上一阵子了。

通过一个简明的例子可能会有更好的理解呢。比如,我们要新增一个维度,这个维度有足足1024格高(y轴上下各512层),同时它和主世界一样有昼夜循环,天空光照。然后,我们再让这个维度猪灵友好,这样的话猪灵也能欣赏主世界一样的昼夜轮回。最后,我们加一些小小的恶趣味,让这个世界的床会像下届和末地一样发生爆炸。当然,它也有一些基本的生物群系,呈现小小的棋盘分布,那么,我们可以这么写:

首先写出维度类型data\test\dimension_type\test.json

{
  "ambient_light": 0.0,
  "bed_works": false,
  "coordinate_scale": 1.0,
  "effects": "minecraft:overworld",
  "has_ceiling": false,
  "has_raids": true,
  "has_skylight": true,
  "height": 1024,
  "infiniburn": "#minecraft:infiniburn_overworld",
  "logical_height": 512,
  "min_y": -512,
  "monster_spawn_block_light_limit": 0,
  "monster_spawn_light_level": {
    "type": "minecraft:uniform",
    "value": {
      "max_inclusive": 7,
      "min_inclusive": 0
    }
  },
  "natural": true,
  "piglin_safe": trues,
  "respawn_anchor_works": false,
  "ultrawarm": false
}

然后设置维度的生成方式\data\test\dimension\test.json,让它拥有棋盘一样的生物群系生成方式:

{
    "type": "test:test",
    "generator": {
        "type": "minecraft:noise",
        "biome_source": {
            "type": "minecraft:checkerboard",
            "biomes": [
                "badlands",
                "bamboo_jungle",
                "cold_ocean",
                "dark_forest",
                "desert",
                "windswept_savanna",
                "snowy_slopes",
                "forest",
                "plains"
            ]
        },
        "settings": "minecraft:overworld"
    }
}

值得注意的是,由于我们将控制地形生成的settings填写为了minecraft:overworld,因此它会拥有和主世界一致的地形起伏。

类似文章

发表回复

一条评论