跳到主要内容

副本打包器

webapp_banner.jpg

什么是副本?​

关于副本的信息,包括预制副本的信息,可以在这里找到。


什么是副本打包器?

包格式可用于分发副本、事件、模型、竞技场、NPC、物品等 EliteMobs 内容。导出命令只收集导入器支持的部分文件夹。分发前,请手动补齐其余所需文件。

为什么要使用副本包?
  • 实例化副本! 实例化副本只能通过副本包系统创建。
  • 迷你副本的安全备份! 制作副本包之后,你可以随时出于任何理由,在任意服务器上部署和重新部署它。
  • 轻松开关! 你随时可以执行 /em setup,临时或永久地开启和关闭副本包。
  • 便于分享! 如果你想分享自己的作品,只需把副本包打成 zip 发给别人即可。如果你有兴趣,Discord 上还有一个专门用于社区创作的频道!
  • 传送点! 已安装的战斗内容包在设置 listedInTeleports: true 后会显示在 /em 的传送页面中,附魔挑战除外。传送坐标需要自行配置,菜单不会自动生成坐标。

创建副本

以下设置用于创建一个配置文件,该文件应放入 content_packages 文件夹。这些设置专门用于创建副本;如果你只是想用副本打包器分发非副本内容(例如物品包或事件包),则不需要它们。

所需插件​

无。副本保护由 EliteMobs 自身处理:设置 protect: true 会把 EliteMobs 自带的按世界保护套件应用到该内容包的世界上,完全不需要区域插件。

WorldGuard 仍然是一个可选的软依赖。安装它之后,EliteMobs 专用的区域标记就会可用,但保护副本包并不需要它。

逐步创建副本​

EliteMobs 过去有两大类副本:基于世界的和基于示意图的。

基于示意图的副本与一份示意图建筑相关联。它们现已被淘汰,不再受支持。

现在所有 EliteMobs 副本都是基于世界的。

必需的 pack.meta 文件​

你的副本包应当包含一个 pack.meta 文件,它其实就是把 .txt 文件改名为 .meta 扩展名。该文件只需包含一个单词,指明这个包是给哪个插件用的(例如小写的 "elitemobs")。pack.meta 文件必须位于包的根目录中,与其它所有文件夹并列。


全局值​

以下值适用于所有副本

isEnabled​

设置是否启用该副本包。

键值默认值必填
isEnabled布尔值true✅
示例
isEnabled: true

name​

设置内容名称,支持颜色代码。

键值默认值必填
name字符串无✅
示例
name: '&c[lvl 999] &aThe Green Dungeon'

create_packager_name.jpg


contentType​

设置副本的类型。

键值默认值必填
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGE无✅
示例
contentType: INSTANCED_DUNGEON
SCHEMATIC_DUNGEON 已废弃

解析器仍然接受 SCHEMATIC_DUNGEON,但示意图副本已在 EliteMobs 9.0 中被移除,并由世界副本取代。使用它的内容包不会加载任何内容,只会在控制台打印一条警告,提示你删除该条目。如果你想要示意图那样的体验,请改用 BetterStructures 搭配 elite shrines 内容包。


customInfo​

为兼容旧配置而保留的信息字段,仍会读取、保存和翻译。当前 /em setup 菜单使用 setupMenuDescription,修改 customInfo 不会改变菜单描述。

键值默认值必填
customInfo字符串列表无✅
示例
customInfo:
- '&aThe best dungeon.'
- '&aMade by: CoolPlayer'

create_packager_custominfo.jpg


setupMenuDescription​

设置此包在 /em setup 菜单中的描述,支持颜色代码。

键值默认值必填
setupMenuDescription字符串列表无❌
示例
setupMenuDescription:
- '&2A cool dungeon for levels 10-20!'
- '&2Features 3 bosses and custom loot!'

设置内容尚未下载且没有 Nightbreak 包标识时,/em setup 显示的手动下载链接。仅设置此字段不会为自定义包启用 Nightbreak 自动下载或更新。

键值默认值必填
downloadLink字符串空字符串❌
示例
downloadLink: http://www.example.org

create_packager_downloadlink.jpg


dungeonSizeCategory​

设置包的规模标签。是否实例化由 contentType 决定,此分类不会改变运行方式。

键值默认值必填
dungeonSizeCategory特殊 [1]LAIR❌
示例
dungeonSizeCategory: MINIDUNGEON

create_packager_size.jpg

特殊 [1]

展开表格
键描述
LAIR巢穴是一类小型副本,围绕一场大型 Boss 战展开。
SANCTUM圣所相当于实例化版的巢穴。也就是说,它们同样围绕一场大型 Boss 战展开。
MINIDUNGEON迷你副本是一类中等规模的副本,通常包含 3-15 个小 Boss 和一个大 Boss,以及大量供玩家“刷”金币和装备的“杂兵”怪物。
DUNGEON副本相当于实例化版的迷你副本。这是最传统的 MMORPG 式副本,玩家组队穿过一连串杂兵和小 Boss,最终挑战终极 Boss。
RAID可识别的规模标签,不会启用独立的团队副本系统或内容类型。
ADVENTURE冒险是完整的冒险地图。它们包含任务线、NPC、大量小 Boss 和 Boss,甚至可以在内部包含自己的竞技场或副本。
ARENA竞技场是基于波次的生存区域,玩家击败波次即可获得奖励。
OTHER任何不属于上述类别的内容。
REALM内容丰富的大型世界标签。世界是共享还是实例化由 contentType 决定。

