什麼是模組化地下城?
模組化地下城是 BetterStructures 2.0.0 及後續版本的地下城系統。它把手工建造的小型模組動態組裝起來,而不是直接生成一張固定建築圖。模組可組成多層地下城,每次生成都有不同的配置。
模組化地下城的生成方式
-
模組 模組尺寸可以設定,常見尺寸為 16×16×16 方塊,部分內容包使用 32×16×32 或其他尺寸。利用邊界標籤和統一的連接位置,讓模組接合時不留空隙或重疊。生成器透過
moduleSizeXZ和moduleSizeY定義尺寸。模組可包含走廊、房間、樓梯及特殊戰鬥區域。 -
生成過程 在新區塊生成時,BetterStructures 使用波函數坍縮(WFC)演算法,依邊界標籤隨機選擇相容模組並組裝地下城。耗時取決於半徑、垂直範圍、模組池、限制條件及伺服器效能。配置計算以非同步方式執行;排入佇列的貼上作業共用每個伺服器 tick 所設定的時間預算。大型或不相容的配置仍可能消耗大量資源或無法完成組裝。
-
地下城大小 增加半徑可生成橫跨數百方塊的地下城。多數地下城有多個樓層,透過樓梯或垂直通道連接。上下連接使用
borders的up與down,相對兩面的標籤必須相符。
內容包與組合
內容目錄包含 Dungeoneering Modules Free 與 Dungeoneering Modules Premium。隨附的 dungeoneering 生成器列出兩個內容包的起始建築圖。目錄中還有 Tommyknockers Modules Free 與 Tommyknockers Modules Premium,這是由 EliteMobs Boss 把守的模組化礦坑;Premium 需要先安裝 Free 內容包。請安裝內容包指定的模組與相依項目,包括所需的 FreeMinecraftModels 內容。新增相容模組可增加配置選擇;單獨安裝建築圖不會安裝配套模型或怪物內容。
實體與容器標記
模組生成讀取告示牌正面文字,並捨棄空行。請在第一行填寫小寫標記,參數緊接在下方。除了 [elitemobs] 以外,標記比對區分大小寫。模組貼上會移除所有告示牌方塊,包括裝飾告示牌及不支援的標記。
| 告示牌標籤 | 額外行 | 行為 |
|---|---|---|
[spawn] | 第 2 行填寫 Bukkit 實體類型 | 以告示牌所在方塊為中心,生成持續存在的原版實體。專用模組世界也會記錄此位置,供整合作為出生標記。 |
[chest] | 無 | 放置箱子,並以模組生成器的 treasureFile 填入物品。 |
[trapped_chest] | 無 | 放置陷阱箱,並以模組生成器的 treasureFile 填入物品。 |
[pool: poolname] | 無 | 從 EliteMobs 生成池選出一個 Boss,並以告示牌所在方塊為中心生成。在現有地形中,該 Boss 是一次性的 EliteMobs 區域 Boss。在專用模組世界中,一般 Boss 與實例 Boss 的處理方式請見生成池一節。 |
[elitemobs] | 之後各行填寫 EliteMobs Boss 檔名,各行直接相連不加分隔符 | 僅適用於貼到現有地形的模組(isWorldGeneration: false):以告示牌所在方塊為中心,生成一次性的 EliteMobs 區域 Boss。專用模組世界會忽略此標記。 |
[barrel] | 無 | 在專用世界記錄木桶位置,由整合呼叫 spawnBarrels() 放置。標記本身不會放置木桶或填入物品。 |
[exit] | 第 2、3 行填寫上、下元件名稱,不含 .schem | 在專用世界記錄出口。整合必須放置 components/ 內的元件。任一參數行缺漏時,兩個名稱都改用 genericelevator_up 和 genericelevator_down。 |
[barrel] 與 [exit] 標記只在 isWorldGeneration: true 時處理。將地下城貼到現有地形時,請用 isWorldGeneration: false;[spawn]、[chest]、[trapped_chest]、[pool: poolname] 與 [elitemobs] 在此模式下都能運作。現有地形中的 Boss 告示牌需要啟用 EliteMobs;若未啟用,BetterStructures 會為每座地下城記錄一則警告,且不會生成任何 Boss。模組不會建立 WorldGuard 競技場保護。一般戰利品木桶應使用實際木桶方塊,並依下文設定戰利品。
生成池
[pool: poolname] 告示牌讀取 spawn_pools/ 中的設定檔。各 YAML 檔案支援以下欄位:
| 欄位 | 預設值 | 說明 |
|---|---|---|
isEnabled | — | 不會讀取。生成池沒有啟用開關。 |
poolStrings | [] | 可供選擇的 EliteMobs Boss 檔名清單。 |
minLevel | -1 | 會儲存,但不會讀取。 |
maxLevel | -1 | 此生成池的實例 Boss 所使用的等級。請明確填入有效等級。 |
處理器需要 EliteMobs,並從 poolStrings 隨機選擇一個 Boss 檔名。它會在 .yml 前加入生成器的 spawnPoolSuffix;例如 _hard 會選擇 poolname_hard.yml。沒有 spawnPoolSuffix 的生成器會查找 poolname.yml。池名末尾不要留空格。若生成池檔案不存在、poolStrings 清單為空,或 Boss 檔名不是 EliteMobs 認得的檔案,會記錄一則警告,該告示牌不會生成任何東西。
在專用模組世界中,非實例 Boss 會在貼上期間生成。實例 Boss 則排入佇列,等待整合呼叫 spawnInstancedEntities()。每個實例 Boss 都以生成池的 maxLevel 生成,並依其與地下城起點的距離選擇 EliteMobs 實例難度 ID。距離取 X 與 Z 偏移中較大者,並與地下城寬度 (2 × radius − 1) × moduleSizeXZ 比較:小於寬度六分之一為 2,小於三分之一為 1,更遠則為 0。useGradientLevels 不影響此計算。
模型與怪物整合
模組貼上與一般結構貼上使用不同的告示牌處理器。如上表所列,模組貼上只在現有地形中處理 [elitemobs] 告示牌。建立結構中的 [mythicmobs] 和 [custom] 告示牌不會由模組貼上處理。請使用上述支援的標記,並遵循內容包的相依項目說明。
建築圖本身無法重建由其他外掛管理的任意模型實體。請安裝內容包所需的模型與配套外掛,不要依賴缺少的 Boss 自動變成裝飾模型。
模組尺寸
模組尺寸可以設定,並非固定值。
生成器使用以下選項:
moduleSizeXZ:寬度與深度,以方塊為單位;請依建築圖明確填寫。moduleSizeY:高度,以方塊為單位;請依建築圖明確填寫。
常見尺寸: 16×16×16 方塊,仍須明確設定。 其他常見尺寸: 部分內容包使用 32×16×32 方塊。
模組創作者應:
- 查看生成器的
moduleSizeXZ與moduleSizeY。 - 將該生成器的所有模組建成完全相同的尺寸。
- 核對建築圖的實際尺寸與連接點;生成器不會代為驗證幾何形狀。
自訂尺寸範例:
在生成器設定中填寫:
moduleSizeXZ: 32 # Width and depth
moduleSizeY: 16 # Height
同一生成器中的模組必須維持相同尺寸。不要在同一個地下城系統中混用 16×16×16 和 32×16×32 模組。
模組生成器設定欄位
除了 moduleSizeXZ 與 moduleSizeY,生成器也提供下列設定:
| 欄位 | 預設值 | 說明 |
|---|---|---|
isEnabled | true | 允許自然選取。手動指令不檢查此開關。 |
radius | 明確填寫 | 以模組網格單元為單位的半徑,水平單元尺寸為 moduleSizeXZ。最外層單元保留作為邊界。 |
edges | false | 已儲存,但目前生成器不讀取。邊緣放置使用 world_border 標籤。 |
startModule | — | 起始 .schem 檔名清單。隨機選一個,以旋轉 0 放在網格 (0, 0, 0)。 |
minChunkY | 0 | 模組網格的最小垂直索引,包含此值,不是世界方塊 Y 座標。 |
maxChunkY | 0 | 模組網格的最大垂直索引,包含此值。範圍必須包含第 0 層。 |
moduleSizeXZ | 明確填寫 | 模組寬度與深度,以方塊為單位。 |
moduleSizeY | 明確填寫 | 模組高度,以方塊為單位。 |
debug | false | 在目標世界繪製診斷方塊及文字。僅限在可捨棄的生成區域使用。 |
useGradientLevels | false | 已儲存,但目前的生成池等級計算不讀取。 |
spawnPoolSuffix | — | 加到生成池名稱的後綴。不需要時可省略或設為 ""。 |
isWorldGeneration | false | true 建立專用虛空世界;false 貼到現有世界。 |
treasureFile | — | 地下城箱子的戰利品設定檔。 |
generateLootInBarrels | true | 是否填入模組內的木桶。 |
barrelTreasureFilename | treasure_barrel_food.yml | 地下城木桶的戰利品設定檔。 |
validWorlds | 空,所有世界 | 允許自然生成的世界名稱清單。 |
validWorldEnvironments | 空,所有環境 | 允許的環境清單:NORMAL、NETHER、THE_END、CUSTOM。隨附的 dungeoneering 生成器明確使用 [NORMAL, CUSTOM],因此初始只在主世界類型的世界生成。省略此鍵的行為見下文。 |
centerModuleAltitude | 0 | 在現有地形自然生成時的起始 Y 座標。第 0 層向上偏移 moduleSizeY 的一半。在現有世界手動放置時從玩家位置開始;專用世界從 (0, 0, 0) 開始。 |
缺漏鍵使用生成器定義的目前欄位值。預設生成器會依自身內容初始化。手寫生成器的 radius、moduleSizeXZ 與 moduleSizeY 從 0 開始,這些零也可能被寫入檔案。不要假設缺少尺寸就會使用 16。省略 validWorlds 或 validWorldEnvironments 不施加限制,因此不會限定為 NORMAL/CUSTOM。請以完整可用的生成器為基礎,明確設定半徑、尺寸、起始模組與世界限制。
個別模組設定欄位
各模組可設定以下欄位:
| 欄位 | 預設值 | 說明 |
|---|---|---|
isEnabled | true | 是否啟用模組。 |
weight | 100 | 生成時的選取權重。負值或非有限數值會記錄一則警告並變為 0,使該模組不會被選取。 |
repetitionPenalty | 0 | 每有一個已選的相鄰模組使用相同建築圖檔名,就把此值加到權重。正值鼓勵重複,負值減少重複。請保持最終權重為正。 |
noRepeat | false | 排除與相同設定識別的已選模組相鄰的候選,包含複製模組。不保證整座地下城只出現一次。 |
enforceVerticalRotation | false | 上下相鄰的任一模組啟用時,要求兩者的 Y 軸旋轉相同。 |
enforceHorizontalRotation | false | 水平相鄰的任一模組啟用時,要求兩者的 Y 軸旋轉相同。 |
minY | -4 | 選取候選時允許的最低模組網格層,包含邊界值。 |
maxY | 20 | 選取候選時允許的最高模組網格層,包含邊界值。 |
biome | default | 已儲存,但不限制模組選取。 |
minecraftBiome | null | 已儲存,但不限制模組選取。 |
treasureFile | — | 會載入設定,但目前模組貼上的標記箱子使用生成器的 treasureFile。 |
generateLootInBarrels | true | 是否填入此模組的木桶。 |
barrelTreasureFilename | treasure_barrel_food.yml | 此模組木桶的戰利品設定檔。 |
borders | — | 定義連接相容性的邊界標籤對應。 |
cloneConfig | — | 從另一份模組設定檔讀取複製設定。 |
compoundModule | — | 已儲存,但目前生成器不使用它組裝複合模組。 |
isAutomaticallyPlaced | true | 允許一般候選選取。設定中的起始模組會略過此篩選。 |
必須定義 borders 的六個項目:north、south、east、west、up 和 down,每項包含標籤清單。一般標籤區分大小寫,必須完全相符。例如 corridor 對應 corridor;no-mirror_corridor 可連接 corridor,但不能連接另一個 no-mirror_corridor。每個模組提供 0、90、180、270 度四種 Y 軸旋轉。
nothing 允許空鄰居。world_border 表示水平可放置區域最外圈的模組;所有朝外的面都只能包含 world_border 標籤。封閉的上、下邊界使用 nothing。半徑 5 最多容納 9 × 9 個水平模組單元,周圍邊界留空。這些規則用來篩選一般候選;起始模組直接放置,因此其設定和形狀必須適合原點。
cloneConfig 指向另一個模組的 .yml 檔名,複製設定會從該檔案讀取。目標存在時,BetterStructures 會從本模組的磁碟檔案中刪除多餘鍵:treasureFile、barrelTreasureFilename、generateLootInBarrels、borders、minY、maxY、weight、repetitionPenalty、兩個旋轉開關、noRepeat、六個 *IsPassable 鍵與 isAutomaticallyPlaced。isEnabled、biome、minecraftBiome、cloneConfig 和 compoundModule 留在檔案內。執行時的複合模組查詢也遵循複製目標。目標檔案不存在時,會發出警告並忽略複製,保留本模組的值。
產生的設定還會包含 northIsPassable、southIsPassable、eastIsPassable、westIsPassable、upIsPassable 和 downIsPassable。它們預設為 true,但生成器不讀取,修改沒有作用。請使用 borders。
不要讓 cloneConfig 形成循環。像 a.yml -> b.yml -> a.yml 這樣的循環會讓模組載入停止,並顯示列出該鏈結的「Cyclic module clone configuration」錯誤。
使用 /bs generateModules 手動生成地下城
/bs generateModules <ModuleGeneratorsConfigFile.yml> 可依需求執行,不必等待自然生成。Tab 補全會列出所有已載入的模組生成器檔案。
結果取決於 isWorldGeneration:
isWorldGeneration: true:建立新世界。名稱是生成器檔名加上_0、_1、_2…,選擇資料夾尚不存在的第一個名稱。它是NORMAL環境的虛空世界,出生區塊不常駐記憶體,自動存檔關閉。指令會將玩家切換為旁觀者,但不會傳送到新世界。isWorldGeneration: false:在玩家目前所在的世界生成。
Boss 血條顯示配置組裝進度,貼上作業排入佇列後就會消失。組裝完成訊息不代表方塊或實體已貼上完畢。若沒有安裝任何已設定的起始建築圖,生成會停止;停用的起始模組也可能因容器無法使用而導致取消。
指令需要擁有 betterstructures.generatemodules 的玩家,內容重新載入期間會拒絕執行。手動生成略過自然放置檢查,包括生成器啟用狀態、世界限制與占地保護。請謹慎選擇目標位置。
模組檔案存放位置
模組放在 plugins/BetterStructures/modules。此目錄會遞迴掃描,內容包可把 .schem 放在子目錄,對應的 .yml 會在旁邊產生。
建築圖檔名必須在整個 modules 目錄樹中唯一。同名或無法讀取的檔案會中止模組載入。建築圖在 isEnabled 檢查前就會讀取,因此停用模組無法略過損壞的檔案。isEnabled: false 的內容套件資料夾會被完全略過,因此其中的模組既不會讀取也不會載入。
自然放置與保護
自然生成檢查完整的設定占地。如果與世界座標 (0, 0) 周圍設定的保護半徑、具名 WorldGuard 區域,或最近未被觀察為新區塊的已生成區塊重疊,就略過放置。貼上作業排入佇列前會再次檢查 WorldGuard;原本未生成的區塊若已在這段期間生成,也會拒絕執行。這檢查的是區塊狀態,不是掃描玩家建造的方塊或其他領地保護外掛。在舊基地旁生成一個新區塊,不會讓整個占地都符合條件。
自然選取的生成器應維持 isWorldGeneration: false。自然選取器不排除 true;此設定仍會建立獨立世界,而不是貼到已檢查的地形。
方塊、方塊實體、戰利品、實體和標記共用貼上的時間預算。WorldGenerationFinishEvent 在專用世界貼上及即時後處理成功後觸發,不表示整合已放置出口或生成佇列中的實例 Boss。大型建築在配置計算後仍可能需要數個 tick。
模組戰利品優先順序
標記箱子和陷阱箱使用生成器的 treasureFile。實際木桶方塊要求生成器與模組都允許 generateLootInBarrels。模組非空的 barrelTreasureFilename 優先於生成器;產生的模組檔案預設使用 treasure_barrel_food.yml。箱子與木桶套用物品欄快照前,都會觸發可取消的 ChestFillEvent。
產生箱子戰利品請使用標記。目前模組貼上不保留建築圖內一般箱子、陷阱箱及木桶的物品欄。屏障方塊會略過;基岩標記只在目標方塊不是固體時變成石頭。空氣會在現有世界挖出內部空間,在專用虛空世界則會略過。
模組中儲存的實體,例如盔甲座、畫和物品展示框,會隨模組一起貼上。畫和物品展示框會隨模組的旋轉而轉向,以保持掛在牆上。