跳至主要内容

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 加上註冊指令會為你計算並儲存它們。

世界生命週期

當玩家加入關卡時:

  1. EternalTD 根據 worldNameplugins/EternalTD/worlds/ 中查詢範本資料夾。
  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. plugins/EternalTD/levels/ 中建立或下載相符的關卡 YAML。
  3. 執行 /etd reload 並手動加入關卡世界(或在單人模式中開啟以進行設定)。
  4. 使用 /etd selectfloor 並右鍵/左鍵點擊兩個角來標記遊戲區域,或使用 /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* 尋路檢查。如果放置該塔會讓任何起始格子無法走到任何終點格子,則放置會被拒絕且不會花費金幣。

空中敵人使用單獨的路徑,該路徑完全忽略塔,而是遵循空中偏移(已設定路徑上方 4 格)。

NPC 和關卡選單

plugins/EternalTD/npcs/ 中的 NPC 設定將村民 NPC 連結到一個或多個關卡。右鍵點擊 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
customDisguiseDatastringnull額外的 LibsDisguises 指令資料 — 通常是長玩家面板字串

村民會以無敵、停用 AI、持久化並以 EternalTD 的 NPC 命名空間鍵標記的方式生成。如果安裝了 LibsDisguises 且 disguisecustomDisguiseData 都已設定,村民會在生成時被偽裝。

具有 difficulty 標籤的漂浮盔甲架會在 NPC 上方 2.3 格處生成。

重生點行為

DefaultConfig 控制玩家在大廳世界中的管理方式:

  • setupDone — 追蹤是否已完成首次設定指引的旗標。
  • spawnLocations — 預設為 etd_spawn,0,65,0,0,0。僅在 etd_spawn 世界存在時使用。
  • manageSpawn — 預設為 true。啟用時,加入的玩家會在登入後 1 刻被傳送到重生點位置。
  • playerGuide — 遊戲內指南書文字。

manageSpawn 為 true 且重生世界已載入時,每個加入伺服器的玩家都會被傳送到 spawnLocations