更详细的说明请参见副本


protect​

设置 EliteMobs 是否将世界注册到 MagmaCore 保护系统。它阻止玩家破坏和放置方块、燃烧、点燃、大部分方块消退、树叶消失、骨粉、倒空桶、编辑告示牌、访问受支持的容器(已注册的宝藏箱除外)、开启门和活板门及栅栏门、与龙蛋或花盆交互、修改物品展示框和盔甲架、实体修改方块,以及原因不是 CUSTOM 的生物生成。霜冰仍可融化。玩家投掷的盘丝喷溅药水和滞留药水也会被阻止。allowExplosionBlockDamage、allowLiquidFlow 和 allowElytra 分别控制对应保护。副本全局设置控制友军伤害和环境伤害倍率。当 CombatTag.yml 中设置了 preventFlyToggleInDungeons: true(默认值)时,保护系统还会阻止非管理员(OP)玩家开始飞行。管理员可用 /em protection bypass 绕过支持该豁免的玩家操作限制。

protect: false 时不注册这套保护,但世界仍由 EliteMobs 管理。副本归属、实例生命周期、战斗系统及其他副本功能仍然有效。关闭保护不会把副本变成普通生存世界。

键值默认值必填
protect布尔值true❌
示例
protect: true

dungeonVersion​

设置包版本。每次更新都应增加随包分发的配置中的版本值。Nightbreak 对符合条件的已安装包比较此值;/em package 的版本参数不会写入它。

键值默认值必填
dungeonVersion整数0❌
示例
dungeonVersion: 1

playerInfo​

设置书本、物品栏和对话框传送菜单中的描述,支持颜色代码及 $bossCount、$lowestTier、$highestTier 占位符。内容包必须符合菜单条件,且设置了 listedInTeleports: true。

键值默认值必填
playerInfo字符串无❌
示例
playerInfo: 'Difficulty: &a1-man easy content!'

create_packager_playerinfo.jpg


regionEnterMessage​

保留的旧入场消息字段,仍会读取、保存和翻译。当前入场监听器不读取它,因此设置此值不会发送消息。

键值默认值必填
regionEnterMessage字符串无❌
示例
regionEnterMessage: '&aYou have entered the dungeon!'

create_packager_enter.jpg


regionLeaveMessage​

保留的旧离场消息字段,仍会读取、保存和翻译。当前离场监听器不读取它,因此设置此值不会发送消息。

键值默认值必填
regionLeaveMessage字符串无❌
示例
regionLeaveMessage: '&aYou have left the dungeon!'

create_packager_leave.jpg


hasCustomModels​

标记该副本包附带自定义模型(用于 ModelEngine 或 FreeMinecraftModels)。这个键会被读取和写入,但 EliteMobs 目前不会据此做任何事——模型的安装完全取决于包中是否存在 models 文件夹。请把它当作一个文档性标记。

键值默认值必填
hasCustomModels布尔值false❌
示例
hasCustomModels: false

dungeonConfigFolderName​

设置存放与该副本相关文件的文件夹名称。

实例化副本必填!

键值默认值必填
dungeonConfigFolderName字符串无❌
示例
dungeonConfigFolderName: my_dungeon_folder

anchorPoint​

schematic 时代用于相对坐标的基准点。包解析器仍会读取 anchorPoint 和 calculatedRotation,但当前没有任何命令或功能使用它们。以锚点为基准进行测量的 /em relativecoords 命令已在 EliteMobs 9.0.5 中移除。请改用 Boss、宝箱和 NPC 各自文件中的位置来定位它们。

键值默认值必填
anchorPoint位置无❌
calculatedRotation整数(度)0❌
示例
anchorPoint: my_dungeon_world,100,64,100,0,0
calculatedRotation: 0

contentLevel​

设置该副本在 EM 菜单中显示的内容等级。

键值默认值必填
contentLevel整数0❌
示例
contentLevel: 20

enchantmentChallenge​

将包标记为单人附魔挑战。它会注册到独立列表,不出现在普通传送菜单中。需要有效的实例配置、世界模板、起点和可完成的目标。

键值默认值必填
enchantmentChallenge布尔值false❌
示例
enchantmentChallenge: false

song​

设置该副本是否拥有背景音乐。

键值默认值必填
song字符串无❌

name= 客户端应播放的声音 ID,例如 elitemobs:dark_cathedral.ambient,不是音频文件路径。 length= 背景音乐的长度,单位为毫秒。EliteMobs 会在内部把它换算成 tick,因此它必须是该音效的真实时长,否则音轨会提前或延后重新开始。

两部分用空格分隔。单首音轨会循环播放。用 -> 指定两首时,第一首播放一次,再循环播放第二首;两首都使用 name=/length=。客户端资源包必须已经包含该声音,此设置不会分发资源包。

