メインコンテンツまでスキップ

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 でのパッケージ切り替えは、追跡された設定ファイルを公開するパッケージでのみ機能します。

現在の追跡アセットフィールドは:

  • levelFiles
  • waveFiles
  • npcFiles
  • worldFolders
  • worldContainerFolders
  • markerFileName

実際には:

  • レベル、ウェーブ、NPCパッケージはそれらのYAMLファイル内で isEnabled を書き込むことで有効化または無効化できます
  • 追跡対象のファイル名は再帰的に照合されるため、levels/、waves/、npcs/ のサブフォルダも問題ありません — 一致する必要があるのはファイル名だけです
  • 共有ワールドコンテナコンテンツとマーカーのみのリソースパッケージは同じ方法で切り替えることができません

パッケージメタデータフィールド​

現在のパッケージ設定フィールドモデルは以下をサポートしています:

  • isEnabled
  • name
  • description
  • downloadLink
  • version
  • nightbreakSlug
  • levelFiles
  • waveFiles
  • npcFiles
  • worldFolders
  • worldContainerFolders
  • markerFileName
  • category
  • toggleable

カスタムコンテンツをセットアップメニューに表示するには、メタデータの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, worldsplugins/EternalTD/ 配下の同名フォルダ
content_packagesplugins/EternalTD/content_packages/。/etd setup にパックを一覧表示するパッケージのメタデータ
content_markersplugins/EternalTD/content_markers/。<markerFileName>.marker という名前のインストールマーカー
worldcontainerサーバーのワールドコンテナ。etd_spawn などの共有ワールド用
models, modelengineFMMが有効ならFMMのモデルフォルダ。それ以外でModelEngineが有効ならその blueprints。どちらも無効なら後で使用するためFMMのモデルフォルダ
scriptsplugins/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は削除されますが、それだけではレベルがプレイ可能であることは確認できません。