見出し画像

ジグソーブロックのつかいかた


はじめに

今回は、いつもと少しだけ趣向を変えて、ジグソーブロックについて書こうと思います。これもカスタムディメンジョンに関わる要素であり、例によって、まだわかってない部分もありますが、あしからず。
ここ違うんじゃね?みたいなところがあれば遠慮なくコメント欄かTwitter(@noir_kokumin)にどうぞ。

また、カスタムディメンジョンでは、「ストラクチャー(構造物)」には2通りの意味があり、砦の残骸やなどのダンジョン系と村の家などの単なる建物があります。このままでは、大変ややこしいので、便宜的に前者を「ダンジョン」、後者を「建物」と呼ぶことにします。
それではよろしくお願いします。

概要

そもそもジグソーブロックって何よ?

まず、これが分からない方が多いんじゃないでしょうか?
ほとんどコマンドでしか手に入らないし、GUI出てくるけど右クリックして何か起こるわけでもない…。
そのくせ、村や前哨基地、砦の残骸、古代都市のストラクチャーデータを見ると、大量に置かれてる…。
ストラクチャー関係なのは分かるけどなんなんだ…
って。

で、どういうブロックなの?

では、ジグソーブロックは、どういうブロックなのか。
それは、「建物と建物を接合するブロック」です。
もう少し言うと、建物から別の建物を連鎖的に呼び出して、「拡張」していくブロックです。
この為、自作のダンジョンをワールドに生成させることだってできちゃいます。

ジグソーブロックでできること

ジグソーブロックは主に、ワールド生成時に機能し、次に挙げることが出来ます。

建物の呼び出し、接合

指定した向きに、建物を呼び出します。このとき、構成要素プールと呼ばれる、候補リストを参照し、条件(ジグソーの名前と対象の名前が噛み合っているか、等)に合う建物がランダムに読み込まれ、接合されます。
建物自体は、データパックのstructuresフォルダから呼び出します。

建物に含まれるブロックの装飾

建物の生成が一通り終わった時、Processorと呼ばれる装飾処理が加えられます(この為、ジグソーブロック自体には効果がありません)。例として、平原の村は丸石がランダムに苔石に置き換わっていたり、ゾンビ村では、一部のブロックが蜘蛛の巣に代わっていたり、等が挙げられます。

ダンジョンの自作、カスタマイズ

前述した通り、呼び出す建物は、構成要素プールを参照し、データパックのstructuresフォルダから読み込まれます。この構成要素プールは、自分で作ることも可能で、structuresフォルダに自作の建物のデータを追加することで、自分だけのダンジョンをワールドに生成させることが出来ちゃいます。
そこまでしなくても、村やピリジャーの前哨基地、砦の残骸、古代都市、旅路の遺跡をカスタマイズすることができます(デフォルトではこの5つにジグソーブロックが使われています)。

ジグソーブロックのつかいかた

入手方法

まずは、入手してみましょう。
手に入れないことには何も始まりません。

まず、クリエイティブモードで使うものなので、ゲームモードをクリエイティブモードに変更し、インベントリを開いて検索します。

あれれ?ないですねえ…

そうなんです。このブロックはコマンドブロックのように、デフォルトのクリエイティブインベントリにありません。

この類いのブロックは「管理者用アイテム」と呼ばれ、ある操作をしないとクリエイティブインベントリに現れません。その手順は、

  1. 操作設定を開く

  2. 管理者用アイテムタブをオンにする

1. まず操作設定を開きます。
2. 管理者用アイテムタブをオンにします。なんでこんなとこにあるんだろね?

これで、クリエイティブインベントリの右下の方にコマンドブロックの描かれたタブが追加されているはずです。
後は、普通に取り出しましょう。

テクスチャ?気にするな!

これで、ジグソーブロックを入手することができました。
それでは、次に設置していきましょう。

ジグソーブロックを設置してみる

建物を呼び出したい場所に、ジグソーブロックの矢印が向くように設置します。
このとき、次の2つのどちらかに注意して置いてください。
さもないと、生成に失敗します。
これ、慣れてないと本当にやらかしがちで生成されずに頭を抱えます。特に2番目は慣れないうちはあまり使わない方がいいと個人的に思います。最初のうちは、「接合」が出来た時点で上出来じゃないでしょうか。

  1. 建物の一番外側に置く(建物の境界線に接するように置く)

  2. 建物の内側に置く場合は、呼び出し先が完全に収まるようにする(呼び出し元の建物を巨大にしたり、呼び出し先を小さくする等)

設置したら右クリックして、GUIを開き、ジグソーブロックの中身を設定していきましょう。