示例
song: name=elitemobs:dark_cathedral.ambient length=93830

双音轨写法:

song: name=elitemobs:intro length=12000->name=elitemobs:dark_cathedral.ambient length=93830

dungeonLockoutMinutes​

按实例 Boss 设置玩家及相关队员的奖励锁定时间,单位为分钟。它不会阻止进入副本。默认值为 4320,即 72 小时;0 禁用此包的奖励锁定。锁定期间,相关玩家也不会从该 Boss 获得技能 XP。

键值默认值必填
dungeonLockoutMinutes整数4320❌
示例
dungeonLockoutMinutes: 1440

containedPackages​

设置一个元包所包含的副本包列表。当 contentType 被设为 META_PACKAGE 时,用它来列出属于这个更大副本的所有子包。

键值默认值必填
containedPackages字符串列表无❌
示例
containedPackages:
- my_dungeon_adventure.yml
- my_dungeon_sanctum.yml
- my_dungeon_boss_fight.yml

customItemFilenames​

设置物品包的文件列表。只要列表非 null,即使为空,也会将 contentType 设为 ITEMS_PACKAGE。随后检查事件和模型列表,它们可能覆盖此类型。请只设置适合该包的列表。

键值默认值必填
customItemFilenames字符串列表无❌
示例
customItemFilenames:
- my_custom_sword.yml
- my_custom_armor.yml

customEventFilenames​

设置事件包的文件列表。非 null 列表即使为空,也会在物品检查之后将 contentType 设为 EVENTS_PACKAGE。模型列表仍可能覆盖此类型。

键值默认值必填
customEventFilenames字符串列表无❌
示例
customEventFilenames:
- my_custom_event.yml

modelNames​

设置模型包的模型名称列表。非 null 列表即使为空,也会在物品和事件检查之后将 contentType 设为 MODELS_PACKAGE。

键值默认值必填
modelNames字符串列表无❌
示例
modelNames:
- my_custom_model

保留的旧示意图字段​

relativeBossLocations、relativeTreasureChestLocations、schematicName、defaultSchematicRotation、corner1 和 corner2 仍保留在解析器中以读取旧文件。当前共享或实例化世界包不使用它们放置内容。请使用 Boss 和宝箱定义中的位置以及世界模板。anchorPoint 和 calculatedRotation 也以同样的方式保留;参见 anchorPoint。

可翻译的键​

上述值中有六项会在内容包加载时注册到翻译系统:name、customInfo、playerInfo、regionEnterMessage、regionLeaveMessage,以及 difficulties 中每个条目的 name。在使用非英语语言的服务器上,这些内容会到对应语言的 CSV 中查找,而你写在 YAML 里的文本就是英文列的比对基准。如果你希望自己的内容包可被翻译,请用英文书写它们。


基于世界的副本包​

以下值仅适用于基于世界的副本。


worldName​

设置需要被打包的世界名称。

键值默认值必填
worldName字符串无✅
示例
worldName: my_minecraft_world

wormholeWorldName​

指定一个副世界,包会使用与主世界相同的环境和保护设置加载它。世界间的路线需另外制作;设置名称不会创建传送门。

键值默认值必填
wormholeWorldName字符串无❌
示例
wormholeWorldName: my_minecraft_world_wormhole

environment​

设置世界的环境类型。

键值默认值必填
environment环境NORMAL❌
示例
environment: NORMAL

teleportLocation​

设置共享副本的入口或实例的等候位置。实例中会将该位置的世界替换为复制出的世界。若未设置等候位置,则使用起点。格式为 world,x,y,z,yaw,pitch。

键值默认值必填
teleportLocation字符串无✅
示例
teleportLocation: my_minecraft_world,-1.5,68,0.5,0.0,0.0

allowExplosionBlockDamage​

允许或阻止受保护副本世界中的爆炸方块破坏。启用后不会把原版爆炸变成精英爆炸。开启 doExplosionRegen 时,EliteMobs 恢复其追踪的精英爆炸:一分钟后开始,每 tick 恢复一个已记录方块,因此总时长取决于破坏范围。其他爆炸可能留下永久损坏。

键值默认值必填
allowExplosionBlockDamage布尔值false❌
示例
allowExplosionBlockDamage: true

allowLiquidFlow​

设置启用世界保护时是否允许水和岩浆流动。此值不会允许倒空桶,该操作由另一项保护控制。

键值默认值必填
allowLiquidFlow布尔值true❌
示例
allowLiquidFlow: false

allowElytra​

设置受保护的包世界中是否允许鞘翅滑翔。false 会阻止开始滑翔,并在进入世界或移动时停止滑翔,不是每 tick 运行的定时检查。启用保护绕过的管理员不受此限制。

键值默认值必填
allowElytra布尔值false❌
示例
allowElytra: true

listedInTeleports​

设置已安装的战斗包是否出现在 /em 的传送菜单中。false 仅隐藏该入口,不阻止其他路线或命令访问。附魔挑战不论此值如何都不会显示。

键值默认值必填
listedInTeleports布尔值true❌
示例
listedInTeleports: false

teleportLocationOffset​

为副本包的传送位置设置一个偏移量。

