5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

カスタムストラクチャーの基本

Last updated at Posted at 2024-12-27

はじめに

2023-05-01_22.29.35.png

ストラクチャーについて

マイクラにおける「ストラクチャー(構造物)」とは何でしょうか?

マイクラの世界を歩いていると、村や前哨基地、古代都市といった建造物が最初から存在していたりします。
こういうものを「ストラクチャー」と呼びます(ネザー化石のように建造物じゃなさそうなものもありますが)。

カスタムストラクチャーでは、更に自分の好きなストラクチャーを追加することができます。言ってしまえば自分の好きなダンジョンを追加することが出来るということ。ロマンがあるでしょう?

今回はそのやり方をざっと説明いたします。

「ストラクチャー」という用語について

マイクラでは、「ストラクチャー」と言うと、先程の建造物系のものの他に、それらを構成するパーツを指すことがあります。
後者はゲーム内では「ストラクチャーテンプレート」とも呼ばれているのですが、分かりやすくするために本稿では前者のみ「ストラクチャー」と呼び、後者は「パーツ」と呼ぶことにします。

ストラクチャーの種類

一口に「ストラクチャー」と言っても様々な種類に分かれています。具体的には以下の通り。

ストラクチャーの種類一覧
種類ID 説明
buried_treasure 埋もれた宝
desert_pyramid ピラミッド。砂漠の寺院とも言う
end_city エンドシティ
fortress ネザー要塞
igloo イグルー
jigsaw ジグソーブロックを使ったもの。
自分でパーツを追加したり組み替えたりできる為、カスタムストラクチャーではこれ一択
jungle_temple ジャングルの寺院
mineshaft 廃坑。普通のものかメサ廃坑かを選べる
nether_fossil ネザー化石。ソウルサンドの谷に点在してるアレ。
こう見えてストラクチャーである。生成される高さが設定可能
ocean_monument$\hspace{2em}$ 海底神殿
ocean_ruin 海底遺跡。
暖かい海タイプか寒い海タイプかを選べる他、大型になる確率とかが設定可能
ruined_portal 荒廃したポータル。
ジグソー以外のものの中では比較的自由度が高く、配置パターン(接地してるか、埋没してるか等)の他にどれくらい古びた雰囲気を出すか(どのくらい苔石レンガとかに置換するか)とか、蔦やジャングルの葉で生い茂ってるかとか、ブラックストーン等に置き換えるかとか、寒冷バイオーム版にするかとかが設定できます
shipwreck 難破船。
座礁してるかどうかが設定できます。木材や向きはランダムかも
stronghold 要塞。エンドに行けるやつです
swamp_hut 魔女の小屋
woodland_mansion 森の洋館

カスタムストラクチャーで必要なもの

