EternalTDのレベルとマップ
EternalTDにおける「レベル」とは、plugins/EternalTD/levels/ 内のYAML設定と plugins/EternalTD/worlds/ 内のテンプレートワールドフォルダのペアです。プレイヤーが参加すると、EternalTDはテンプレートワールドをサーバーのワールドコンテナにクローンし、そのクローンされたコピー内でセッションを実行します。
レベル設定フィールド
| フィールド | 型 | デフォルト | 注記 |
|---|---|---|---|
isEnabled | bool | true | 無効化されたレベルはロード中にスキップされます |
levelName | string | null | メッセージ、スコアボード、NPCメニューに表示される表示名 |
levelDescription | string list | [] | NPCメニューに表示される行。$highscoreWave と $highscorePlayer のプレースホルダをサポート |
worldName | string | null | plugins/EternalTD/worlds/ 配下のテンプレートフォルダ名 |
startLocation | string list | null | モブがスポーンするシリアライズされた位置のリスト |
endLocation | string list | null | モブが向かう先(「赤い」タイル)のシリアライズされた位置のリスト |
levelLocations | string list | null | レベル内のすべての歩行可能なグリッドマス。フロア選択を登録すると自動的に生成されます |
wavesConfigFile | string | 必須 | リンクされたウェーブ設定(waves/<name>.yml)のファイル名 |
waveCount | int | -1 | キャッシュされたウェーブ数。現在は情報目的のみ |
highscoreWave | int | 0 | このレベルで到達した最高ウェーブ |
highscorePlayerName | string | "no one" | スコアを記録したプレイヤーの表示名 |
environment | enum | NORMAL | クローンされたワールドがロードされる際に使用されるワールド環境 |
全体を通じて使用されるグリッドサイズは、論理マスあたり 3 ブロックです(コード内の定数 GRID_SIZE)。
位置文字列の形式
EternalTDの位置は、以下の形式のカンマ区切り文字列としてシリアライズされます:
worldName,x,y,z,yaw,pitch
通常は手動で記述する必要はありません — /etd selectfloor と register コマンドが計算して保存してくれます。
ワールドのライフサイクル
プレイヤーがレベルに参加するとき:
- EternalTDは
plugins/EternalTD/worlds/内でworldNameに基づいてテンプレートフォルダを検索します。 - 次の空き数値サフィックス(
<worldName>_0、<worldName>_1、...)を選択し、クローンをサーバーのワールドコンテナに書き込みます。古いレガシーまたは現代的なレイアウトコピーがあれば事前にクリーンアップします。 - クローンされたワールドはMagmaCoreの
TemporaryWorldManagerを介して一時的なvoidワールドとしてロードされるため、Paper 26.1+ の移行は隔離されます。 - プレイヤーは新しいワールドにテレポートされます。内部の
InstanceProtectorがEternalTDの保護ルールを適用します。
セッションが終了すると:
- クローンされたワールド内に残っているプレイヤーは、
config.ymlのスポーン位置にテレポートされ、スポーンが設定されていない場合はキックされます。 - クローンされたワールドはアンロードされ、ディスクから削除されます(
TemporaryWorldManager.permanentlyDeleteWorld)。
インスタンス保護ルール
レベルがアクティブな間、クローンされたワールドには以下のルールが適用されます:
- 爆発を無効化
- 液体の流れを無効化
- エリトラを無効化
- 飛行切り替えを防止
- フレンドリーファイアを防止
- バニラのモブスポーンを防止
マップ作成ワークフロー
現在のマップ作成フローはゲーム内ツールを使用します:
- テンプレートワールドフォルダを
plugins/EternalTD/worlds/<worldName>/配下に配置します。 - 対応するレベルYAMLを
plugins/EternalTD/levels/に作成またはダウンロードします。 /etd reloadを実行し、レベルワールドに手動で参加します(またはシングルプレイヤーで開いてセットアップします)。/etd selectfloorを使用し、右クリック/左クリックで2つのコーナーをマークしてプレイエリアを指定するか、/etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2>を使用して直接指定します。/etd showselection <level>を実行して、選択範囲が正しく見えるか確認します。/etd register <level>を実行して選択をクリアします。なお、現在のビルドではregisterもshowselectionも実際にはフロア領域を永続化しません —levelLocationsを保存するヘルパー(LevelsConfigFields#addLevelLocations)は定義されていますが、どのコマンドからも呼び出されません。ダウンロード済みパッケージで既に設定されていない場合は、現在levelLocationsをレベルYAMLに手動で書き込む必要があります。- スタートスポーンタイルの上に立って
/etd register <level> startを実行します。すべてのスタートタイルでこれを繰り返します(このコマンドはstartLocationに永続化されます)。 - エンドタイルの上に立って
/etd register <level> endを実行します。すべてのエンドタイルでこれを繰り返します(このコマンドはendLocationに永続化されます)。 - 再度リロードし、NPCメニューまたは
/etd join <level>経由でレベルに参加してテストします。
選択コマンドは以下の式を使用してグリッドマスを生成します:
size = abs(corner1 - corner2 + 1) / 3
トップブロックが空気(またはフロアブロックが通過可能)であるマスはスキップされるため、マスがプレイ可能として登録されるにはフロアブロックがソリッドである必要があります。
経路の検証
EternalTDはタワーが設置されるたびにA*経路探索チェックを実行します。タワーを設置することで、いずれかのスタートタイルからいずれかのエンドタイルへの歩行可能な経路がなくなる場合、設置は拒否されゴールドは消費されません。
Air属性の敵はタワーを完全に無視する別の経路を使用し、代わりに空中オフセット(設定された経路の4ブロック上)を辿ります。
NPCとレベルメニュー
plugins/EternalTD/npcs/ 内のNPC設定は、村人NPCを1つ以上のレベルにリンクします。NPCを右クリックすると、各レベルが緑色のステンドグラス板として表示される9スロットのインベントリが開き、レベル名と説明がラベルとして付きます。
| フィールド | 型 | デフォルト | 注記 |
|---|---|---|---|
isEnabled | bool | true | 無効化されたNPCはスキップされます |
levelIDs | string list | 必須 | このNPCが提供するレベルのファイル名 |
location | string | null | 標準の worldName,x,y,z,yaw,pitch 形式のスポーン位置 |
name | string | "Default Name" | NPCの表示名 |
difficulty | string | "Difficulty: Not Set" | NPCの上に表示される難易度ラベル |
disguise | string | null | LibsDisguises記述子(例: custom:etd_tutorial_npc) |
customDisguiseData | string | null | LibsDisguisesの追加コマンドデータ — 通常は長いプレイヤースキン文字列 |
村人は無敵、AI無効、永続化、そしてEternalTDのNPC名前空間キーでタグ付けされた状態でスポーンされます。LibsDisguisesがインストールされており、disguise と customDisguiseData の両方が設定されている場合、村人はスポーン時にディスガイズされます。
difficulty ラベルを持つ浮遊するアーマースタンドが、NPCの2.3ブロック上にスポーンされます。
スポーン動作
DefaultConfig は、ハブワールドでのプレイヤーの管理方法を制御します:
setupDone— 初回セットアップガイダンスが完了したかどうかを追跡するフラグ。spawnLocations— デフォルトはetd_spawn,0,65,0,0,0。etd_spawnワールドが存在する場合にのみ使用されます。manageSpawn— デフォルトはtrue。有効な場合、参加するプレイヤーはログインから1 tick後にスポーン位置にテレポートされます。playerGuide— ゲーム内ガイドブックのテキスト。
manageSpawn が true でスポーンワールドがロードされている場合、サーバーに参加するすべてのプレイヤーは spawnLocations にテレポートされます。