该键会被解析但目前未被使用 —— EliteMobs 中没有任何地方读取得到的偏移量,因此设置它不会影响玩家的落点。请改为直接调整 teleportLocation 本身。

键值默认值必填
teleportLocationOffset字符串无❌
示例
teleportLocationOffset: my_minecraft_world,0.5,2,0.5,0.0,0.0

实例化副本​

实例化副本会在每次有一队玩家想要通关副本时创建一个新世界,并在结束后删除它。要让它正常工作,你必须在 EliteMobs 的 world_blueprints 配置文件夹中放置一个以 dungeonConfigFolderName 命名的文件夹。

将导出的单个维度放到 world_blueprints/<dungeonConfigFolderName>/<worldName>/。验证器要求恰好一个包含 .mca 区域文件的地形位置,可位于根目录或匹配的旧式 DIM-1/DIM1 子目录。支持完整旧世界、仅地形导出和现代维度导出,并非每种格式都必须有 level.dat。服务器级 dimensions 容器、混合结构、链接和非普通文件会被拒绝。现代维度导出需要使用现代存储格式的服务器。

请在已卸载的导出副本上操作,保留该维度的地形、实体、兴趣点和数据。克隆会跳过 uid.dat、session.lock 和 Paper 的维度身份元数据,不修改原模板。实例世界使用 <worldName>_<number> 命名模式。启动时会保留崩溃后的残留世界;实例生命周期只清理自身创建的世界。手动删除残留世界前,请确认其来源,并确认没有活动实例正在使用它。

以下值仅适用于实例化副本。请注意,所有实例化副本同时也是世界副本,因此它们也会使用世界副本的那些值。


startLocation​

设置实例化副本起点的传送位置。玩家使用 /em start 开始实例化副本时会被传送到这里。没有有效 startLocation 的实例化或动态包不会加载。

键值默认值必填
startLocation字符串无✅
示例
startLocation: my_minecraft_world,10.5,70,10.5,0.0,0.0

permission​

设置进入该副本实例所需的权限。

键值默认值必填
permission字符串无❌
示例
permission: elitedungeon.mypermission

minPlayerCount​

设置开启副本所需的最少玩家人数。

键值默认值必填
minPlayerCount整数1❌
示例
minPlayerCount: 1

maxPlayerCount​

设置副本中允许的最大玩家人数。

键值默认值必填
maxPlayerCount整数5❌
示例
maxPlayerCount: 5

dungeonObjectives​

设置副本被视为完成所需达成的副本目标列表。

键值默认值必填
dungeonObjectives字符串列表无✅
示例

使用击杀目标 filename=boss.yml:amount=X。amount 默认为 1。它只统计本实例内匹配的实例 Boss 死亡,多阶段 Boss 也会匹配其原始第一阶段文件名。所有注册目标都必须在副本进行中完成。

dungeonObjectives:
- filename=dungeon_final_boss.yml
- filename=dungeon_miniboss_one.yml
- filename=dungeon_miniboss_two.yml
dungeonObjectives:
- filename=dungeon_guard.yml:amount=5

不带 filename= 前缀的裸写法 boss.yml 仍然被接受,并会被静默视为 filename=boss.yml,因此旧的内容包依然可用。新内容包应使用显式写法。

文件名必须以 .yml 结尾,amount 必须是至少为 1 的整数。每个字段只能出现一次。未知字段、缺少文件名或无效的数量都会导致内容包无法加载,控制台错误会指出对应的文件和目标。

不支持百分比目标

不支持百分比目标,它们会在加载副本定义时被拒绝。请使用明确的击杀目标,例如 filename=boss.yml:amount=2。无效的必需目标会导致整个定义被拒绝;它绝不会被静默地从通关要求中省略。


difficulties​

设置实例化副本中的难度列表。

实例化副本必填!

键值默认值必填
difficulties特殊 [1]无❌
示例
difficulties:
- levelSync: 25
id: 0
name: normal
- levelSync: 20
id: 1
name: hard
- levelSync: 15
id: 2
name: mythic

create_packager_difficulty.jpg

特殊 [1]

展开表格

设置实例化副本的难度会在进入副本时自动创建不同的难度选项。

用 id 匹配 Boss 能力和战利品的难度过滤条件。name 是可翻译的玩家可见名称。建议为 Normal、Hard、Mythic 显式设置 ID 0、1、2。如果内容包使用 Easy/Medium/Hard 这一组名称,解析器也会将它们识别为这三个级别;未知 ID 保留精确匹配。省略 id 时,系统会在翻译前根据原始名称推断它。

难度采用列表格式,包含以下字段:

键描述值必填
name向玩家展示的难度名称。字符串✅
id难度的 ID,用于自定义 Boss 和自定义物品中基于难度的功能。字符串❌
levelSync限制玩家物品缓存路径中的物品等级。它不会改写装备,也不会限制所有伤害和防御计算。绝对等级(25)或相对于 contentLevel 的带引号值('+5'、'-3')❌

相对等级同步: 以 + 或 - 开头的 levelSync 会与 contentLevel 相加,结果至少为 1。例如 contentLevel: 40 配合 levelSync: '-5' 会把缓存物品等级上限设为 35。请给相对值加引号:YAML 会去掉未加引号的 +5 的加号,使它变成绝对等级 5。动态副本以所选等级计算相对值。无效值会将同步设为 0 以禁用它,并记录警告。

