データパック研究所

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

リクエスト #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
  }
}

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

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

dimension_type

{
  "logical_height": 256,
  "infiniburn": "minecraft:infiniburn_overworld",
  "effects": "minecraft:overworld",
  "ambient_light": 0.0,
  "bed_works": true,
  "respawn_anchor_works": false,
  "has_raids": false,
  "ultrawarm": false,
  "natural": true,
  "coordinate_scale": 1.0,
  "piglin_safe": false,
  "has_skylight": true,
  "has_ceiling": false,
  "fixed_time": 13000
}

まずはdimension_typeです。これは、ディメンション毎のルールを設定する項目になります。

ディメンション毎のルールとは?これは、例えば「ネザーではベッドは爆発する」「オーバーワールドではピグリンがゾンビ化する」というようなルールです。これらのルールはディメンション毎に定められているというのは何となく分かるのではないでしょうか?

logical_height

これはいわゆる「高度限界」の設定ですね。まだ不明点もありますが、コーラスフルーツの高さやゲート接続の高さなどの限界を設定します。マイクラのオーバーワールドの高度限界は256というのは有名ですね。あまりここを弄っても得することはないので、オーバーワールド・エンドの256かネザーの128に設定するのが無難です。

infiniburn

これは「永続的に燃えるブロック」を設定します。minecraft:infiniburn_overworld, minecraft:infiniburn_nether, minecraft:infiniburn_endの3種類ありますが、今は作りたいディメンションの雰囲気に合わせて選択して大丈夫です。カスタムしなければ、オーバーワールドとネザーは「ネザーラック」「マグマブロック」の2つが、エンドはそれに加えて「岩盤」が無限炎上の対象になります。どれを選んでもほとんど差はありませんね。

effects

これは「空の描写」を設定します。minecraft:overworldなら太陽と月のある空になります。minecraft:the_netherなら天体がなく霧の強い空になります。minecraft:the_endなら霧のない漆黒の闇が広がるわけです。

ambient_light

これは「環境光の強さ」の設定です。環境光は光源がなくても感じることのできる明るさといった仕組みです。基本0ですが、ネザーだけは0.1だけあります。ネザーは霧で遠方が全く見えませんが、近距離は比較的見やすくなっています。環境光のおかげですね。

bed_works

これは「ベッドが正常に使用できるかどうか」を設定します。正常に使用できない、つまりfalseを設定するとベッドが使えないどころか爆発します。

respawn_anchor_works

これは「リスポーンアンカーが正常に使用できるかどうか」を設定します。bed_worksと同様ですが、こちらは爆発しません。

has_raids

これは「村の襲撃イベントが起こるかどうか」の設定です。ネザーでは襲撃が発生しません。村もないですが、エンドでは発生するそうです。

ultrawarm

これは「超高温」の設定です。有効にすれば水源が蒸発します。ネザーの状態です。

natural

これは「自然な磁場かどうか」の設定です。有効にしないとコンパスに異常が発生します(ネザー同様にグルグル回る)。

coordinate_scale

これは「座標の拡大率」の設定です。ネザーの1mがオーバーワールドの8m相当というのは有名な話ですが、これはcoordinate_scaleがオーバーワールド1.0でネザー8.0だから発生する現象です。

piglin_safe

これは「ピグリンの身の安全」の設定です。無効にすると、オーバーワールド同様にピグリンがゾンビ化します。

has_skylight

これは「空の天体による光源が有効かどうか」の設定です。有効にすれば日中は明るく、夜間は暗くという影響が出ます。

has_ceiling

これは「天井の有無」の設定です。有効にすればネザー同様に岩盤の天井ができます。

fixed_time

これは「時間固定」の設定です。時刻を設定すれば昼夜サイクルが止まり、その時刻に固定されます。ネザーやエンドは時間が固定されています。オーバーワールド同様の昼夜サイクルにしたい場合は省略してください。

設定の仕方

