跳到主要内容

副本打包器

webapp_banner.jpg

什么是副本?

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


什么是副本打包器?

副本打包器不仅让管理员可以创建和打包副本,还可以打包任何类型的 EliteMobs 内容。这包括事件包、模型包、竞技场、NPC 包、物品包等等。

为什么要使用副本包?
  • 实例化副本! 实例化副本只能通过副本包系统创建。
  • 迷你副本的安全备份! 制作副本包之后,你可以随时出于任何理由,在任意服务器上部署和重新部署它。
  • 轻松开关! 你随时可以执行 /em setup,临时或永久地开启和关闭副本包。
  • 便于分享! 如果你想分享自己的作品,只需把副本包打成 zip 发给别人即可。如果你有兴趣,Discord 上还有一个专门用于社区创作的频道!
  • 传送点! 副本包会自动创建传送位置,可以在 /em 菜单的“传送”页面中访问,这在很多配置场景下都非常有用。

创建副本

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

所需插件

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

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

逐步创建副本

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

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

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

必需的 pack.meta 文件

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


全局值

以下值适用于所有副本

isEnabled

设置是否启用该副本包。

KeyValuesDefaultMandatory
isEnabledBooleanfalse
示例
isEnabled: true

name

设置内容的名称。支持 Color Codes

KeyValuesDefaultMandatory
nameStringnone
示例
name: '&c[lvl 999] &aThe Green Dungeon'

create_packager_name.jpg


contentType

设置副本的类型。

KeyValuesDefaultMandatory
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGEnone
示例
contentType: INSTANCED_DUNGEON
SCHEMATIC_DUNGEON 已废弃

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


customInfo

设置将出现在 /em setup 界面中的附加信息。仅供说明用途。支持 Color Codes

KeyValuesDefaultMandatory
customInfoString Listnone
示例
customInfo:
- '&aThe best dungeon.'
- '&aMade by: CoolPlayer'

create_packager_custominfo.jpg


setupMenuDescription

设置该副本包在 /em setup 菜单中显示的描述。支持 Color Codes

KeyValuesDefaultMandatory
setupMenuDescriptionString Listnone
示例
setupMenuDescription:
- '&2A cool dungeon for levels 10-20!'
- '&2Features 3 bosses and custom loot!'

设置当内容尚未下载时,在 /em setup 菜单中向玩家显示的下载链接。

KeyValuesDefaultMandatory
downloadLinkStringempty string
示例
downloadLink: http://www.example.org

create_packager_downloadlink.jpg


dungeonSizeCategory

设置副本包的规模类别。仅供说明用途。

KeyValuesDefaultMandatory
dungeonSizeCategorySpecial [1]none
示例
dungeonSizeCategory: MINIDUNGEON

create_packager_size.jpg

Special [1]

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

更详细的说明请参见副本


protect

设置是否保护该副本包的世界。这不会使用 WorldGuard —— EliteMobs 会用自带的保护套件注册该世界,阻止破坏和放置方块、方块燃烧/消退/点燃、树叶消失、骨粉、液体桶、告示牌编辑、容器访问(宝藏箱除外)、门/活板门/栅栏门的开启、龙蛋和花盆交互、物品展示框和盔甲架的篡改,以及原版怪物生成。其中若干行为还可以通过 allowExplosionBlockDamageallowLiquidFlowallowElytra 进一步调节。

protectfalse 时,上述保护一律不生效,该世界的行为与普通世界无异。

KeyValuesDefaultMandatory
protectBooleantrue
示例
protect: true

dungeonVersion

设置副本包的版本号。

KeyValuesDefaultMandatory
dungeonVersionIntegernone
示例
dungeonVersion: 1

playerInfo

设置在菜单中显示的信息。支持 Color Codes

仅在使用 /em alt/em 设为书本模式时生效。

KeyValuesDefaultMandatory
playerInfoStringnone
示例
playerInfo: 'Difficulty: &a1-man easy content!'

create_packager_playerinfo.jpg


regionEnterMessage

设置玩家进入副本区域时显示的消息。支持 Color Codes

KeyValuesDefaultMandatory
regionEnterMessageStringnone
示例
regionEnterMessage: '&aYou have entered the dungeon!'

create_packager_enter.jpg