ジグソーの向きについて

さて、このジグソーブロック。置いた時のプレイヤーの向きによって矢印の方向、すなわちジグソーの向きが以下のように変わります。

あれ?上と下がやたら多いですねえ…。
実はこれ!上下向きに設置した場合、更にどの方角に向けて「建物」を呼び出すかを表しているんです。後半の_northとかがその向きを表しています。
ジグソーブロックの側面に縦線が入った面がその向きを指しているのでこれと矢印、ジグソーパズル柄を見ながら置いていきましょう。

ジグソーブロックの中身を編集する

先ほど置いたジグソーブロックを右クリックすると、このようなGUIが表示されます。

…なんのことかわかりませんね。
一つ一つ見ていきましょう。

構成要素プール

呼び出したい建物の候補をまとめたものです。
worldgen/template_poolフォルダにあるファイルのパスを指定します。

名前

このジグソーブロックの名前で、別のジグソーから呼び出されるときに参照されます。
呼び出されるときのIDのようなものだと思ってください。

対象の名前

接続先のジグソーの名前で、ここで指定したものと合致するジグソーと接続されます。

置換先

一連の処理が終わったジグソーは別のブロックに置き換わり、退場します。
ここでは、そのブロックをblockstates込みで指定します。
周囲のブロックに合わせておくといいでしょう。
一応、言っておきますが、NBTを指定することは出来ません。(但し、後述するProcessorと組み合わせることでNBT付きのブロックに変換することはできます)
また、ストラクチャーヴォイドを指定した場合、ちゃんとストラクチャーヴォイドとしての機能を果たし、元のブロックを維持します。

選択優先度

恐らくですが、接続元に影響し、
この数値が高いジグソーほど、優先的に接続処理が行われます。

配置優先度

実はまだはっきり把握してなくて、恐らくの話になります。
通常、ジグソーから生成されたパーツの連鎖は、全体的にランダムに満遍なく実行されるのですが、この数値を高くすると、そのジグソーから生成されたブランチ(パーツ群)を集中的に処理します。

レベル、ジグソーを維持、生成

その場で建物を呼び出します。
「レベル」で連鎖数、「ジグソーを維持」は、呼び出したときにジグソーを残すかどうかを決められます。
「生成」は建物を呼び出します。

これらの機能は、ワールド生成時には関係ないため、今回はこのくらいにしておきます。

接続タイプ

「回転可能」「整列」の2種類があり、ここをクリックするたびに切り替わります。
「回転可能」は、文字通り、接続時にランダムに建物の向きが変わります。
どうしても回転させたくないときは、「整列」にしておきましょう。

構成要素プールの書きかた

それでは、構成要素プールを作ってみましょう。
このファイルはworldgen/template_poolにあり、以下のような構成になっています。

"name": "このファイルのパス", //1.19.2まで
"fallback": "ファイルのパス",
"elements": [
   {
      "weight": 整数,
      "element": {
         "element_type": element_type(後述するものから指定),
         "projection": "rigid" / "terrain_matching",
         "processors": プロセッサのパス or プロセッサをオブジェクトで直書き,
         各種設定
      }
   }
]

一つずつ見ていきますね。

name(1.19.2まで)

構成要素プールの名前で、このファイルのパスを指定します。このとき、worldgen/template_poolは省略します。
例えば、hogeというプールを作った場合のnameは、

foo:hoge

となります。
21w44aではこの項目は削除されている*¹ため、将来的に不要になる可能性が高いです。1.19.3からは廃止されました。

fallback

ダンジョンの生成限界に到達したとき、もしくはスペース的に生成できないときに呼び出すプールを指定します。
要は、「もう生成できないよ~~><」ってなったときの終端処理です。
これもnameと同様、ファイルのパスを指定します。
ここで1つ注意してほしいことがあります。終端の処理としてfallbackが適用される場合は、ここにジグソーブロックを置いても構成要素プールが読み込まれません。
連鎖の途中で適用された場合は、引き続き生成が行われます。

elements

ここからがこのファイルの本番です。
建物の呼び出しを行っていきます。

weight

偏り度を整数で指定します。
ここの数値が高いほど選ばれやすいです。

element.element_type

呼び出し先の種類です。
以下の中から指定します。

  • minecraft:single_pool_element

  • minecraft:legacy_single_pool_element

  • minecraft:list_pool_element

  • minecraft:feature_pool_element

  • minecraft:empty_pool_element

single_pool_elementとlegacy_single_pool_elementは建物を1つ呼び出します。
この2つはよく似ていますが、single_pool_elementは既存のブロックを空気に置き換え、legacy_single_pool_elementは置き換えません。
書き方は以下のようになります。