目前近战攻击、护甲防御和投射物武器计算可能读取原始物品等级,装备附魔的效果也不受此设置限制。依赖等级同步来平衡战斗之前,请阅读实例化副本难度。

动态副本​

动态副本是实例化副本的扩展,内容按玩家选择的等级缩放。等级菜单以玩家当前战斗等级为基准,从 5 级和战斗等级减 5 两者中的较大值开始,每次增加 5 级,直到战斗等级加 5,最高 200 级。这些选项不需要通过公会等级解锁。

为动态副本设计 Boss 时,使用 level: dynamic。所选等级适用于实例中的 EliteMobs Boss,并非所有原版实体或奖励。需要按奖励等级缩放的自定义物品应使用 scalability: scalable,同时检查具体战利品路径;加权 Boss 战利品和明确指定的固定奖励可能保留配置的等级。

动态副本需要以下这些值。
由于所有动态副本同时也是实例化副本,它们还会使用实例化副本的全部值和设置。


contentType​

设置副本的类型。这里必须设为 DYNAMIC_DUNGEON。

键值默认值必填
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGE无✅
示例
contentType: DYNAMIC_DUNGEON

contentLevel​

预制动态副本会将此项设为 -1。动态副本并不使用该值:contentType: DYNAMIC_DUNGEON 使内容包成为动态副本,其 $lowestTier 和 $highestTier 占位符显示 5 和 200,而相对的 levelSync 值使用玩家所选的等级。

键值默认值必填
contentLevel整数0❌
示例
contentLevel: -1

difficulties​

设置动态副本中可用的难度列表及等级同步。

实例化副本必填!

键值默认值必填
difficulties特殊 [1]无✅
示例
difficulties:
- levelSync: '+5'
name: normal
id: 0
- levelSync: '+0'
name: hard
id: 1
- levelSync: '-5'
name: mythic
id: 2

create_packager_difficulty.jpg

特殊 [1]

展开表格

设置实例化副本的难度会在进入副本时自动创建不同的难度选项。

用 id 匹配 Boss 能力和战利品的难度过滤条件。name 是可翻译的玩家可见名称。建议为 Normal、Hard、Mythic 显式设置 ID 0、1、2。如果内容包使用 Easy/Medium/Hard 这一组名称,解析器也会将它们识别为这三个级别;未知 ID 保留精确匹配。省略 id 时,系统会在翻译前根据原始名称推断它。

带引号且带正负号的 levelSync 值用于设置玩家物品缓存路径的相对上限。它不会改变实例选定的 Boss 等级、提高低等级装备,也不会限制所有战斗计算。

例如,"+0" 将该上限设为选定的副本等级,"+5" 将它提高 5 级,"-5" 将它降低 5 级,最低为 1。实例化副本一节所述的限制仍然适用。

难度采用列表格式,包含以下字段:

键描述值必填
name向玩家展示的难度名称。字符串✅
id难度的 ID,用于自定义 Boss 和自定义物品中基于难度的功能。字符串❌
levelSync限制缓存中的物品等级,并非所有装备计算的统一上限。用整数设置绝对上限,或使用 '+5' 等带引号的有符号偏移值❌

为大型副本使用 meta_pack.yml 副本包文件​

有时你可能在制作一个大型副本,它内部还包含其它较小的副本,玩家可以通过主副本世界在它们之间穿梭。EliteMobs 的冒险副本 Primis 就是一个很好的例子。

Primis 拥有一个供玩家探索和完成任务的广阔世界,但其世界中还包含两个实例化副本——其中之一是最终 Boss 战。在这类情况下,即使它们都属于同一个总体副本,也会存在多个副本包文件。

为了管理这种情况,我们使用元副本包文件。该文件充当一个中央目录,指定主副本并列出与之关联的所有附加副本内容。

下面展示 Primis 的内容包分组方式。版本号仅作示例,不是当前发布的 Primis 版本:

isEnabled: true
name: '&2[000-020] The Primis Adventure!'
customInfo:
- The tutorial adventure for players
- new to EliteMobs!
downloadLink: https://discord.gg/9f5QSka
dungeonSizeCategory: LAIR
environment: NORMAL
protect: true
contentType: META_PACKAGE
containedPackages:
- primis_adventure.yml
- primis_blood_temple_sanctum.yml
- primis_gladius_invasion_dungeon.yml
setupMenuDescription:
- '&2A soft tutorial adventure for players between levels 0-20!'
- '&2Adventures are massive maps with quests,'
- '&2many bosses and npcs, among other things!'
- '&2Also has custom models!'
dungeonVersion: 1

如你所见,元副本包文件与普通副本包非常相似,只有几处关键差异。contentType: 被设为 META_PACKAGE,并且多出一项名为 containedPackages: 的设置。该设置列出了属于这个更大副本的所有其它副本包。

在 containedPackages 中列出每个子包的准确文件名,并将配置及其内容加入压缩包。元包只解析已经加载的内容包定义,缺失项会被跳过;这份列表本身不会打包或下载文件。