regionLeaveMessage

设置玩家离开副本区域时显示的消息。支持 Color Codes

KeyValuesDefaultMandatory
regionLeaveMessageStringnone
示例
regionLeaveMessage: '&aYou have left the dungeon!'

create_packager_leave.jpg


hasCustomModels

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

KeyValuesDefaultMandatory
hasCustomModelsBooleanfalse
示例
hasCustomModels: false

dungeonConfigFolderName

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

实例化副本必填!

KeyValuesDefaultMandatory
dungeonConfigFolderNameStringnone
示例
dungeonConfigFolderName: my_dungeon_folder

anchorPoint

设置 /em relativecoords <package> 的测量基准点。设置了锚点后,管理员站在已安装内容包内的任何位置执行该命令,都会得到自己所处位置相对于锚点的坐标,这正是增援偏移量和脚本位置等所使用的格式。

如果 calculatedRotation 不为零,返回的向量会先绕锚点在 Y 轴上旋转再显示,这样在旋转放置的情况下数值依然正确。

如果没有设置锚点,该命令只会提示管理员锚点无效,不会执行其它任何操作。

KeyValuesDefaultMandatory
anchorPointLocationnone
calculatedRotationInteger(度)0
示例
anchorPoint: my_dungeon_world,100,64,100,0,0
calculatedRotation: 0

contentLevel

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

KeyValuesDefaultMandatory
contentLevelIntegernone
示例
contentLevel: 20

enchantmentChallenge

设置该副本是否为附魔挑战副本。

KeyValuesDefaultMandatory
enchantmentChallengeBooleanfalse
示例
enchantmentChallenge: false

song

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

KeyValuesDefaultMandatory
songStringnone

name= 在这里定义应播放资源包中的哪个文件。
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 被击杀后的副本锁定计时。指定值以分钟为单位。自 EliteMobs 10.3.1 起,默认值为 4320(72 小时),并应用于所有预制内容包——在你的 YAML 中将此值设为 0 可禁用该内容包的锁定计时,或设为其它正整数以覆盖默认值。被锁定的玩家在冷却期间也不会从对应的 Boss 获得技能 XP。

KeyValuesDefaultMandatory
dungeonLockoutMinutesInteger4320
示例
dungeonLockoutMinutes: 1440

containedPackages

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

KeyValuesDefaultMandatory
containedPackagesString Listnone
示例
containedPackages:
- my_dungeon_adventure.yml
- my_dungeon_sanctum.yml
- my_dungeon_boss_fight.yml

customItemFilenames

设置物品包的自定义物品文件列表。设置该值会自动把 contentType 设为 ITEMS_PACKAGE

KeyValuesDefaultMandatory
customItemFilenamesString Listnone
示例
customItemFilenames:
- my_custom_sword.yml
- my_custom_armor.yml

customEventFilenames

设置事件包的自定义事件文件列表。设置该值会自动把 contentType 设为 EVENTS_PACKAGE

KeyValuesDefaultMandatory
customEventFilenamesString Listnone
示例
customEventFilenames:
- my_custom_event.yml

modelNames

设置模型包的模型名称列表。设置该值会自动把 contentType 设为 MODELS_PACKAGE

KeyValuesDefaultMandatory
modelNamesString Listnone
示例
modelNames:
- my_custom_model

可翻译的键

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


基于世界的副本包

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


worldName

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

KeyValuesDefaultMandatory
worldNameStringnone
示例
worldName: my_minecraft_world

wormholeWorldName

该功能用于设置虫洞世界的名称,它是与主世界相连的次级世界。可用于传送枢纽或特殊 Boss 房间之类的功能。

KeyValuesDefaultMandatory
wormholeWorldNameStringnone
示例
wormholeWorldName: my_minecraft_world_wormhole

environment

设置世界的环境类型。

KeyValuesDefaultMandatory
environmentEnvironmentnone
示例
environment: NORMAL

teleportLocation

设置副本包的传送位置。玩家进入副本时会被传送到这里。

KeyValuesDefaultMandatory
teleportLocationStringnone
示例
teleportLocation: my_minecraft_world,-1.5,68,0.5,0.0,0.0

allowExplosionBlockDamage