基本的にあなたの作りたいディメンションがオーバーワールド、ネザー、エンドのどれに近いかを考えて、それに合わせた設定をするのがいいと思います。こちらに3つのディメンションのデフォルト設定が載っているので参考にどうぞ。

minecraft.gamepedia.com

ネザーのように過酷なディメンションを作るならベッドは爆発するだろうし、コンパスも水も役に立たないと設定するでしょう。

オーバーワールドのような穏やかなディメンションだけど、エンドのような暗さがある…とすれば、オーバーワールドの設定でエンドの空の描写に変えてみるといいかもしれません。

次回は、もう一つのdimension/underworld.jsonの作成です。

ricerabbitalk.hatenablog.jp

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

カスタムディメンションはどうやって作るの?

という質問がありました。

これについては、動画シリーズ「データパック研究所」の第3回で説明予定だったのですが、動画制作が滞っており、申し訳ない限りです。ひとまず、リクエストという形でサクッと解説しますが、後日、文章で読める「データパック研究所」資料としてさらに詳しくこちらでも(できれば動画でも)公開していきたいと思います。

一気に全部カスタムするのは無理!

早速ですが皆さん。カスタムディメンションと聞いて…

「どんなディメンションでも自由に作ることができる!?」

と思われる方も多いと思います! 半分は正解です。カスタムディメンションのパラメータは非常に豊富で、細かな設定まで可能に見えます。実際1.16.4がリリースされて1.17のスナップショットが出だしている段階で、OfficialWikiのパラメータ説明の欄はかなりの数の「needs testing (要テスト)」表記が残っています。

それだけ未知の領域が広いという意味では可能性は無限大!!

逆に言えば、まだ全然分からない部分も盛りだくさん!!

そういう状態です…。夢はあるのですが、頭も悩ませてくれます。こういう混沌とした環境下ではよく分からないパラメータになるべく手を出さないのが最良です!というのも、よく分からないパラメータを弄って偶然できてしまったディメンションほど保守・アップデートしづらいものはないからです。何が原因でそうなったか作者が分からない状態なわけですからね…。

そういうわけで私たちの研究所では、色々カスタマイズしたい欲求はここではちょっと抑えて、最小限でカスタムディメンションを作る方法を洗練させることにしました。その成果がこちらになります!

既存のバイオームを組み合わせたカスタムディメンション

f:id:rice_rabbit:20201106003846p:plain
既存のバイオームを組み合わせたカスタムディメンション

多数のパラメータや設定フォーマットを眺めた結果、誰もが最初に作ることができて、今後の雛型にも活用できる最もシンプルな答えが「既存のバイオームを組み合わせたカスタムディメンション」です。

まずはここから始めて、次に「バイオームの生成」「建築物の生成」と追加するように進めていくと、開発も学習もスムーズにいくのではないでしょうか?

というわけで、上図の雛型ディメンションを作っていきましょう!

サンプル

こちらが今回のサンプルになります。

drive.google.com

ファイル構造

lec
  ├ pack.mcmeta
  └ data
     └ lec
        ├ dimension
        │  └ underworld.json
        └ dimension_type
           └ underworld.json

基本データパック名・名前空間は lec で統一して説明します。 今回は「オーバーワールド」と「ネザー」の間にある「アンダーワールド(幽世)」を作ってみましょう。単純に2つのディメンションのバイオームを混ぜたディメンションです。 pack.mcmetaは全データパックの基本になるファイルですね。以下のようになります。

{
  "pack": {
    "pack_format": 6,
    "description": "Datapack Lectures."
  }
}

これを除けば、書くファイルはdimension/underworld.jsonとdimension_type/underworld.jsonの2つだけです。

移動方法

/execute in lec:underworld run teleport @s ~ ~ ~

上記のコマンドを実行してください。地中に埋まる可能性があるので、浮遊した状態でテレポートした方が良いと思います。inでディメンションを指定してテレポートするという仕組みです。

次回から、その2つのファイルの書き方について解説します。

ricerabbitalk.hatenablog.jp