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

EternalTDのレベルとマップ

EternalTDにおける「レベル」とは、plugins/EternalTD/levels/ 内のYAML設定と plugins/EternalTD/worlds/ 内のテンプレートワールドフォルダのペアです。プレイヤーが参加すると、EternalTDはテンプレートワールドをサーバーのワールドコンテナにクローンし、そのクローンされたコピー内でセッションを実行します。

レベル設定フィールド

フィールドデフォルト注記
isEnabledbooltrue無効化されたレベルはロード中にスキップされます
levelNamestringnullメッセージ、スコアボード、NPCメニューに表示される表示名
levelDescriptionstring list[]NPCメニューに表示される行。$highscoreWave$highscorePlayer のプレースホルダをサポート
worldNamestringnullplugins/EternalTD/worlds/ 配下のテンプレートフォルダ名
startLocationstring listnullモブがスポーンするシリアライズされた位置のリスト
endLocationstring listnullモブが向かう先(「赤い」タイル)のシリアライズされた位置のリスト
levelLocationsstring listnullレベル内のすべての歩行可能なグリッドマス。フロア選択を登録すると自動的に生成されます
wavesConfigFilestring必須リンクされたウェーブ設定(waves/<name>.yml)のファイル名
waveCountint-1キャッシュされたウェーブ数。現在は情報目的のみ
highscoreWaveint0このレベルで到達した最高ウェーブ
highscorePlayerNamestring"no one"スコアを記録したプレイヤーの表示名
environmentenumNORMALクローンされたワールドがロードされる際に使用されるワールド環境

全体を通じて使用されるグリッドサイズは、論理マスあたり 3 ブロックです(コード内の定数 GRID_SIZE)。

位置文字列の形式

EternalTDの位置は、以下の形式のカンマ区切り文字列としてシリアライズされます:

worldName,x,y,z,yaw,pitch

通常は手動で記述する必要はありません — /etd selectfloor と register コマンドが計算して保存してくれます。

ワールドのライフサイクル

プレイヤーがレベルに参加するとき:

  1. EternalTDは plugins/EternalTD/worlds/ 内で worldName に基づいてテンプレートフォルダを検索します。
  2. 次の空き数値サフィックス(<worldName>_0<worldName>_1、...)を選択し、クローンをサーバーのワールドコンテナに書き込みます。古いレガシーまたは現代的なレイアウトコピーがあれば事前にクリーンアップします。
  3. クローンされたワールドはMagmaCoreの TemporaryWorldManager を介して一時的なvoidワールドとしてロードされるため、Paper 26.1+ の移行は隔離されます。
  4. プレイヤーは新しいワールドにテレポートされます。内部の InstanceProtector がEternalTDの保護ルールを適用します。

セッションが終了すると:

  • クローンされたワールド内に残っているプレイヤーは、config.yml のスポーン位置にテレポートされ、スポーンが設定されていない場合はキックされます。
  • クローンされたワールドはアンロードされ、ディスクから削除されます(TemporaryWorldManager.permanentlyDeleteWorld)。

インスタンス保護ルール

レベルがアクティブな間、クローンされたワールドには以下のルールが適用されます:

  • 爆発を無効化
  • 液体の流れを無効化
  • エリトラを無効化
  • 飛行切り替えを防止
  • フレンドリーファイアを防止
  • バニラのモブスポーンを防止

マップ作成ワークフロー

現在のマップ作成フローはゲーム内ツールを使用します:

  1. テンプレートワールドフォルダを plugins/EternalTD/worlds/<worldName>/ 配下に配置します。
  2. 対応するレベルYAMLを plugins/EternalTD/levels/ に作成またはダウンロードします。
  3. /etd reload を実行し、レベルワールドに手動で参加します(またはシングルプレイヤーで開いてセットアップします)。
  4. /etd selectfloor を使用し、右クリック/左クリックで2つのコーナーをマークしてプレイエリアを指定するか、/etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2> を使用して直接指定します。
  5. /etd showselection <level> を実行して、選択範囲が正しく見えるか確認します。
  6. /etd register <level> を実行して選択をクリアします。なお、現在のビルドでは registershowselection も実際にはフロア領域を永続化しません — levelLocations を保存するヘルパー(LevelsConfigFields#addLevelLocations)は定義されていますが、どのコマンドからも呼び出されません。ダウンロード済みパッケージで既に設定されていない場合は、現在 levelLocations をレベルYAMLに手動で書き込む必要があります。
  7. スタートスポーンタイルの上に立って /etd register <level> start を実行します。すべてのスタートタイルでこれを繰り返します(このコマンドは startLocation に永続化されます)。
  8. エンドタイルの上に立って /etd register <level> end を実行します。すべてのエンドタイルでこれを繰り返します(このコマンドは endLocation に永続化されます)。
  9. 再度リロードし、NPCメニューまたは /etd join <level> 経由でレベルに参加してテストします。

選択コマンドは以下の式を使用してグリッドマスを生成します:

size = abs(corner1 - corner2 + 1) / 3

トップブロックが空気(またはフロアブロックが通過可能)であるマスはスキップされるため、マスがプレイ可能として登録されるにはフロアブロックがソリッドである必要があります。

経路の検証

EternalTDはタワーが設置されるたびにA*経路探索チェックを実行します。タワーを設置することで、いずれかのスタートタイルからいずれかのエンドタイルへの歩行可能な経路がなくなる場合、設置は拒否されゴールドは消費されません。

Air属性の敵はタワーを完全に無視する別の経路を使用し、代わりに空中オフセット(設定された経路の4ブロック上)を辿ります。

NPCとレベルメニュー

plugins/EternalTD/npcs/ 内のNPC設定は、村人NPCを1つ以上のレベルにリンクします。NPCを右クリックすると、各レベルが緑色のステンドグラス板として表示される9スロットのインベントリが開き、レベル名と説明がラベルとして付きます。

フィールドデフォルト注記
isEnabledbooltrue無効化されたNPCはスキップされます
levelIDsstring list必須このNPCが提供するレベルのファイル名
locationstringnull標準の worldName,x,y,z,yaw,pitch 形式のスポーン位置
namestring"Default Name"NPCの表示名
difficultystring"Difficulty: Not Set"NPCの上に表示される難易度ラベル
disguisestringnullLibsDisguises記述子(例: custom:etd_tutorial_npc
customDisguiseDatastringnullLibsDisguisesの追加コマンドデータ — 通常は長いプレイヤースキン文字列

村人は無敵、AI無効、永続化、そしてEternalTDのNPC名前空間キーでタグ付けされた状態でスポーンされます。LibsDisguisesがインストールされており、disguisecustomDisguiseData の両方が設定されている場合、村人はスポーン時にディスガイズされます。

difficulty ラベルを持つ浮遊するアーマースタンドが、NPCの2.3ブロック上にスポーンされます。

スポーン動作

DefaultConfig は、ハブワールドでのプレイヤーの管理方法を制御します:

  • setupDone — 初回セットアップガイダンスが完了したかどうかを追跡するフラグ。
  • spawnLocations — デフォルトは etd_spawn,0,65,0,0,0etd_spawn ワールドが存在する場合にのみ使用されます。
  • manageSpawn — デフォルトは true。有効な場合、参加するプレイヤーはログインから1 tick後にスポーン位置にテレポートされます。
  • playerGuide — ゲーム内ガイドブックのテキスト。

manageSpawn が true でスポーンワールドがロードされている場合、サーバーに参加するすべてのプレイヤーは spawnLocations にテレポートされます。