允许或阻止爆炸破坏副本中的方块。这些爆炸被视为精英爆炸,因此任何方块损坏都会在 2 分钟内恢复。

KeyValuesDefaultMandatory
allowExplosionBlockDamageBooleanfalse
示例
allowExplosionBlockDamage: true

allowLiquidFlow

设置副本中是否允许液体(水、岩浆)流动。

KeyValuesDefaultMandatory
allowLiquidFlowBooleantrue
示例
allowLiquidFlow: false

allowElytra

设置玩家是否允许在该内容包的世界中使用鞘翅滑翔。当设为 false(默认值)时,EliteMobs 会取消该内容包所在世界中的滑翔尝试,并每 tick 重置非滑翔状态——可用于阻止玩家跳过设计好的地牢移动路径。

KeyValuesDefaultMandatory
allowElytraBooleanfalse
示例
allowElytra: true

listedInTeleports

设置该副本包是否出现在传送菜单中。设为 false 时,玩家将无法通过 /em 传送菜单传送到该副本。

KeyValuesDefaultMandatory
listedInTeleportsBooleantrue
示例
listedInTeleports: false

teleportLocationOffset

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

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

KeyValuesDefaultMandatory
teleportLocationOffsetStringnone
示例
teleportLocationOffset: my_minecraft_world,0.5,2,0.5,0.0,0.0

实例化副本

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

然后把你要使用的世界放进刚创建的文件夹里,并确保删除该世界的 session.lock 文件。

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


startLocation

设置实例化副本起点的传送位置。玩家使用 /em start 开始实例化副本时会被传送到这里。

KeyValuesDefaultMandatory
startLocationStringnone
示例
startLocation: my_minecraft_world,10.5,70,10.5,0.0,0.0

permission

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

KeyValuesDefaultMandatory
permissionStringnone
示例
permission: elitedungeon.mypermission

minPlayerCount

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

KeyValuesDefaultMandatory
minPlayerCountInteger1
示例
minPlayerCount: 1

maxPlayerCount

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

KeyValuesDefaultMandatory
maxPlayerCountInteger5
示例
maxPlayerCount: 5

dungeonObjectives

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

KeyValuesDefaultMandatory
dungeonObjectivesString Listnone
示例

目前有两种副本目标类型:

  • 击杀指定目标:filename=boss.yml:amount=X
  • 清理副本的百分比:clearpercentage=X.Y
dungeonObjectives:
- filename=dungeon_final_boss.yml
- filename=dungeon_miniboss_one.yml
- filename=dungeon_miniboss_two.yml
dungeonObjectives: 
- clearpercentage=0.8

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


difficulties

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

实例化副本必填!

KeyValuesDefaultMandatory
difficultiesSpecial [1]none
示例
difficulties:
- levelSync: 25
id: 0
name: normal
- levelSync: 20
id: 1
name: hard
- levelSync: 15
id: 2
name: mythic

create_packager_difficulty.jpg

Special [1]

展开表格

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

这里设置的难度名称就是自定义 Boss 文件夹中所使用的名称,你可以据此按难度设置 Boss 拥有哪些能力。

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