组合发布应使用元包的 dungeonVersion。Nightbreak 版本检查会跳过列出的子包,比较符合条件的父包版本。自定义 YAML 元包不会仅因声明了子包就获得 Nightbreak 下载或更新支持。

子副本仍可能出现在玩家的 /em 传送菜单中。对于不应显示的条目,在相应配置中设置 listedInTeleports: false。管理员的 /em setup 安装菜单是另一个菜单。

以 Primis 副本为例:

在菜单中禁用 primis_blood_temple_sanctum.yml 和 primis_gladius_invasion_dungeon.yml 的传送条目。 保留 primis_adventure.yml 的传送选项,因为它是玩家开始旅程并进入其它副本的主枢纽。 请自行配置连接这些世界的传送点和路线;元包列表不会创建它们。

命名该文件时,我们推荐以下命名约定:

your_dungeon_name_meta_pack.yml


Normal、Hard 和 Mythic 的战利品目标见自动职业战利品和附魔平衡。该指南涵盖不同战斗级别的装备配置、实际附魔预算、可复用的奖励展示以及管理员检查命令。下文的 Boss 生命值和伤害参数独立于奖励品质,用于调整战斗。

创建普通副本怪物​

建议保留 normalizedCombat: true。它使用 EliteMobs 的等级和战斗设置来缩放数值。击杀所需次数仍取决于玩家装备、职业附魔、防御和战斗机制,以下倍率不保证固定的击杀次数。

对于副本内容,MobCombatSettings.yml 中的 normalizeRegionalBosses: true(默认值)会为区域 Boss 启用标准化战斗;实例化副本 Boss 也使用标准化战斗。Boss 文件中显式设置的 scaledCombat: true 在缩放战斗计算中优先。以下建议以未启用此覆盖设置的标准化战斗为前提。

normalizedCombat: true
healthMultiplier: 1.0 #Starting point; verify with intended player loadouts.
damageMultiplier: 1.0 #Damage scales with the player's health and defenses; playtest this value.

注意:由于 1.0 是生命值和伤害的默认值,你完全可以省略 healthMultiplier 或 damageMultiplier 的定义,只把 normalizedCombat 设为 true。

创建杂兵群​

杂兵群数量众多但并不太危险:

normalizedCombat: true
healthMultiplier: 0.7 #Starting point for weaker mobs.
damageMultiplier: 0.5 #Damage scales with the player's health and defenses; playtest this value.

创建增援​

增援应当非常容易被击杀,但在伤害方面构成威胁(这些数值适用于 4 个以上的近战实体,实际使用可能有所不同):

normalizedCombat: true
healthMultiplier: 0.25 #Starting point for fragile reinforcements.
damageMultiplier: 0.6 #Damage scales with the player's health and defenses; playtest this value.

创建小 Boss​

小 Boss 应当能撑住场面,并在机制上对玩家构成挑战。它应当是一场持续一段时间的技巧考验,但不至于极度致命:

normalizedCombat: true
healthMultiplier: 3.0 #Starting point for minibosses.
damageMultiplier: 1.2 #Damage scales with the player's health and defenses; playtest this value.

创建 Boss​

Boss 是真正的挑战,是副本层层铺垫后的高潮,也是全力以赴的技巧考验。战斗应当持续较久,死亡应当是随时存在的威胁。

normalizedCombat: true
healthMultiplier: 7.0 #Starting point for bosses; check the health ceiling.
damageMultiplier: 1.4 #Damage scales with the player's health and defenses; playtest this value.

这些推荐值只是粗略估计,最终数值应根据具体的战斗内容进行调整。

对于最终 Boss,提高 healthMultiplier 之前,应使用预期的队伍人数、装备和技能检查战斗时长。

上调 healthMultiplier 之前请注意生命值上限

Boss 的基础生命值以及乘以倍率后的结果都会被限制在服务器的 settings.attribute.maxHealth.max,默认服务器上为 2048。在此上限下,7.0 在 36 级达到上限,10.0 在 33 级达到,40.0 在 23 级达到。实例的队伍缩放随后会再乘以该结果,且同样受此上限限制,因此已经达到上限的 Boss 不会因为队伍人数增加而获得更多生命值。伤害有单独的计算和上限,不受生命值上限影响。基础计算方式以及如何提高服务器上限,请参阅 healthMultiplier。


打包 EliteMobs 内容以便分发

最后,你多半会想把副本打包起来,用于存档或分发。

EliteMobs 拥有一套导入系统,允许管理员快速导入、安装和卸载内容。点此查看它的工作方式。

分发副本资源包​

从 EliteMobs 9.6.0 起,副本可以连同自己的资源包一起打包分发!这让你能做一些很酷的事情,比如为副本中掉落的战利品使用自定义材质或模型,或者添加自定义音效——就像我们在副本 The Hallowed Haunt 中所做的那样。