少なくとも以下の4つのファイルが必要です。
(私のようにヨゴシを入れたり、featureを突っ込んだりしたりすると更に増えます。)

  • パーツ(ストラクチャーテンプレート、data/structure)
  • 構成設定(data/worldgen/structure)
  • テンプレートプール(data/worldgen/template_pool
  • 配置設定(data/worldgen/structure_set)

それでは作っていきましょう。

パーツを作る

これは特に難しいことはなく、セーフモード(と人によってはコーナーモード)のストラクチャーブロックを使って保存します。
保存したパーツはワールドデータのgenerated/structuresに保存されています。

構成設定を設定する(worldgen/structure)

ストラクチャーの「中身」にあたるものです。
設定項目は次のようになっています。([]で囲ったものは省略可)

基本項目

どのストラクチャーにも共通する項目です。

  • type
  • biomes
  • step
  • spawn_overrides
  • [terrain_adaption]

ここから先はtypeの値次第で出てくる項目です。

type:minecraft:jigsawの場合

  • size
  • start_height
  • start_pool
  • max_distance_from_center
  • use_expansion_hack
  • [dimension_padding]
  • [liquid_settings]
  • [pool_aliases]

type:minecraft:ruined_portalの場合

  • setups

type:minecraft:mineshaftの場合

  • mineshaft_type

type:minecraft:nether_fossilの場合

  • height

type:minecraft:ocean_ruinの場合

  • biome_temp
  • large_probability
  • cluster_probability

type:minecraft:shipwreckの場合

  • is_beached

各項目の説明

type

データ型:string(文字列)
ストラクチャーのタイプです。基本的に"minecraft:jigsaw"一択です。
なので、追加項目はminecraft:jigsawのみ説明します。

biomes

データ型:string/list(配列)
ストラクチャーを生成させたいバイオームを指定します。
指定形式はstring(文字列)とlist(配列)の2通りがあり、前者はバイオームIDかタグ、後者はそれらを纏めた配列を書きます。
注意点として、ここで指定したバイオームでしか生成がスタートしません。
例えば、地下バイオームを設定して、heightmap適用なんてした場合、そのストラクチャーは絶対に生成されません。

step

データ型:string
どの生成段階で生成するかです。
生成段階についてはカスタムバイオームと同様で、こちらで説明しています。

spawn_overrides

データ型:compound(オブジェクト)
ストラクチャー内にスポーンするmobを設定します。
各mobカテゴリごとに以下の設定をします。

  • bounding_box : スポーンする範囲。"piece"(パーツ内のみ)か"full"(ストラクチャー全体)の2択
  • spawns : スポーンするmob。リスト型で、指定の仕方はバイオームと一緒です。こちらもカスタムバイオームで説明してます。
記述例(ウィッチの小屋より)


    {
     "creature": {
      "bounding_box": "piece",
      "spawns": [
        {
          "type": "minecraft:cat",
          "maxCount": 1,
          "minCount": 1,
          "weight": 1
        }
      ]
    },
    "monster": {
      "bounding_box": "piece",
      "spawns": [
        {
          "type": "minecraft:witch",
          "maxCount": 1,
          "minCount": 1,
          "weight": 1
        }
      ]
    }
  }

また、バイオームと同じでいい場合は{}、何もスポーンさせたくない場合、mobカテゴリのspawns内に空のリストを記入します。

何もスポーンさせない例(古代都市より)


"spawn_overrides": {
    "ambient": {
      "bounding_box": "full",
      "spawns": []
    },
    "axolotls": {
      "bounding_box": "full",
      "spawns": []
    },
    "creature": {
      "bounding_box": "full",
      "spawns": []
    },
    "misc": {
      "bounding_box": "full",
      "spawns": []
    },
    "monster": {
      "bounding_box": "full",
      "spawns": []
    },
    "underground_water_creature": {
      "bounding_box": "full",
      "spawns": []
    },
    "water_ambient": {
      "bounding_box": "full",
      "spawns": []
    },
    "water_creature": {
      "bounding_box": "full",
      "spawns": []
    }
  }

terrain_adaption

データ型:string
ストラクチャーの周囲の地形をどうするかです。
"none""beard_thin""beard_box""bury""encapsulate"の5通りから選びます。
各値の効果は下表のようになっています。

説明
none なにもしない
beard_thin 周囲のブロックをくり抜き、ストラクチャーが水上や空中に生成された場合、地面を生成する。
beard_box beard_thinのでかいバージョン
bury ストラクチャーの周りをブロックで覆います。
encapsulate$\hspace{1em}$ buryと似ていますが、こちらはストラクチャーの周りに地形を追加して、より覆いやすくします(完全に覆われないこともある)

省略した場合、デフォルトの"none"として扱われます。

次から、type:minecraft:jigsawにしたときの追加項目の説明になります。

size

データ型:int(整数)
何段階まで生成されるかを表します。1~20の整数を指定します。

start_height

データ型:compound
生成させたい高度です。Height Providerで指定します。
Height Providerについてはこちら
をごらんください。

start_pool

データ型:string
どのパーツから始めるか、worldgen/template_poolから指定します。

max_distance_from_center

データ型:int
生成開始してから最大何ブロックまで生成するかを指定します。このときの距離は下図で示す、チェビシェフ距離で計算されます。terrain_adaptationnoneにしていた場合、1~128まで、何かしら指定した場合は1~116まで指定できます。

3a4f695a458cb0ac0aceaa2eb13ac2dd-2.png

use_expansion_hack

データ型:boolean(true/false)
パーツの中に別のパーツをネストした場合に、ネスト先のパーツに合わせてパーツの高さが拡張されます(但し、開始パーツは除く)。
通常は、きちんと元の高さに収まるようにネストする必要があるのですが、これをtrueにすることにより、気にしなくてよくなります。
デフォルトでは村でのみ使用されています。

dimension_padding

ところで、ストラクチャーの生成途中で、ディメンションの上限や下限に達したらどうなるでしょうか?
答えは、「それより上や下に行かなくなります」。見た目としては、上下端でばっさり切れた不自然なものになります。
これを防ぐのがこの項目で、指定した分、ディメンションの端に近づかなくなります。イメージとしてはhtmlのpaddingに近い。

liquid_settings

データ型:string
カスタムストラクチャーでは生成、生成される場所が水中だったり、水没可能ブロック(waterloggedのblockstateを持つブロック)が水源に隣接していたりすると、勝手に水没(waterlogged=true)してしまいます。
この項目はこれを阻止することができる項目で、以下のどちらかを指定します。

  • apply_waterlogging : 水没する
  • ignore_waterlogging : 水没しない

水没させたくなかったら"ignore_waterlogging"にしましょう。
省略した場合、デフォルトの"apply_waterlogging"として扱われます。

pool_aliases

データ型:list
これはなかなか難しい項目です。
指定したテンプレートプールを別のテンプレートプールに差し替えます。
これにより、生成される場所によって使うパーツが違うストラクチャーが出来たり、わざわざパーツを作らなくてもエンティティだけ変えたり、等の芸当が可能になります。
これについての説明もnoteで説明しています。

その他の追加項目についての説明

type:minecraft:ruined_portalの場合

setups

list

どういうポータルを生成するかを決めます。

以下の項目を含んだオブジェクトの配列になっています。

  • weight
  • placement
  • air_pocket_probability
  • mossiness
  • overgrown
  • vines
  • can_be_cold
  • replace_with_blackstone
weight

選出される確率を表す小数で、この数字が大きいほど選ばれやすくなります。最大1.0

placement

string。どのように配置されるかを、以下のどれかから指定します。

  • on_land_surface
  • ワールドの表面(地面)の上に生成します。heightmapのWORLD_SURFACEあたりと同じです。
  • partly_buried
  • 砂漠のようにちょっと地面に埋まった状態で生成されます。
  • on_ocean_floor
  • 海底など、水などの底に生成されます。heightmapのOCEAN_FLOORあたりと同じです。
  • in_mountain
  • y=70以上の地下[1]に生成されます。
  • underground
  • y=15以上の地下[1]に生成されます。
  • in_nether
  • ネザーに生成されます。
air_pocket_probability

float(小数)。ポータルのパーツは空気を含めて保存されていますが、その空気を何割残すかです。最大1.0

mossiness

float。石レンガを苔石レンガにしたりしてなんか…こう…古びた雰囲気にします。最大1.0。 実際には内部的に"block_age"というProcessorが働いています。 これについてはこちら(またしてもnoteです)

overgrown

ブーリアン。ネザーラックの部分をジャングルの葉で覆います。

vines

ブーリアン。ツタを生やします。

can_be_cold

ブーリアン。寒冷版として扱うか。先程のProcessorの適用の仕方が変わっていきます。

replace_with_blackstone

ブーリアン。石レンガ系のブロックをブラックストーン等にするかどうかです。

内部的に"blackstone_replace"というProcessorが働いています。それも先程のnoteの中で説明しています。

type:minecraft:mineshaftの場合

mineshaft_type

廃坑のタイプです。普通の"normal"とメサ廃坑の"mesa"の2択です。

type:minecraft:nether_fossilの場合

height

生成される高さです。ジグソーのstart_heightと同様、Height Providerで指定します。

type:minecraft:ocean_ruinの場合

biome_temp

遺跡のタイプです。主に石レンガや砂利で出来た寒冷タイプのcoldと主に砂岩と砂で出来た温暖タイプのwarmの2択です。

large_probability

float。大型のパーツが使用される確率です。最大1.0。

cluster_probability

float。大型のパーツの周りに小さなパーツが群生する確率です。最大1.0。

type:minecraft:shipwreck

is_beached

ブーリアン。座礁しているかどうか。

テンプレートプールを作る

どのパーツを使用するかを決めるものです。
テンプレートプールの作り方はこちらをご覧ください。

配置設定(worldgen/structure_set)

ストラクチャーをどうやってワールド内に分布されるかを決めるものです。
設定項目は以下になります。

  • structures
  • placement

structures

生成させたいストラクチャー。以下の項目を含んだオブジェクトのリストです。

  • structure
    生成させたいストラクチャーの名前です。先程設定したworldgen/structureのファイルを指定します。
  • weight
    int。偏り度で、複数のオブジェクトを指定した場合、これが大きいものほど選出されやすくなります。

placement

どういう風にストラクチャーを分布させるか。以下の項目を含んだオブジェクトです。

  • type
  • salt
  • [frequency]
  • [frequency_reduction_method]
  • [exclusion_zone]
  • [locate_offset]
type

分布のタイプです。ワールド中にランダムに分布するminecraft:random_spreadと要塞のように座標(0, 0)を中心とした同心円状に拡がるminecraft:concentric_ringsの2択で、それぞれ以下の項目が追加されます。

minecraft:random_spreadの場合

spread_type
ストラクチャー同士の距離の確率分布で、linear(線形分布)かtriangular(三角分布)の2択です。
separation
ストラクチャー同士の最小の距離です。
spacing
ストラクチャー同士の平均的な距離です。separationより大きい必要があります。
また、ストラクチャー同士の距離の最大は2*spacing - separationから算出されます。

minecraft:concentric_ringsの場合

distance
同心円同士の距離です。
やや見づらいですが、下図の赤い矢印の部分の距離です。
96ブロックで1、つまり6チャンク単位になっています。
stronghold_placement.drawio.png
spread
一番最初にいくつ生成するかを表します。例えば、要塞は3と設定されており、実際ワールドの中心に一番近いものは3つ存在します。
一番最初以外は各円ごと$ spread * \frac{N^2+3\times N+2}{6} $ 個生成されます(Nは何番目の同心円か)。
count
全部でいくつ生成されるかを表します。例えば、要塞は128と設定されており、実際に合計128個存在します。
preferred_biomes
先程設定したbiomesのうち特に生成されやすいバイオームを指定します。指定の仕方はbiomesと同じです。

salt

0以上の整数。ソルト。後述するfrequency_reduction_methodで使用します。
(ソルトそのものの意味は私自身あまり理解してません)

frequency

実際に生成される確率
といえばそうですが、デフォルトで最大1.0のfloatで、どちらかといえば1.0より小さくすることで生成を間引くのに使います。

frequency_reduction_method

乱数の生成の仕方をdefaultlegacy_type_1legacy_type_2legacy_type_3から選びます。これらはシード値や座標、前述のソルトに基づいて算出されます。それぞれどれに基づいているかは次の表をご覧ください。

シード値 座標 salt
default
legacy_type_1 ×
legacy_type_2
(但し10387320で固定)
legacy_type_3 ×

また、legacy_type_1は位置ずれ程度のランダム性になっています。

exclusion_zone

指定した他のストラクチャーの近くになるべく生成されないようにします。
以下の項目を含んだオブジェクトです。

  • other_set
    距離をおきたいストラクチャー。worldgen/structure_setから指定します。string。
  • chunk_count
    どれだけ離したいか。1~16の整数。
locate_offset

ジグソーを用いたカスタムストラクチャーは基本的にチャンク座標(0,0)(北西の角)に生成されます。
でも…ちょっとずらしたりしたい時ってありますよね?feature呼び出したらチャンクの境目で切れるし…。
そこで使うのがこれです。
これを使うことで、チャンク内で生成される位置をずらすことが出来ます。
指定の仕方は長さ3のリストでそれぞれX座標、Y座標、Z座標に対応しています。

おわりに

今回はカスタムストラクチャーの基本について説明させていただきました。しかし、このテーマなら既に解説してる人がいるはず…。
それらに負けないようになるべく知ってる限りすべてを説明しました。
あまり手をつけてる人を見かけない気がしますが…これが何かの参考になれば幸いです。

引用文献

  1. 7-5. 階層型クラスター分析2 | 統計学の時間 | 統計WEB
    https://bellcurve.jp/statistics/course/27193.html
  2. Minecraft Wiki, "Stronghold"
    https://minecraft.wiki/w/Stronghold

注釈

  1. ここで言う、「地下」とは「その地点で一番高い所にあるブロックの高度」から「生成させるパーツの高さ」を引いたものです。
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?