Key描述ValuesMandatory
name向玩家展示的难度名称。String
id难度的 ID,用于自定义 Boss 和自定义物品中基于难度的功能。String
levelSync设置等级同步的等级(如果有的话)。等级同步会让所有玩家装备的等级上限锁定在设定值,使玩家无法相对副本超等级,从而让副本在后续的重复挑战中仍然有意义。灵感来自《最终幻想 14》的等级同步系统。绝对等级(25相对于 contentLevel 的值(+5-3

相对等级同步:+- 开头的 levelSync 会叠加到内容包的 contentLevel 之上,并被限制为最小 1。例如 contentLevel: 40 配合 levelSync: -5,玩家会被同步到 35 级。对于动态副本(其内容等级只在实例创建时才确定),相对值会在那时才解析。无法解析的值会禁用等级同步(0)并记录一条警告。

动态副本

动态副本是实例化副本的扩展,但有一个关键区别:它们允许副本内容随玩家选择的难度等级缩放。玩家可选的等级选项由该玩家已解锁的公会等级决定。

为动态副本设计 Boss 和怪物时,请使用设置 level: dynamic。动态副本中的所有战利品都应设置 scalability: scalable

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


contentType

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

KeyValuesDefaultMandatory
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGEnone
示例
contentType: DYNAMIC_DUNGEON

contentLevel

设置该副本在 EM 菜单中显示的内容等级。要让副本显示为动态副本,该值必须设为 -1

KeyValuesDefaultMandatory
contentLevelIntegernone
示例
contentLevel: -1

difficulties

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

实例化副本必填!

KeyValuesDefaultMandatory
difficultiesSpecial [1]none
示例
difficulties:
- levelSync: '+5'
name: normal
id: 0
- levelSync: '+0'
name: hard
id: 1
- levelSync: '-5'
name: mythic
id: 2

create_packager_difficulty.jpg

Special [1]

展开表格

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

这里设置的难度名称就是自定义 Boss 文件夹中所使用的名称,你可以据此按难度设置 Boss 拥有哪些能力。

levelSync 设为带引号的正数或负数,可以控制副本内玩家装备的同步方式。这些值不会影响副本本身的等级——副本内容始终在进入时直接同步到玩家选择的等级。

例如,如果 levelSync 设为 "+0",玩家装备会被同步到与副本内容等级完全一致。
如果设为 "+5",玩家装备会被同步到比副本内容高 5 级
如果设为 "-5",其装备会被同步到比副本内容低 5 级

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

Key描述ValuesMandatory
name向玩家展示的难度名称。String
id难度的 ID,用于自定义 Boss 和自定义物品中基于难度的功能。String
levelSync设置玩家装备缩放所用的等级。它决定玩家装备等级相对于副本内容如何调整,允许装备比所选副本难度高或低若干等级。灵感来自《最终幻想 14》的等级同步系统。Integer

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

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

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

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

我们来仔细看看 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: 21 #added dungeon meta package file

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

创建元包时,务必包含 containedPackages: 设置,并列出属于你这个大型副本的每一个副本包。这样才能确保一切在总体结构中被正确关联和组织。

为副本编制版本号时,所有版本管理都应通过元包进行。因为元包是决定整个副本版本的主包,也是用于在 /em setup 菜单中显示信息的包。

请注意,元包中列出的各个副本仍可能出现在 /em setup 的传送菜单中。要避免这一点,你需要在这些副本各自的配置文件中手动禁用传送选项。

以 Primis 副本为例:

在菜单中禁用 primis_blood_temple_sanctum.ymlprimis_gladius_invasion_dungeon.yml 的传送条目。 保留 primis_adventure.yml 的传送选项,因为它是玩家开始旅程并进入其它副本的主枢纽。 这样的设置既能让玩家获得顺畅的体验,又能维持副本系统正确的结构与功能。

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

your_dungeon_name_meta_pack.yml


推荐的 Boss 数值

创建普通副本怪物

我们建议把 normalizedCombat 设置保持为 true。该设置会让所有怪物在生命值和伤害上以相同方式缩放,与其实体类型无关。

请注意,对于副本内容,这通常已经替你决定好了:只要 MobCombatSettings.yml 中的 normalizeRegionalBossestrue(默认值),无论 Boss 文件里怎么写,每个区域 Boss 和每个实例化副本 Boss 都会被强制使用标准化战斗。因此,真正起作用的是下面这些倍率。

normalizedCombat: true
healthMultiplier: 1.0 #~3 sword hits to slay
damageMultiplier: 1.0 #1.5 hearts of dmg

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

创建杂兵群

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

normalizedCombat: true
healthMultiplier: 0.7 #~2 sword hits to slay
damageMultiplier: 0.5 #0.5 hearts of dmg

创建增援

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

normalizedCombat: true
healthMultiplier: 0.25 #~1 sword hit to slay
damageMultiplier: 0.6 #1 heart of dmg

创建小 Boss

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

normalizedCombat: true
healthMultiplier: 3.0 #~10 sword hits to slay
damageMultiplier: 1.2 #2 hearts of dmg

创建 Boss

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

normalizedCombat: true
healthMultiplier: 7.0 #~23 sword hits to slay
damageMultiplier: 1.4 #2.5 hearts of dmg

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

这一点对副本最终 Boss 尤其关键;你可能会希望把 healthMultiplier 显著提高到远超推荐的 7.0,以营造最终战的史诗感。

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

Boss 生命值会被限制在服务器的 settings.attribute.maxHealth.max(默认服务器为 2048),而 Boss 伤害不会被限制。因此每个倍率都存在一个等级临界点,超过之后 Boss 不再获得更多生命值,但伤害仍在继续缩放——7.036 级封顶,10.033 级封顶,40.023 级封顶。把倍率提高到已经封顶的临界点之上,除了让 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 每次启动都会对其 jar 中的副本做校验和,一旦两者不一致就会清空并重新导出该文件夹,你的修改会因此丢失。

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

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

完成后,当副本被安装时,你的副本资源包应当能够成功导入。

裁剪世界

有时你可能需要缩小 Minecraft 世界的体积,让它更轻量、更便于分发。这可以通过 WorldBorder 插件 实现。尽管该插件标注的支持版本只到 MineCraft 1.19,但截至 2024 年 1 月 25 日,它在最新的 MineCraft 版本上依然运行良好。

Details

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

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

Details

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

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

trim_pic_1.jpg

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

接下来,我们使用 /wb trim [freq] [pad] 命令,频率设为 200、边距设为 20。边距决定世界边界(紫色区域)周围应保留多少区块,频率决定每秒处理多少区块。运行 /wb trim 200 20 之后,系统会提示我们执行 /wb trim confirm 进行确认。确认后过一段时间,世界就会被裁剪,体积减小,更便于分发。

现在你可以用 /wb clear all 移除世界边界,也可以按需保留它。

裁剪世界文件夹

世界文件夹中有若干文件和文件夹是可以舍弃的,因为插件并不会用到全部内容。这样能减小世界的体积,使其更便于分发。

对于 NORMAL 世界环境:

准备世界时,请保留以下文件和文件夹:

  1. region 文件夹
  2. data 文件夹中的 raids.dat(复制时请确保它仍位于 data 文件夹内)
  3. level.dat 文件

世界文件夹中的所有其它文件和文件夹都可以安全删除。这样即可为 NORMAL 环境正确准备好你的世界。

对于 NETHER 和 THE_END 世界环境:

准备世界时,请保留以下文件和文件夹:

  1. DIM-1 文件夹内的 region 文件夹(复制时请确保它仍位于 DIM-1 文件夹内)
  2. data 文件夹中的 raids.dat(复制时请确保它仍位于 data 文件夹内)
  3. level.dat 文件

世界文件夹中的所有其它文件和文件夹都可以安全删除。这样即可为 NETHER 和 THE_END 环境正确准备好你的世界。

运行打包命令

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

它扫描的文件夹依次为:

custombossescustomeventsnpcscustomitemscustomquestscustomarenascustomspawnscustomtreasurechestswormholesworld_blueprintspowers

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

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

请注意,/em package 不会收集 content_packagesworldcontainermodelsresource_pack。这四项必须在压缩之前手动添加到导出文件夹中。

添加副本包文件

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

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

文件结构

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

my_cool_dungeon 文件结构示例
  • my_cool_dungeon.zip
    • 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
        • [把你的资源包文件放在这里]

这样一来,大多数用户只需把文件直接拖放到服务器上即可立刻使用。

被识别的顶层文件夹

导入器只认识一组固定的顶层名称。对于 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
wormholesplugins/EliteMobs/wormholes
powersplugins/EliteMobs/powers
world_blueprintsplugins/EliteMobs/world_blueprints
resource_packplugins/EliteMobs/resource_pack
worldcontainer服务器的世界容器
modelsmodelengine如果安装了 FreeMinecraftModels,则为其 models 文件夹;否则为 ModelEngine 的 blueprints 文件夹
scriptsplugins/FreeMinecraftModels/scripts
pack.meta不会被安装到任何地方——它只是被读取以识别该包

zip 顶层的其它任何内容都不会被识别,也不会被安装,因此请把多余的 readme 文件、截图和 __MACOSX 文件夹排除在压缩包根目录之外。

schematics 是个特例:把它导入 EliteMobs 会打印一条警告,告诉你示意图副本已在 EliteMobs 9.0 中被移除。

重要提示:为分发打包时,请务必先卸载迷你副本!你不会想分发一个已安装状态的迷你副本,而是希望管理员在自己的服务器上完成安装!

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

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