要随副本分发资源包,请像制作任何标准资源包那样制作它。如果你想要一个模板,可以参考 EliteMobs 默认资源包,EliteMobs 会在启动时把它导出到 plugins/EliteMobs/resource_pack/em_rsp_defaults/。资源包必须以解压后的形式分发,因此请创建一个以你的副本命名的文件夹,例如 my_cool_dungeon_rsp。把原本会打进 zip 的所有资源包文件放进这个文件夹。然后,把这个文件夹放进一个名为 resource_pack 的新文件夹——这与 EliteMobs 存放其默认资源包的文件夹是同一个。

请勿在 em_rsp_defaults 中保存自定义修改。EliteMobs 比较内置资源的校验和与保存的 .rsp_checksum;内置资源变化、保存的校验和缺失或目录缺失时,会重新导出默认资源。它不会对你编辑过的文件计算哈希,因此修改可能暂时保留,但会在后续重新导出时丢失。

整理好文件后,目录结构应当如下所示:

resource_pack
└── my_cool_dungeon_rsp
└── [resource pack files]

安装副本时,这些资源会导入 plugins/EliteMobs/resource_pack/。向玩家客户端发送资源包仍需要 ResourcePackManager 或其他资源包分发配置;导入文件本身不会完成客户端分发。

裁剪世界​

可以使用 WorldBorder 插件 裁剪世界,以减小分发体积。使用前确认所选插件版本支持你的服务器。裁剪会永久删除区块,因此请在有备份的导出副本上操作。

Details

提示 如果你是第一次这么做,最好先给世界做个备份,以防出现意外。

安装好插件后,前往世界中心或你想裁剪的特定区域。然后执行命令 /wb set x,其中 x 代表你希望该区域的大致半径。

Details

提示 如果 /wb 对你不起作用,可以试试 /worldborder:wb。

执行该命令后,飞到世界边缘确认世界边界已正确设置并覆盖了预期范围。当你被推回并在聊天栏收到提示时,就说明抵达了世界边界。

trim_pic_1.jpg

在上图中,我们打算把世界裁剪到只保留紫色方块周围的少量区块。为此,我们站在紫色区域中间的红色方格上执行 /wb set 50,把世界边界设置在紫色区域之外一点点的位置。

接下来使用 /wb trim [freq] [pad]。边距以方块计量,频率是每秒检查的区块数。例如 /wb trim 200 20 每秒最多检查 200 个区块,并保留边界外 20 个方块。执行 /wb trim confirm 前检查缓冲范围;需要更多周边地形时应增大边距。单位定义见 WorldBorder 的裁剪命令。

之后可以站在该世界中,用 /wb clear 移除这个世界的插件边界,也可以保留它。

裁剪世界文件夹​

先备份,并在源世界已卸载时操作单独的导出副本。保留完整目录结构,包括地形、实体、兴趣点和世界数据。不要使用最小文件白名单,否则可能删除地形、物品展示框、盔甲架或其他制作内容。

世界结构取决于 Minecraft 版本和服务端。旧结构区分下界 DIM-1 与末地 DIM1;现代存储把维度放在 dimensions/<namespace>/<key>/ 中。保留服务器生成的结构,并按上文说明为每份蓝图导出所需的单个维度。发布前,将副本导入独立服务器,检查地形与制作的实体。确认该服务器版本的路径后,才能从导出副本删除临时锁文件或私人玩家数据。

运行打包命令​

EliteMobs 提供 /em package <dungeonName> <version> 命令,需要 elitemobs.package 权限。它在下列每个内容文件夹中查找名为 dungeonName 的子文件夹,把找到的内容复制到 exports/<dungeonName>/,然后压缩为 exports/<dungeonName>_packaged.zip。

它扫描的文件夹依次为:

custombosses、customevents、npcs、npc_scripts、transport_routes、customitems、customquests、customarenas、customspawns、customtreasurechests、wormholes、world_blueprints、powers、behaviors

找不到的项会打印一条 "no subdirectory" 提示并被跳过,对于并未使用全部内容类型的包来说,这是正常现象。

因此,我们强烈建议你把想要打包的内容放在与包名同名的文件夹中。 否则,你就必须手动收集文件并按分发所需的文件结构进行打包。

该命令不会收集 content_packages、worldcontainer、models、scripts、enchantments 或 resource_pack,也不会创建 pack.meta。生成最终 zip 前,将内容包需要的文件加入导出文件夹。<version> 参数必须是整数,但不会更新 dungeonVersion;请手动修改该字段。

复制之前,命令会验证匹配的已加载内容包定义所引用的现有蓝图。无效结构或服务器不匹配可能使操作中止。此检查不代表所有必要配置、Boss 和资源都已包含。

每次运行都会先在临时文件夹中构建导出内容。成功后,它会替换 exports/<dungeonName>/ 和 exports/<dungeonName>_packaged.zip,因此你手动加入之前导出文件夹的文件会被删除。请把这些补充文件保存在别处,并在每次运行后重新复制进去。如果所有内容文件夹都不存在,或者某个内容文件夹或文件是符号链接,命令会打印 Failed to zip package!,在控制台记录原因,并保持之前的导出内容不变。

添加副本包文件​

如果你正在制作副本,需要手动把副本包文件添加到 exports 文件夹中新生成的目录里。你的副本包配置文件应遵循上文所述的格式,并放在名为 content_packages 的文件夹中。更多细节请参见下方的 文件结构 一节。

