モジュラーダンジョンとは?
モジュラーダンジョンはBetterStructures 2.0.0以降のダンジョンシステムです。固定のスキマティック1つを配置する代わりに、手作りの小さなモジュールを組み合わせます。複数階層のダンジョンを、生成するたびに異なるレイアウトで構成できます。
モジュラーダンジョンの生成方法
-
モジュール サイズは設定可能です。16×16×16ブロックがよく使われますが、32×16×32などを使うパックもあります。各面のボーダータグと共通の接続位置を設計し、隙間や重なりが出ないようにします。寸法はジェネレーターの
moduleSizeXZとmoduleSizeYで指定します。モジュールには廊下、部屋、階段、戦闘用の空間などを作れます。 -
生成処理 新しいチャンクで生成するとき、BetterStructuresはWave Function Collapse(WFC)を使い、ボーダータグが適合するモジュールをランダムに選んで組み立てます。所要時間は半径、垂直範囲、モジュール数、制約、サーバー性能に依存します。レイアウト計算は非同期で行い、キューに入った貼り付け処理は設定されたサーバーティックの時間枠を共有します。大きなレイアウトや不適合な構成は、依然として負荷が高くなったり、組み立てに失敗したりします。
-
ダンジョンの大きさ 半径を大きくすると、数百ブロックに及ぶダンジョンも作れます。多くのダンジョンは複数階層で、階段や縦穴を介してつながります。上下の接続には
bordersのupとdownを使い、向かい合う面のタグを一致させます。
パックの種類と組み合わせ
カタログにはDungeoneering Modules FreeとDungeoneering Modules Premiumがあります。同梱のdungeoneeringジェネレーターには、両パックの開始スキマティックが登録されています。カタログには、EliteMobsのボスが守るモジュラー式の鉱山であるTommyknockers Modules FreeとTommyknockers Modules Premiumもあります。PremiumにはFreeパックが必要です。必要なFreeMinecraftModelsコンテンツを含め、パックが指定するモジュールと依存プラグインをインストールしてください。互換性のあるモジュールを追加するとレイアウトの選択肢が増えます。スキマティックだけを入れても、付属のモデルやモブのコンテンツはインストールされません。
エンティティとコンテナのマーカー
モジュール生成は看板の表側のテキストを読み、空行を除外します。小文字のマーカーを1行目に書き、引数をその直下に書いてください。マーカーの判定は、[elitemobs]を除いて大文字と小文字を区別します。モジュールの貼り付けでは、装飾用や未対応のマーカーを含むすべての看板ブロックが削除されます。
| 看板タグ | 追加行 | 動作 |
|---|---|---|
[spawn] | 2行目にBukkitのエンティティタイプ | 看板のブロックを中心に、永続的なバニラエンティティを生成します。専用モジュラーワールドでは、連携用のスポーン位置としても記録します。 |
[chest] | なし | チェストを配置し、ジェネレーターのtreasureFileで中身を生成します。 |
[trapped_chest] | なし | トラップチェストを配置し、ジェネレーターのtreasureFileで中身を生成します。 |
[pool: poolname] | なし | EliteMobsのスポーンプールからボスを1体選び、看板のブロックを中心に生成します。既存の地形では、ボスは一度きりのEliteMobsリージョナルボスになります。専用モジュラーワールドで通常ボスとインスタンスボスがどう扱われるかは、スポーンプールの節を参照してください。 |
[elitemobs] | 次の行以降にEliteMobsボスのファイル名。区切りなしで連結されます | 既存の地形に貼り付けるモジュール(isWorldGeneration: false)でのみ、看板のブロックを中心に一度きりのEliteMobsリージョナルボスを生成します。専用モジュラーワールドでは無視されます。 |
[barrel] | なし | 専用ワールドで樽の位置を記録します。連携側がspawnBarrels()で実体化する必要があり、マーカー自体は樽の配置や中身の生成を行いません。 |
[exit] | 2・3行目に上下の部品名。.schemは付けない | 専用ワールドで出口を記録します。連携側がcomponents/の部品を配置する必要があります。引数の行がどちらか欠けると、両方の名前がgenericelevator_upとgenericelevator_downになります。 |
[barrel]と[exit]のマーカーはisWorldGeneration: trueの場合だけ処理されます。既存の地形に貼り付けるダンジョンにはisWorldGeneration: falseを使ってください。このモードでは[spawn]、[chest]、[trapped_chest]、[pool: poolname]、[elitemobs]が機能します。既存の地形でボスの看板を使うにはEliteMobsが有効である必要があります。EliteMobsがない場合、BetterStructuresはダンジョンごとに1回警告をログに記録し、ボスは生成しません。モジュールはWorldGuardのアリーナ保護を作成しません。通常の戦利品入りの樽には、実際の樽ブロックをモジュールに配置し、後述の設定を使います。
スポーンプール
[pool: poolname]の看板はspawn_pools/内の設定を参照します。各YAMLファイルには次の項目があります。
| フィールド | デフォルト | 説明 |
|---|---|---|
isEnabled | — | 読み込まれません。スポーンプールには有効化スイッチがありません。 |
poolStrings | [] | 選択候補となるEliteMobsボスのファイル名リスト。 |
minLevel | -1 | 保存されますが、読み込まれません。 |
maxLevel | -1 | このプールのインスタンスボスに与えるレベル。有効な値を明示してください。 |
処理にはEliteMobsが必要です。poolStringsからボスのファイル名をランダムに選びます。プール名には.ymlの前にジェネレーターのspawnPoolSuffixを付けるため、_hardならpoolname_hard.ymlを参照します。spawnPoolSuffixのないジェネレーターはpoolname.ymlを参照します。プール名の末尾に空白を入れないでください。プールファイルが見つからない場合、poolStringsが空の場合、またはEliteMobsが認識しないボスファイル名の場合は、警告がログに記録され、その看板では何も生成されません。
専用モジュラーワールドでは、インスタンス用ではないボスは貼り付け中に生成されます。インスタンスボスは、連携側がspawnInstancedEntities()を呼ぶまで待機します。各ボスはプールのmaxLevelで生成され、ダンジョンの開始地点からの距離に応じてEliteMobsのインスタンス難易度IDが選ばれます。距離はX方向とZ方向のオフセットのうち大きいほうで、ダンジョンの幅(2 × radius − 1) × moduleSizeXZと比較します。幅の6分の1未満なら2、3分の1未満なら1、それより外側なら0になります。useGradientLevelsはこれに影響しません。
モデルとモブの連携
モジュールと通常の構造物では看板の処理が異なります。モジュールの貼り付けは、上記のとおり既存の地形でのみ[elitemobs]の看板を処理します。構造物の作成にある[mythicmobs]と[custom]の看板は、モジュールの貼り付けでは処理されません。上記の対応マーカーを使い、パックの依存関係に関する説明に従ってください。
スキマティックだけでは、他のプラグインが管理する任意のモデルエンティティを再現できません。パックが必要とするモデルと補助プラグインをインストールしてください。存在しないボスが自動的に装飾モデルへ置き換わるとは限りません。
モジュールの寸法
モジュールサイズは固定ではなく、設定可能です。
ジェネレーターで次の値を指定します。
moduleSizeXZ:ブロック単位の幅と奥行き。スキマティックに合わせて明示します。moduleSizeY:ブロック単位の高さ。スキマティックに合わせて明示します。
一般的なサイズ: 16×16×16ブロック。明示的な設定が必要です。 別の例: 一部のパックが使う32×16×32ブロック。
モジュール作成時:
- ジェネレーターの
moduleSizeXZとmoduleSizeYを確認します。 - そのジェネレーター用の全モジュールを正確に同じ寸法で作ります。
- 実際のスキマティック寸法と接続位置を確認します。ジェネレーターは形状を検証しません。
カスタム寸法の例:
ジェネレーター設定に次を記述します。
moduleSizeXZ: 32 # Width and depth
moduleSizeY: 16 # Height
同じジェネレーターのモジュールは寸法を統一してください。16×16×16と32×16×32を同じダンジョンに混在させないでください。
モジュールジェネレーターの設定
moduleSizeXZとmoduleSizeYを含め、次の項目を設定できます。
| フィールド | デフォルト | 説明 |
|---|---|---|
isEnabled | true | 自然生成の選択を許可します。手動コマンドは確認しません。 |
radius | 明示する | モジュールグリッドのセル単位の半径。水平セルサイズはmoduleSizeXZで、外周セルは境界用です。 |
edges | false | 保存されますが、現在のジェネレーターは参照しません。端の配置にはworld_borderタグを使います。 |
startModule | — | 開始用.schemファイル名のリスト。1つをランダムに選び、回転0でグリッド位置(0, 0, 0)に置きます。 |
minChunkY | 0 | モジュールグリッドの垂直インデックスの下限。境界値を含み、ワールドのブロックY座標ではありません。 |
maxChunkY | 0 | 垂直インデックスの上限。境界値を含みます。範囲内に層0を含めてください。 |
moduleSizeXZ | 明示する | モジュールの幅と奥行き、ブロック単位。 |
moduleSizeY | 明示する | モジュールの高さ、ブロック単位。 |
debug | false | 出力先のワールドに診断用ブロックと文字を描画します。破棄できる生成エリアだけで使ってください。 |
useGradientLevels | false | 保存されますが、現在のプールのレベル計算は参照しません。 |
spawnPoolSuffix | — | プール名に付ける接尾辞。不要なら省略するか""を設定します。 |
isWorldGeneration | false | trueは専用の空ワールドを作成し、falseは既存ワールドに貼り付けます。 |
treasureFile | — | ダンジョンのチェスト用戦利品設定ファイル。 |
generateLootInBarrels | true | モジュール内の樽に戦利品を入れるか。 |
barrelTreasureFilename | treasure_barrel_food.yml | ダンジョンの樽用戦利品設定ファイル。 |
validWorlds | 空、全ワールド | 自然生成を許可するワールド名のリスト。 |
validWorldEnvironments | 空、全環境 | 許可する環境のリスト:NORMAL、NETHER、THE_END、CUSTOM。同梱のdungeoneeringジェネレーターは[NORMAL, CUSTOM]を明示し、初期状態ではオーバーワールド系だけで生成します。キー省略時は下の説明を参照してください。 |
centerModuleAltitude | 0 | 既存地形への自然生成の開始Y座標。層0はmoduleSizeYの半分だけ上にずれます。既存ワールドへの手動配置はプレイヤーの位置から、専用ワールドでは(0, 0, 0)から開始します。 |
省略したキーにはジェネレーター定義の現在の値が使われます。プリセットはコンテンツに応じた値で初期化されます。手書きのジェネレーターではradius、moduleSizeXZ、moduleSizeYが0から始まり、その0がファイルに書かれる場合もあります。寸法を省略しても16にはなりません。validWorldsとvalidWorldEnvironmentsの省略は制限なしを意味し、NORMAL/CUSTOMだけには限定されません。正常に動作する完全な設定を元に、半径、寸法、開始モジュール、ワールド制限を明示してください。
モジュール単位の設定
各モジュールには次の項目があります。
| フィールド | デフォルト | 説明 |
|---|---|---|
isEnabled | true | モジュールを有効にするか。 |
weight | 100 | 生成時の選択重み。負の値や有限でない値は警告をログに記録して0になり、そのモジュールは選択対象から外れます。 |
repetitionPenalty | 0 | 同じスキマティック名の選択済み隣接モジュール1つごとに、重みへ加算されます。正の値は反復を促し、負の値は減らします。最終的な重みは正に保ってください。 |
noRepeat | false | 同じ設定IDの選択済みモジュールに隣接する候補を除外します。クローンも対象です。ダンジョン全体で1回だけに制限する設定ではありません。 |
enforceVerticalRotation | false | 上下に隣接するどちらかが有効にすると、Y軸回転の一致を要求します。 |
enforceHorizontalRotation | false | 水平に隣接するどちらかが有効にすると、Y軸回転の一致を要求します。 |
minY | -4 | 候補選択に使うモジュールグリッドの下限層。境界値を含みます。 |
maxY | 20 | 候補選択に使うモジュールグリッドの上限層。境界値を含みます。 |
biome | default | 保存されますが、モジュール選択を制限しません。 |
minecraftBiome | null | 保存されますが、モジュール選択を制限しません。 |
treasureFile | — | 設定は読み込まれますが、現在のマーカーチェストはジェネレーターのtreasureFileを使います。 |
generateLootInBarrels | true | このモジュールの樽に戦利品を入れるか。 |
barrelTreasureFilename | treasure_barrel_food.yml | このモジュールの樽用戦利品設定ファイル。 |
borders | — | 接続の適合性を定義する各面のタグ。 |
cloneConfig | — | 別のモジュール設定ファイルから設定を参照します。 |
compoundModule | — | 保存されますが、現在のジェネレーターは複合モジュールの構築に使いません。 |
isAutomaticallyPlaced | true | 通常の候補選択を許可します。指定された開始モジュールはこの条件を回避します。 |
bordersにはnorth、south、east、west、up、downの6項目をすべて定義し、それぞれタグのリストを入れます。通常のタグは大文字小文字を含め完全一致が必要です。corridorはcorridorと接続できます。no-mirror_corridorはcorridorとは接続できますが、別のno-mirror_corridorとは接続できません。各モジュールにはY軸の0、90、180、270度の4回転が用意されます。
nothingは空の隣接セルを許可します。world_borderは配置可能な水平領域の最外周用で、外向きの面にはworld_borderタグだけを含める必要があります。上下の閉じた境界にはnothingを使います。半径5なら最大9 × 9の水平モジュールセルとなり、その周囲は空の境界です。これらは通常の候補選択の条件です。開始モジュールは直接配置されるため、原点に適した設定と形状にしてください。
cloneConfigには別のモジュールの.ymlファイル名を指定します。クローン対象の設定はそのファイルから読みます。参照先が見つかると、BetterStructuresはローカルファイルから冗長なキーを削除します。対象はtreasureFile、barrelTreasureFilename、generateLootInBarrels、borders、minY、maxY、weight、repetitionPenalty、2つの回転設定、noRepeat、6つの*IsPassable、isAutomaticallyPlacedです。isEnabled、biome、minecraftBiome、cloneConfig、compoundModuleは残ります。実行時の複合モジュール参照もクローン先に従います。参照ファイルがなければ警告とともにクローンを無視し、自身の値を使います。
生成された設定にはnorthIsPassable、southIsPassable、eastIsPassable、westIsPassable、upIsPassable、downIsPassableもあります。デフォルトはtrueですが、ジェネレーターは読みません。変更しても効果はないため、bordersを使ってください。
cloneConfigを循環参照させないでください。a.yml -> b.yml -> a.ymlのような循環があると、その連鎖を示す「Cyclic module clone configuration」エラーでモジュールの読み込みが停止します。
/bs generateModulesによる手動生成
/bs generateModules <ModuleGeneratorsConfigFile.yml>は自然生成を待たずに実行します。タブ補完には読み込まれた全ジェネレーターファイルが表示されます。
結果はisWorldGenerationで変わります。
isWorldGeneration: true:新しい専用ワールドを作ります。ジェネレーターファイル名に_0、_1、_2…を付け、まだフォルダーがない最初の名前を選びます。環境はNORMALの空ワールドで、スポーンチャンクをメモリに保持せず、自動保存も無効です。プレイヤーはスペクテイターモードになりますが、新ワールドにはテレポートしません。isWorldGeneration: false:現在いるワールドで生成します。
ボスバーはレイアウトの組み立てを表示し、貼り付けがキューに入ると消えます。組み立て完了のメッセージは、ブロックやエンティティの配置完了を意味しません。指定した開始スキマティックが1つもインストールされていなければ停止します。無効な開始モジュールが選ばれた場合も、必要なコンテナがなく生成が中止されることがあります。
コマンドにはbetterstructures.generatemodulesを持つプレイヤーが必要で、コンテンツのリロード中は拒否されます。手動生成は、ジェネレーターの有効設定、ワールド制限、配置範囲の保護など、自然生成の検査を回避します。出力先は慎重に選んでください。
モジュールファイルの配置場所
モジュールはplugins/BetterStructures/modulesに置きます。再帰的に検索されるため、パックごとのサブフォルダーに.schemを置けます。対応する.ymlは同じ場所に生成されます。
スキマティック名はmodules全体で一意にしてください。名前の重複や読み取れないファイルがあると、モジュール読み込みが中止されます。スキマティックはisEnabledを確認する前に読み込むため、無効化しても破損ファイルを回避できません。isEnabled: falseのコンテンツパッケージのフォルダは丸ごとスキップされるため、そのモジュールは読み取りも読み込みもされません。
自然生成の配置と保護
自然生成は設定された配置範囲全体を確認します。ワールド座標(0, 0)を中心とした設定済み保護半径、名前付きWorldGuardリージョン、または最近新規として観測されていない生成済みチャンクと重なる場合は配置しません。貼り付けをキューに入れる直前にWorldGuardを再確認し、当初未生成だったチャンクがその間に生成されていた場合も中止します。これはチャンク状態の確認であり、プレイヤーが置いたブロックや他の保護プラグインを調べるものではありません。古い拠点の隣に新規チャンクを作っても、範囲全体が配置可能になるわけではありません。
自然選択されるジェネレーターにはisWorldGeneration: falseを使ってください。自然生成の選択処理はtrueを除外しないため、trueでは検査した地形に貼り付けず、別ワールドを作ります。
ブロック、ブロックエンティティ、戦利品、エンティティ、マーカーは貼り付けの時間枠を共有します。WorldGenerationFinishEventは専用ワールドへの貼り付けと直後の処理が成功してから発行されます。連携側の出口配置や、待機中のインスタンスボスの生成が完了したことは意味しません。大きな構造物ではレイアウト計算後にも複数ティックかかります。
モジュールの戦利品設定の優先順位
マーカーで作るチェストとトラップチェストは、ジェネレーターのtreasureFileを使います。実際の樽ブロックでは、ジェネレーターとモジュールの両方でgenerateLootInBarrelsを有効にする必要があります。モジュールのbarrelTreasureFilenameが空でなければジェネレーターより優先されます。生成されるモジュール設定のデフォルトはtreasure_barrel_food.ymlです。チェストと樽は、インベントリの内容を適用する前にキャンセル可能なChestFillEventを発行します。
チェストの戦利品生成にはマーカーを使ってください。現在のモジュール貼り付けは、スキマティック内の通常のチェスト、トラップチェスト、樽のインベントリを保持しません。バリアブロックは無視され、岩盤マーカーは配置先が固体でない場合だけ石になります。空気は既存ワールドの内部を掘り抜き、専用の空ワールドでは無視されます。
防具立て、絵画、額縁など、モジュールに保存されたエンティティもモジュールと一緒に貼り付けられます。絵画と額縁はモジュールの回転に合わせて向きが変わるため、壁に掛かったままになります。