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 加上註冊指令會為你計算並儲存它們。
世界生命週期
當玩家加入關卡時:
- EternalTD 根據
worldName在plugins/EternalTD/worlds/中查詢範本資料夾。 - 它選擇下一個可用的數字後綴(
<worldName>_0、<worldName>_1、...),並將複製寫入伺服器的世界容器,首先清理任何過時的舊版或現代佈局複本。 - 複製的世界透過 MagmaCore 的
TemporaryWorldManager作為臨時 void 世界載入,因此 Paper 26.1+ 遷移被隔離。 - 玩家被傳送到新世界;內部的
InstanceProtector套用 EternalTD 的保護規則。
當工作階段結束時:
- 複製世界中的任何剩餘玩家都會被傳送回
config.yml中的重生點位置,或者如果沒有設定重生點則被踢出。 - 複製的世界會從磁碟卸載並刪除(
TemporaryWorldManager.permanentlyDeleteWorld)。
實例保護規則
當關卡活躍時,複製的世界會套用這些規則:
- 停用爆炸
- 停用液體流動
- 停用鞘翅
- 防止切換飛行
- 防止友軍傷害
- 防止原版怪物生成
地圖創作工作流程
目前的地圖創作流程使用遊戲內工具:
- 將範本世界資料夾放在
plugins/EternalTD/worlds/<worldName>/下。 - 在
plugins/EternalTD/levels/中建立或下載相符的關卡 YAML。 - 執行
/etd reload並手動加入關卡世界(或在單人模式中開啟以進行設定)。 - 使用
/etd selectfloor並右鍵/左鍵點擊兩個角來標記遊戲區域,或使用/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* 尋路檢查。如果放置該塔會讓任何起始格子無法走到任何終點格子,則放置會被拒絕且不會花費金幣。
空中敵人使用單獨的路徑,該路徑完全忽略塔,而是遵循空中偏移(已設定路徑上方 4 格)。
NPC 和關卡選單
plugins/EternalTD/npcs/ 中的 NPC 設定將村民 NPC 連結到一個或多個關卡。右鍵點擊 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 刻被傳送到重生點位置。playerGuide— 遊戲內指南書文字。
當 manageSpawn 為 true 且重生世界已載入時,每個加入伺服器的玩家都會被傳送到 spawnLocations。