完成后别忘了把副本压缩成 zip!

文件结构​

如果一切操作正确,文件结构应当与下面这个示例类似,其中我们把副本命名为 my_cool_dungeon:

my_cool_dungeon 文件结构示例
  • my_cool_dungeon.zip
    • pack.meta(内容为 elitemobs)
    • content_packages
      • my_cool_dungeon.yml <- 你的副本包配置文件放在这里
    • worldcontainer
      • [把你的世界文件夹放在这里]
    • wormholes
      • my_cool_dungeon
        • [把你的虫洞放在这里]
    • npcs
      • my_cool_dungeon
        • [把你的 NPC 放在这里]
    • customtreasurechests
      • my_cool_dungeon
        • [把你的宝藏箱放在这里]
    • customquests
      • my_cool_dungeon
        • [把你的任务放在这里]
    • customitems
      • my_cool_dungeon
        • [把你的自定义物品放在这里]
    • custombosses
      • my_cool_dungeon
        • [把你的自定义 Boss 放在这里]
    • customarenas
      • my_cool_dungeon
        • [把你的自定义竞技场放在这里]
    • powers
      • my_cool_dungeon
        • [把你的自定义能力放在这里]
    • world_blueprints
      • my_cool_dungeon
        • [把你的世界文件夹放在这里,用于实例化副本]
    • customevents
      • my_cool_dungeon
        • [把你的自定义事件放在这里]
    • customspawns
      • my_cool_dungeon
        • [把你的自定义生成规则放在这里]
    • models
      • [把你的 bbmodel 格式模型放在这里,可以使用子文件夹]
    • scripts
      • [把你的 FreeMinecraftModels Lua 脚本放在这里]
    • resource_pack
      • my_cool_dungeon_rsp
        • [把你的资源包文件放在这里]

通过 plugins/EliteMobs/imports/ 导入完成的 zip,然后重载并检查 /em setup。分享前测试一次全新安装,包括引用的 Boss、任务、Lua 文件、模型和世界蓝图。

被识别的顶层文件夹​

导入器只认识一组固定的顶层名称。对于 EliteMobs 包(pack.meta 内容为 elitemobs),它们是:

文件夹安装位置
content_packagesplugins/EliteMobs/content_packages
dungeonpackagesplugins/EliteMobs/content_packages(旧版别名)
custombossesplugins/EliteMobs/custombosses
customitemsplugins/EliteMobs/customitems
customtreasurechestsplugins/EliteMobs/customtreasurechests
customeventsplugins/EliteMobs/customevents
customspawnsplugins/EliteMobs/customspawns
customquestsplugins/EliteMobs/customquests
customarenasplugins/EliteMobs/customarenas
npcsplugins/EliteMobs/npcs
npc_scriptsplugins/EliteMobs/npc_scripts
transport_routesplugins/EliteMobs/transport_routes
behaviorsplugins/EliteMobs/behaviors
enchantmentsplugins/EliteMobs/enchantments
wormholesplugins/EliteMobs/wormholes
powersplugins/EliteMobs/powers
world_blueprintsplugins/EliteMobs/world_blueprints
resource_packplugins/EliteMobs/resource_pack
worldcontainer服务器的世界容器
models 或 modelengineFreeMinecraftModels 已启用时使用其 models 文件夹;否则在 ModelEngine 已启用时使用其 blueprints 文件夹;两者均未启用时使用 FreeMinecraftModels 的 models 文件夹
scriptsplugins/FreeMinecraftModels/scripts
elitemobsplugins/EliteMobs,按与该数据文件夹相同的结构合并
freeminecraftmodelsplugins/FreeMinecraftModels,按与该数据文件夹相同的结构合并。其中的 models 文件夹会放到 FreeMinecraftModels 实际读取的 models 文件夹中
betterstructuresplugins/BetterStructures,按与该数据文件夹相同的结构合并
pack.meta不会被安装到任何地方——它只是被读取以识别该包

没有专属顶层名称的文件请放在 elitemobs、freeminecraftmodels 和 betterstructures 文件夹中,例如把物品所用的 FreeMinecraftModels 附魔放在 freeminecraftmodels/enchantments。导入将文件放入其文件夹后,FreeMinecraftModels 会重新加载导入的内容。BetterStructures 会在自身启动完成后重新加载;不具备该重载入口的版本会记录一条警告,提示你执行 /bs reload。

无法识别的顶层条目会导致整个内容包被拒绝,压缩包会保留以供修正。请勿在根目录放入多余的 readme、截图或 __MACOSX 文件夹。写入目标失败时,导入器会尝试回滚该压缩包改变的所有目标;重试前检查回滚警告。

schematics 也会使 EliteMobs 压缩包被拒绝,并额外提示示意图副本已在 EliteMobs 9.0 中移除。

如果希望管理员通过 /em setup 安装副本,发布的配置应使用 isEnabled: false。为每个世界准备并检查已卸载的导出副本。保留创作服务器的文件,并核实导出配置;不要假设打包命令会重置安装状态。

与社区分享你创建的副本包

Discord 上有一个 #community_dungeons 频道,人们可以在那里分享自己的迷你副本作品。欢迎投稿!