EternalTDカスタムコンテンツのパッケージング
EternalTDは以下のフォルダからカスタムコンテンツを読み込みます。ZIPのインポートにはMagmaCoreの共通インポーターを使い、パッケージのメタデータで /etd setup の表示を制御します。
インポートルート
手動インポートは引き続き以下を経由します:
plugins/EternalTD/imports/
コンテンツを手動でインポートした後、以下を実行してください:
/etd reload
正規コンテンツフォルダ
現在のプラグインは以下の小文字フォルダをスキャンします:
plugins/EternalTD/levels/
plugins/EternalTD/waves/
plugins/EternalTD/npcs/
plugins/EternalTD/worlds/
レガシーに関する注記:
Levels/とNPCs/はレガシーフォルダ名です。- EternalTDは起動時とリロード時にそれらを
levels/とnpcs/に移行するようになりました。
ワールドパッケージングルール
EternalTDは以下のワールドを:
plugins/EternalTD/worlds/
ワールドテンプレートとして扱います。
プレイヤーがレベルを開始すると、EternalTDは一致するテンプレートワールドをサーバーのワールドコンテナにクローンし、そのクローンされたコピーでセッションを実行します。
テンプレートのルートはコピー前に、内部のファイルやフォルダはコピー中に検証します。失敗すると途中まで作成したコピーをロールバックします。次のいずれかに当てはまる場合、コピーは拒否されます:
- テンプレートのルートに
level.datがない - テンプレートフォルダがシンボリックリンクである、または内部のどこかにシンボリックリンクを含んでいる
- テンプレートが
.eternaltd-instanceという名前のファイルを含んでいる
最後の名前は予約されています。EternalTDは実行時のコピーに所有権マーカーを書き込み、クリーンアップ前にインスタンスの識別情報と所有権を確認します。配布するテンプレートには同梱しないでください。
実用的な意味:
- テンプレートワールドは
plugins/EternalTD/worlds/の下にパッケージしてください - ランタイムでクローンされたワールドをパッケージされたコンテンツの正しいソースとして扱わないでください
- テンプレートは
worlds/の直下に置いてください。名前に.を含むフォルダは検出対象から除外されます - フォルダ名にはパス区切り文字、
:、制御文字も使えません。レベルのworldNameと完全に一致させてください
公式ハブワールドは特殊なケースであり、サーバーのワールドコンテナ内で直接以下として追跡されます:
etd_spawn
パッケージの有効・無効を切り替える条件
/etd setup でのパッケージ切り替えは、追跡された設定ファイルを公開するパッケージでのみ機能します。
現在の追跡アセットフィールドは:
levelFileswaveFilesnpcFilesworldFoldersworldContainerFoldersmarkerFileName
実際には:
- レベル、ウェーブ、NPCパッケージはそれらのYAMLファイル内で
isEnabledを書き込むことで有効化または無効化できます - 追跡対象のファイル名は再帰的に照合されるため、
levels/、waves/、npcs/のサブフォルダも問題ありません — 一致する必要があるのはファイル名だけです - 共有ワールドコンテナコンテンツとマーカーのみのリソースパッケージは同じ方法で切り替えることができません
パッケージメタデータフィールド
現在のパッケージ設定フィールドモデルは以下をサポートしています:
isEnablednamedescriptiondownloadLinkversionnightbreakSluglevelFileswaveFilesnpcFilesworldFoldersworldContainerFoldersmarkerFileNamecategorytoggleable
カスタムコンテンツをセットアップメニューに表示するには、メタデータのYAMLを plugins/EternalTD/content_packages/ に直接配置するか、ZIPの content_packages/ フォルダに含めて配布します(ZIPの構成を参照)。実際のファイル名とワールド名を登録し、少なくとも1つのアセットを追跡対象にしてください。アセット一覧が空の場合、ダウンロード済みとは判定されません。パッケージの isEnabled だけではレベルは無効になりません。メニューの切り替えは、追跡対象の各レベル・ウェーブ・NPCファイルのフラグを書き換え、パッケージのフラグも保存してEternalTDを再起動します。
もう1つ追跡されるフィールドとして markerFallbackFolders があります。これは、plugins/ 配下にあって空でなければパッケージがインストール済みとみなされるフォルダを列挙します。ダウンロードフローがマーカーを書き込まない経路でサーバーに届くコンテンツのために存在します。コードのみで定義されており、パッケージのYAMLに書き込んでも効果はありません。
モデルパッケージングに関する注記
現在の EternalTD Custom Models パッケージは、通常のEternalTD設定ファイルではなくマーカーファイルで追跡されています。
これは以下を意味します:
- EternalTDは共有モデルパックがダウンロードされたかどうかを追跡できます
- 実際のモデルアセットは、FMMがインストールされている場合、FreeMinecraftModels側のセットアップに存在します
- クリーンアップは手動で、その後
/etd reloadを実行します
ZIPの構成
認識されるフォルダをアーカイブのルートに直接配置し、外側のフォルダで包まないでください。最小限の構成例は次のとおりです:
pack.meta
levels/my_level.yml
waves/my_waves.yml
npcs/my_npc.yml
worlds/my_world/level.dat
worlds/my_world/region/...
pack.meta にはプレーンテキストで eternaltd と書きます。このファイルがないZIPは、インポートするプラグインのプラットフォームを使います。展開済みのフォルダは pack.meta を含む場合にのみ処理されます。.zip ファイルをインポートフォルダに置いてからリロードしてください。
| アーカイブルートの項目 | 保存先 |
|---|---|
levels, waves, npcs, worlds | plugins/EternalTD/ 配下の同名フォルダ |
content_packages | plugins/EternalTD/content_packages/。/etd setup にパックを一覧表示するパッケージのメタデータ |
content_markers | plugins/EternalTD/content_markers/。<markerFileName>.marker という名前のインストールマーカー |
worldcontainer | サーバーのワールドコンテナ。etd_spawn などの共有ワールド用 |
models, modelengine | FMMが有効ならFMMのモデルフォルダ。それ以外でModelEngineが有効ならその blueprints。どちらも無効なら後で使用するためFMMのモデルフォルダ |
scripts | plugins/FreeMinecraftModels/scripts/ |
freeminecraftmodels, elitemobs, betterstructures | そのプラグインのデータフォルダ(plugins/FreeMinecraftModels/、plugins/EliteMobs/、plugins/BetterStructures/)。中身はそのフォルダと同じ構成にします |
FMMのモデル保存先は、旧形式の Models フォルダが存在すればそれを使い、なければ models を使います。アーカイブ内の freeminecraftmodels/models フォルダも同じフォルダに統合されます。FMMが有効な場合、FMMのフォルダへのインポートはいずれもFMMのインポート済みコンテンツのリロードを発生させます。BetterStructuresのフォルダに置かれたコンテンツは、BetterStructuresの起動完了後にBetterStructuresのコンテンツリロードを発生させます。
インポーターはEternalTDが content_packages/ を読み込む前に実行されるため、ZIPに含めたパッケージのYAMLは、それをインポートしたリロードの後に /etd setup に表示されます。content_markers/ に含めたマーカーは、そのパッケージのマーカーアセットとして扱われるため、セットアップメニューのダウンロードフローを経なくても、そのアセットは存在するものとして読み取られます。ダウンロード済みと判定されるには、パッケージの追跡対象のほかのファイルもそろっている必要があります。
不明なルート項目があるアーカイブはインストール前に拒否されます。インポーターは失敗したZIPを再試行用に残し、そのアーカイブで変更した保存先の復元を試みます。復元エラーのログがあれば、再試行前に確認してください。共有ワールドを置き換える際は、まず古いワールドがアンロードされます。その中にいるプレイヤーは、読み込まれている別のワールドのスポーン地点へ移動されます。プレイヤーを移動できない場合やワールドのアンロードが拒否された場合、アーカイブは再試行用に残されます。インポートに成功するとZIPは削除されますが、それだけではレベルがプレイ可能であることは確認できません。