"element": {
    "element_type": "minecraft:(legacy_)single_pool_element",
    "projection": "rigid"/"terrain_matching",
    "processors": "パス",
    "location": "パス"
}

これを使用する場合、以下の項目を追加で指定します。

  • processors

  • location

processorsは、建物への装飾処理を指定します。worldgen/processor_listから指定するか、直接オブジェクトに書き込みます。

locationは、呼び出し先の建物をstructuresフォルダから指定します。

list_pool_elementは、呼び出し先の建物を複数まとめて指定します。
指定の仕方は配列の中に、single_pool_elementの記述をしていく、という感じ。
ここに指定された建物が上から順次呼び出され、重なった状態で生成されます。
但し、ジグソーの接続処理が行われるのは配列の一番上だけなので注意してください。
前哨基地を例に、以下のような書き方になります。

"elements: [
  "element": {
    "element_type": "minecraft:list_pool_element",
    "elements": [
      {
        "element_type": "minecraft:legacy_single_pool_element",
        "location": "minecraft:pillager_outpost/watchtower",
        "processors": "minecraft:empty",
        "projection": "rigid"
      },
      {
        "element_type": "minecraft:legacy_single_pool_element",
        "location": "minecraft:pillager_outpost/watchtower_overgrown",
        "processors": "minecraft:outpost_rot",
        "projection": "rigid"
      }
    ],
  "projection": "rigid",
  "weight": 1
  }
]

前哨基地の塔って時々丸石が苔むしてたりツタが生えてたりしますよね?実は、前哨基地の塔には何も装飾されてないもの(watchtower)と苔石やツタが繁茂したもの(watchtower_overgrown)の2つが存在します。まず、通常のものを読み込んだ後、繁茂したものを5%だけ生成し、通常版に重ねているわけです。

feature_pool_elementでは、先程までとは違い、placed_featureを呼び出します。
ここでいう、featureとは木や鉱石といった、バイオームの装飾オブジェクトみたいなものです。
placed_featureとは、中身(configured_feature)に配置のされ方を加えたものになります。
書き方は、古代都市を例に、このようになります。

{
"element": {
"element_type": "minecraft:feature_pool_element",
"feature": "minecraft:sculk_patch_ancient_city", // worldgen/placed_featureフォルダから指定
"projection": "rigid"
},
"weight": 6
}

これを使用する場合、featureという項目を追加で、worldgen/placed_featureフォルダから指定します。
このとき、ジグソーブロックの「対象の名前」をbottomにし、上向きに設置し、「回転可能」にしてください。じゃないと、生成されなかったり、ジグソーの向きが特定方向(up_southかな?)じゃないと生成されなくなったりします。

empty_feature_pool_element

なにも呼び出しません。
一定確率で何かを生成させたい場合に、「外れ」として使うといいでしょう。

element.projection

呼び出し先の場所です。rigidterrain_matchingのどちらかを指定します。
rigidは呼び出した先、そのままの場所に配置します。
一方、terrain_matchingはワールドの一番高い場所にずらします。
実は、worldgen/structureのjsonのプロパティの1つ、max_distance_from_centerの影響を受けます。その為、ずらす距離が遠すぎると生成されなくなるんですよね…。
この設定は、ブロック単位で処理されます。どういうことかというと、村の家にterrain_matchingを指定してしまうと、勾配とかに合わせて家が崩壊してしまうんですよね…。

Processorの書きかた

折角なので、こちらも紹介しましょう。
このファイルは、worldgen/processor_listフォルダにあり、以下のように書きます。

{
   "processors": [
     {
        "processor_type": processor_type(後述するものから指定),
        各種追加項目
     }
  ]
}

processor_typeには以下の種類があり、その中から選びます。

  • minecraft:rule

  • minecraft:block_rot

  • minecraft:block_age

  • minecraft:block_ignore

  • minecraft:gravity

  • minecraft:protected_blocks

  • minecraft:blackstone_replace

  • minecraft:jigsaw_replacement

  • minecraft:lava_submerged_block

  • minecraft:capped

  • minecraft:nop

それでは、それぞれ見ていきましょう。

minecraft:rule

指定した条件に応じてブロックを置換します。例として、村の丸石が一部苔石に変化していますね。
書き方は以下のようになります。

{
  "rules": [
    {
      "position_predicate" : {
         "predicate_type": predicate_type(後述する項目のどれか),
         各種追加項目
       },
      "input_predicate": {
         "predicate_type": predicate_type(後述する項目のどれか)
       },
      "location_predicate": {
         "predicate_type": predicate_type(後述する項目のどれか)
       },
      "output_state": {
         "Name": "ブロックID",
         "Properties": {
            ブロック状態を列挙
          }
       },
      "output_nbt": {NBT}
    }
  ]
}

