データパック研究所

データパック開発資料を公開しています。

リクエスト #001「カスタムディメンションの作り方!その3」

dimension

{
  "type": "lec:underworld",
  "generator": {
    "type": "minecraft:noise",
    "seed": 8800000,
    "biome_source": {
      "type": "minecraft:multi_noise",
      "seed": 8800000,
      "altitude_noise": {
        "firstOctave": -7,
        "amplitudes": [
          1,
          1
        ]
      },
      "temperature_noise": {
        "firstOctave": -7,
        "amplitudes": [
          1,
          1
        ]
      },
      "humidity_noise": {
        "firstOctave": -7,
        "amplitudes": [
          1,
          1
        ]
      },
      "weirdness_noise": {
        "firstOctave": -7,
        "amplitudes": [
          1,
          1
        ]
      },
      "biomes": [
        {
          "biome": "minecraft:plains",
          "parameters": {
            "altitude": 0,
            "temperature": -0.2,
            "humidity": 0,
            "weirdness": 0,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:forest",
          "parameters": {
            "altitude": 0.2,
            "temperature": 0.2,
            "humidity": 0.2,
            "weirdness": 0,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:desert_hills",
          "parameters": {
            "altitude": 0.4,
            "temperature": 0.8,
            "humidity": -0.4,
            "weirdness": 0,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:mushroom_fields",
          "parameters": {
            "altitude": 0,
            "temperature": 0.5,
            "humidity": 0.5,
            "weirdness": 0,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:crimson_forest",
          "parameters": {
            "altitude": -0.2,
            "temperature": 0.8,
            "humidity": -0.2,
            "weirdness": 0.2,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:warped_forest",
          "parameters": {
            "altitude": -0.4,
            "temperature": 0.8,
            "humidity": -0.4,
            "weirdness": 0.4,
            "offset": 0
          }
        },
        {
          "biome": "minecraft:cold_ocean",
          "parameters": {
            "altitude": 0,
            "temperature": -0.5,
            "humidity": 0.2,
            "weirdness": 0,
            "offset": 0
          }
        }
      ]
    },
    "settings": {
      "name": "minecraft:overworld",
      "bedrock_roof_position": -10,
      "bedrock_floor_position": 0,
      "sea_level": 63,
      "disable_mob_generation": false,
      "default_block": {
        "Name": "minecraft:stone"
      },
      "default_fluid": {
        "Name": "minecraft:water",
        "Properties": {
          "level": "0"
        }
      },
      "noise": {
        "density_factor": 1,
        "density_offset": -0.46875,
        "simplex_surface_noise": true,
        "random_density_offset": true,
        "island_noise_override": false,
        "amplified": false,
        "size_horizontal": 1,
        "size_vertical": 2,
        "height": 256,
        "sampling": {
          "xz_scale": 1,
          "y_scale": 1,
          "xz_factor": 80,
          "y_factor": 160
        },
        "bottom_slide": {
          "target": -30,
          "size": 0,
          "offset": 0
        },
        "top_slide": {
          "target": -10,
          "size": 3,
          "offset": 0
        }
      },
      "structures": {
        "structures": {}
      }
    }
  }
}

いや、長いですね。ソースコードだけで3000文字超えています。しかし、ここで重要なのは全部のパラメータを設定しようとしないことです!

上記の設定はほぼmulti_noiseで使われるデフォルト設定です。マイクラは非常に長い年月をかけて組み上げられています。そのパラメータは絶妙なバランスと言っていいでしょう。下手に手を出すとそれが崩れてしまいます。弄ったパラメータは最終的に保守しないといけませんから、手を出しすぎると、後から微調整が大変になってしまうというのもありますね。

というわけで、半分以上のパラメータは上記のまま、説明もスキップして解説していきます。

type

「dimension_type」を設定します。前回dimension_type/underworld.jsonを作ったので、それを指定する場合は lec:underworld となります。


generator

ここからは実際のディメンション生成の設定がまとめられています。

generator.type

「ディメンション生成方法」を設定します。minecraft:flatならスーパーフラットminecraft:noiseなら通常のワールド、minecraft:debugはデバッグ用なわけで、どう考えてもminecraft:noise一択です。

generator.seed

「ディメンションのシード値」です。カスタムディメンションはこのシードで生成されますが、現在ランダムシードやワールドのシードを指定できません。プレイヤーがシードを自由に決められるのが醍醐味なので、せめてワールドのシード値を継承する仕組みを追加してほしいですね。これは今後ぜひ改善してほしいポイントです。


generator.biome_source

ここからはバイオームの生成関連の設定がまとめられています。

generator.biome_source.type

「バイオーム生成方法」を設定します。これはminecraft:multi_noise一択です。他はデバッグ用だったり、オーバーワールドやエンドをそのまま生成する設定にしかなりません。

generator.biome_source.seed

「バイオームのシード値」です。これも「ディメンションのシード値」同様に固定シードのみです。ランダム性は出せませんが、何らかの固定値を入れてください。

generator.biome_source.altitude_noise
generator.biome_source.temperature_noise
generator.biome_source.humidity_noise
generator.biome_source.weirdness_noise

ここは上記と同じで構いません。バニラのマイクラのデフォルト値です。


generator.biome_source.biomes

ここからが本番。実際に生成されるバイオームリストの作成部分となります。

{
  "biome": "minecraft:plains",
  "parameters": {
    "altitude": 0,
    "temperature": -0.2,
    "humidity": 0,
    "weirdness": 0,
    "offset": 0
  }
}
biome

「バイオーム名」です。今回は既存のバイオームだけ使うので、こちらのバイオーム名をそのまま使うことができます。

minecraft.gamepedia.com

parameters.altitude (-2.0 to 2.0) 高度
parameters.temperature 気温
parameters.humidity 湿度
parameters.weirdness (-2.0 to 2.0) 奇妙さ

これはワールドに配置されるバイオームの設定値です。

実は、ワールド生成というのは、ランダムにバイオームをくっつけているだけではありません。マイクラはワールド生成時にまず「高度」「気温」「湿度」「奇妙さ」の分布図を作ります。データパックを利用して可視化するとこのような感じになります。

f:id:rice_rabbit:20201106085822p:plain
高度分布図
f:id:rice_rabbit:20201106085907p:plain
気温分布図
f:id:rice_rabbit:20201106085929p:plain
湿度分布図
f:id:rice_rabbit:20201106085948p:plain
奇妙さ分布図

このように「高温だけど湿度がなくて低い位置(砂漠?)」「低温で湿度があって高い位置(雪山?)」というようなワールドに特徴の分布ができるわけです。そして、その分布上でparameters.xxxxの情報に一番条件が一致しているバイオームが選ばれ、配置されるという仕組みです。

「高度」「気温」「湿度」は何となくイメージが沸くと思いますが「奇妙さ」はちょっと分かりづらいですね。マイクラにはギャップのあるバイオーム隣接があると思いますが、それを表現するための違和感のようなパラメータだと思います(要テスト案件)。

parameters.offset (0.0 to 1.0)

parametersの中でこれだけが、少し異質です。offsetはそのバイオームの出現しやすさを絶対値的に引き上げる効果があります。普通この値は0なのですが、これの値を大きくすると多少「高度」「気温」「湿度」「奇妙さ」が食い違っていても優先的にこちらのバイオームが選ばれるようになります。

f:id:rice_rabbit:20201106090012p:plain
オフセットによる干渉を受けた温度分布図

基本0でいいと思います。レアバイオームや、頻出バイオームを演出するために使うことはあるかもしれません。


generator.settings

この辺りは最初はデフォルト値のままでいいと思います。特にnoise項目は手出ししない方が無難です。その他のパラメータも、目的のディメンション次第では必要になってきますが、改めてこの解説をする時にしましょう。

まとめ

というわけで、3回に分けて駆け足で解説していきました。かなり巨大な雛型ですが、既存バイオームを組み合わせる上で結局大事なのは以下の部分です。

{
  "biome": "minecraft:xxxxx",
  "parameters": {
    "altitude": 0,
    "temperature": 0,
    "humidity": 0,
    "weirdness": 0,
    "offset": 0
  }
}

ここを重点的に設定していってください。他は可能な限り今はデフォルトで構いません。また質問がありましたらコメントなどでどうぞ!