position_predicate

ダンジョンの中心からの距離を条件にします。
predicate_typeは以下のどれかを指定します。

  • minecraft:always_true

  • minecraft:linear_pos

  • minecraft:axis_aligned_linear_pos

always_trueは常に有効、linear_posマンハッタン距離で、ダンジョンの中心から離れているほど有効になります。
axis_aligned_linear_posは、xyz軸のどれかに沿って、ダンジョンの中心から離れているほど有効になります。

linear_posを選んだ場合、次の項目を追加で指定します。

  • minecraft:min_chance(ダンジョンの中心からの距離がmin_dist以下だったときに、Processorが適用される確率)

  • minecraft:max_chance(ダンジョンの中心からの距離がmax_dist以上のときに、Processorが適用される確率)

  • minecraft:min_dist(最小の確率が適用される距離で、max_dist未満である必要がある)

  • minecraft:max_dist(最大の確率が適用される距離で、min_distより大きい必要がある)

ここで、ダンジョンの中心からの距離がmin_dist以上max_dist未満だったとき、線形補完された値として計算されます。
そのとき、以下の計算式が使われるようです。

$$
\frac{distance  -  min_\_dist}{max_\_dist  -  min_\_dist}\times(max_\_chance  -  min_\_chance)
$$

input_predicate

建物に含まれるブロックです。場合によって、他のブロックに置き換えたいときに使います。

これにも、predicate_typeが追加され、以下の項目のどれかが利用できます。

  • minecraft:always_true (常に適用)

  • minecraft:block_match(ブロックID参照)

  • minecraft:blockstates_match(ブロックIDとblockstatesを参照)

  • minecraft:random_block_match(ブロックIDを参照し、指定した確率で適用)

  • minecraft:random_blockstates_match(ブロックIDとblockstatesを参照し、指定した確率で適用)

  • minecraft:tag_match(指定したブロックタグを参照)

location_predicate

建物のブロックが生成されるとき、その場所のブロックを上書きするような形で生成されます。その、上書き前のブロックを参照します。
例えば、村の道が水上に出来るとき、ここがwaterが指定されており、後述するoutput_stateに木ざ…板材が指定されています。

output_state

置き換え先のブロックです。
NameでブロックIDを、Propertiesでblockstatesを全列挙します。

output_nbt(1.19.4まで)

置き換え先のブロックがブロックエンティティ(NBTを持ったブロック)だった場合、NBTも指定することができます。ここでは、指定したいNBTをオブジェクトで指定し、それがdata mergeみたいにそのまま上書きされます。

block_entity_modifier(1.20から)

前述のoutput_nbtがリニューアルされたものです。ブロックエンティティに対し、NBTを設定しやすくなりました。以下のように書きます。

{
   "type": type,
   各種設定
}

typeには以下の種類があります。

  • minecraft:append_loot

ルートテーブルを設定します。loot_tableという項目が追加され、ブロックに設定したいルートテーブルをdata/(名前空間)/loot_tableから指定します。

  • minecraft:append_static

output_nbtと同じです。dataに代入したいNBTをオブジェクトで指定します。
コマンドの書式そのままではダメです。きちんとJSONの形式にしましょう。

  • minecraft:clear

既に存在しているNBTを全て消します。追加項目はありません。

  • minecraft:passthrough

既に存在しているNBTを保持している、とのことですが、要は何もしません。デフォルトの設定であり、追加項目はありません。

minecraft:block_rot

ブロックが一部、生成されなくなります。生成されなかったブロックは、元々の地形が維持されます(ストラクチャーヴォイドのような挙動になります)。
以下の項目が追加されます。

minecraft:integrity

完全性を表し、建物を生成する割合を表します。
0.0~1.0の値を指定します。
逆に言えば、$${1 - この値 = 間引きたい分}$$ ということになります。
例として、10%の確率で生成を間引きたいと思ったら、0.9と指定すればいいです。

minecraft:rottable_blocks

間引きたいブロックを指定できます。
ブロックタグか、リスト形式です。

minecraft:block_age

荒廃したポータル専用で、ストラクチャー設定のプロパティの1つ、mossiness の値に応じて以下のようにブロックが置換されます。

minecraft:block_ignore

ここに指定したブロックが建物と見なされなくなります。ストラクチャーヴォイドと同じ感じになります。
blocksというリストが追加され、そこにName(ブロックID)とProperties(blockstates全列挙)を載せたオブジェクトを書きます。
例えば、水を指定すれば水没ダンジョンができます。

minecraft:gravity

ワールドの一番高いところにブロックをシフトさせます。
heightmapとoffsetという項目が追加され、
heightmapには以下の値のどれかを指定します。

  • WORLD_SURFACE(空気以外で最も高い位置)

  • WORLD_SURFACE_WG(WORLD_SURFACEとほぼ同じ。こちらは、生成時のみ適用される。)

  • OCEAN_FLOOR(空気と液体以外で最も高い位置。水中ダンジョンに有効)

  • OCEAN_FLOOR_WG(OCEAN_FLOORとほぼ同じ。生成時のみ適用される。)

  • MOTION_BLOCKING(衝突判定のあるブロックで、最も高い位置)

  • MOTION_BLOCKING_NO_LEAVES(葉っぱを除いた、衝突判定のあるブロックで、最も高い位置。木陰に何か生成したいときに有効)

MOTION_BLOCKING_NO_LEAVESの"LEAVES"は本当に葉っぱ系ブロックのみです。leavesタグにブロックを追加しても、そのブロックを透過したりはしません。

offsetは生成する位置をシフトさせます。
これにより、埋没させることができます。

minecraft:protected_blocks

ここに指定した建物のブロックが、feature等によって壊されなくなる

という意味ではなく、
ここに指定したブロックが建物に上書きされなくなります。

minecraft:blackstone_replace

block_age同様、荒廃したポータル専用で、replace_with_blackstoneをtrueにした場合、石や石レンガ系ブロックがブラックストーンに、鉄格子が鎖に換わります。

minecraft:lava_submerged_block

フルブロックじゃないブロックが溶岩に置き換わらなるらしい。

minecraft:jigsaw_replacement[要検証]

ジグソーブロックとストラクチャーヴォイドを維持するかどうか、らしい。

minecraft:capped

1.20で追加されたタイプで、ここまで述べてきたProcessorに回数制限をつけられます。

以下のプロパティが追加されます。

  • limit : Processorを適用する上限

  • delegate : 上限を適用するProcessor。オブジェクト形式であり、ここまで述べてきたProcessorを記述します。

limitの指定の仕方

直接数値を入力するか、以下のようにオブジェクトで指定します。
この指定の仕方を便宜的に、Int Providerと呼ぶことにします。

{
   "type": type
   各種設定
}

typeには以下のどれかを指定します。

  • minecraft:constant

valueという項目が追加され、ここで指定した値になります。直接数値を指定するのと同じです。

  • minecraft:uniform

指定した範囲の中から均等に選ばれます。以下のようなフォーマットになります。

{
  "value": {
    "min_inclusive": 整数, 
    "max_inclusive": 整数
}

min_inclusiveは最小値、max_inclusiveは最大値を表します。

  • minecraft:biased_to_bottom

minecraft:uniformと同じく、範囲型でフォーマットも一緒ですが最小値寄りに数値が選ばれます。

  • minecraft:clamp

別のInt Providerの値の範囲を固定します。すなわち、下限もしくは上限の数値でカンストさせます。フォーマットは以下のようになります。

{
  "value": {
    "min_inclusive": 整数, 
    "max_inclusive": 整数,
    "source": Int Provider
}
  • minecraft:clamp_normal

minecraft:clampとつくように、数値の範囲を固定するものですが、こちらでは正規分布を用います。フォーマットは以下のようになります。

{
  "value": {
    "min_inclusive": 整数, 
    "max_inclusive": 整数,
    "normal": 小数,
    "deviation": 小数
}

minecraft:uniformにnormalとdeviationがくっついたような感じ。normalには正規分布の平均値(最頻値とも中央値ともいう。正規分布のカーブが上に凸になるところ)、deviationには偏差を指定します。

  • minecraft:weighted_list

指定した値からランダムに選ばれます。フォーマットは以下のようになります。

{
   "distribution": [
      {
         "data": Int Provider,
         "weight": 整数
      },
      {
         "data": Int Provider,
         "weight": 整数
      },
      ...
   ]
}

weightは偏り度を表し、ここが大きいほど選ばれやすくなります。

minecraft:nop

なにもしない、をする

あとがき

いかがでしたか?
このように、ジグソーブロックは分かってしまえば非常に有用なブロックなのです。
特に、カスタムストラクチャーとかやる場合は、これなしでは語れません。
お前もジグソーブロックを使わないか?

脚注

*1 : slicedlime氏の動画

ダンジョンを大きくするコツ

ここから先は

283字 / 3画像

¥ 200

この記事が気に入ったらチップで応援してみませんか?