跳到主要内容

创建任务

webapp_banner.jpg

示例任务

EliteMobs 预打包了一个 test_quest.yml,下面将以它为例分析一个可供参考的简单任务格式。

自定义任务位于 ~plugins/EliteMobs/customquests 文件夹中!

test_quest.yml

isEnabled: true
customObjectives:
Objective1:
amount: '1'
filename: test_boss.yml
objectiveType: KILL_CUSTOM
customRewards:
- filename=magmaguys_toothpick.yml:amount=1:chance=1
name: "&aKill the Test Boss"
questLore:
- "&cEnd the test boss'' reign of terror!"

create_quest_quest.jpg

如果你的任务 UI 看起来不是这样,你可以使用 /em alt 将其更改为匹配的样式。

这个示例任务会给玩家下达击杀 1 个 test_boss.yml 的任务。(任务追踪器中显示的 Boss 实际名称将是 test_boss.yml 中设置的 name:。)作为完成任务的奖励,他们会获得 1 个 Magmaguy's Toothpick。

创建自定义任务

isEnabled

设定任务是否启用。

KeyValuesDefault
isEnabledBooleantrue
示例
isEnabled: true

customObjectives

设定任务目标。

KeyValuesDefault
customObjectivesSpecial [1]none

注意:如果你用一个多阶段 Boss 作为目标,那么目标应将第一阶段作为目标对象。

示例

KILL_CUSTOM

customObjectives:
Objective1:
amount: '1'
filename: my_cool_boss.yml
objectiveType: KILL_CUSTOM

DIALOG

customObjectives:
Objective1:
dialog:
- "&a[Dialog NPC] &fCome here often?"
- "&7&oI should eat more apples."
filename: dialog_npc.yml
npcName: Dialog NPC
location: at dialog location.
objectiveType: DIALOG

FETCH_ITEM

customObjectives:
Objective1:
amount: '99'
itemName: Red Apples
filename: my_quest_item_red_apples.yml
objectiveType: FETCH_ITEM

ARENA

customObjectives:
Objective1:
objectiveType: ARENA
filename: my_arena.yml
name: "Complete the Arena"

create_quest_objective.jpg

Special [1]

展开表格

自定义目标使用以下值来构建:

Key描述
objectiveType用于设定该目标所代表的类型。有效值为 KILL_CUSTOMFETCH_ITEMDIALOGARENAKILL_CUSTOM 表示任务涉及击杀特定的自定义 Boss,FETCH_ITEM 表示任务涉及获取特定的自定义物品,DIALOG 表示任务涉及与某个 NPC 对话,ARENA 表示任务涉及完成特定的竞技场。
filename用于设定玩家必须击杀/获取的自定义 Boss、自定义物品的文件名,必须对话的 NPC 的文件名,或必须完成的竞技场的文件名。必填 —— 没有 filename 的目标会被丢弃,并在控制台给出警告。
amount用于设定必须击杀的自定义 Boss 数量或必须获取的物品数量。未指定时默认为 1DIALOG(始终为 1)和 ARENA 会忽略它。
dialogDIALOG —— 玩家与该 NPC 对话时它所说的台词。
locationDIALOG —— 关于该 NPC 位置的自由文本提示,在任务菜单的摘要行中以 $location 显示。
name / npcName / itemName同一个字段的三个可互换名称:目标对象在任务追踪器和菜单中的显示名称。仅用于显示目的 —— 选用最适合该目标类型的那个即可。对于 FETCH_ITEM,若省略它,则回退为自定义物品文件中配置的 name

每个目标都位于 customObjectives 内部各自的键下(Objective1Objective2、……),其字段都是普通的 YAML 键。使用单行 KILL_CUSTOM:filename=X.yml:amount=Y 字符串格式的旧任务文件,会在首次加载时自动转换为这种结构并写回磁盘。

FETCH_ITEM 的行为

FETCH_ITEM 的进度会在玩家拾取或丢弃物品时、接受任务时以及尝试上交任务时,从玩家背包中重新统计 —— 因此在接受任务之前获得的物品同样计入。上交时玩家仍必须持有所需数量:如果不足,上交会被取消。成功上交后,任务物品会从玩家背包中被消耗掉。


customRewards

设定任务奖励。

KeyValuesDefault
customRewardsEliteMobs 通用战利品格式none
示例
customRewards:
- currencyAmount=50:amount=1:chance=0.05
- material=COOKED_COD:amount=3:chance=1.0
- filename=magmaguys_toothpick.yml:amount=1:chance=1.0

create_quest_rewards.jpg

注意: 自定义任务不会自动生成奖励。如果你把 customRewards 留空,该任务完成时不会给予任何东西,因此请始终明确定义奖励。(基于任务难度的自动等级缩放奖励 —— 货币与物品 —— 只适用于程序生成的动态任务,不适用于配置文件定义的自定义任务。)

任务奖励是直接发放的:物品会直接进入玩家背包(放不下的会掉在他们脚边),货币会加入他们的余额。若要在完成时运行命令,请使用 questCompleteCommands,而不是 command= 战利品条目。


questAcceptPermission

设定玩家接受任务所必须拥有的权限。

KeyValuesDefault
questAcceptPermissionStringnone
示例
questAcceptPermission: elitequest.my_permission

questAcceptPermissions

设定玩家接受任务所必须拥有的多个权限。

KeyValuesDefault
questAcceptPermissionsString Listnone
示例
questAcceptPermissions: 
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml

questLockoutPermission

设定玩家完成任务后将获得的权限,该权限会阻止他们再次进行此任务。如果不指定,则不会分配任何锁定权限,任务保持开放。

KeyValuesDefault
questLockoutPermissionStringnone
示例
questLockoutPermission: elitequest.my_quest.yml

questLockoutMinutes

设定玩家在能够再次进行该任务之前必须等待多长时间(以分钟为单位)。

KeyValuesDefault
questLockoutMinutesInteger-1(永不重复)

共有两套锁定系统,而这个键决定使用哪一套:

  • 任何大于 0 的值都会使用定时锁定追踪器。玩家在上交任务之后的这么多分钟内被锁定,无法再接该任务;再次尝试接取时会被告知还剩多久,并且可用性检查会忽略 questLockoutPermission
  • 0 或更小则回退到旧式的 questLockoutPermission 标记,该标记在完成时被永久授予。如果也没有设置 questLockoutPermission,那么该任务保持可重复。
示例
questLockoutMinutes: 60

name

设定任务名称。接受 颜色代码

KeyValuesDefault
nameStringnone
示例
name: "&aMy Great Quest Name"

questLore

设定任务的 lore(描述文本),它会出现在游戏内的任务菜单中。

KeyValuesDefault
questLoreString Listnone
示例
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

create_quest_lore.jpg


temporaryPermissions

设定在玩家上交任务之前分配给他们的权限。

如果你使用此设置来确保某物品只在玩家拥有特定任务进行中时掉落,你还需要在该物品的配置文件中配置相同的 Permission

KeyValuesDefault
temporaryPermissionsString Listnone
示例
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml

questAcceptDialog

设定接受任务时在聊天中出现的对白。

当任务对话 Boss 血条被启用时,这个列表同时也用作任务发布者在任务被接受之前在对话框中说出的对白。如果它为空,则改用 questLore 作为那段对白。

KeyValuesDefault
questAcceptDialogString Listnone
示例
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

create_quest_accept.jpg


questCompleteMessage

设定任务上交时显示的对白。如果启用了任务对话 Boss 血条(QuestsConfig 中的 useQuestDialogueBossBars),它会在对话框中渲染;否则会发送到聊天。基岩版玩家始终收到聊天版本。

KeyValuesDefault
questCompleteMessageString Listnone
示例
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

create_quest_complete.jpg


questCompleteCommands

设定完成任务时将运行的命令。命令由控制台派发,因此不要加开头的斜杠,也不要依赖玩家自身拥有相应权限。

支持的占位符:$player 表示玩家名称,$getWorld 表示玩家所在世界的名称,$getX$getY$getZ 表示玩家所在位置的坐标。

KeyValuesDefault
questCompleteCommandsString Listnone
示例
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1

create_quest_commands.jpg


turnInNPC

设定玩家需要对话/交互以完成任务的 NPC 的文件名。这一定要是发布该任务的同一个 NPC。

KeyValuesDefault
turnInNPCFilenamenone
示例
turnInNPC: my_cool_quest_npc.yml

任务发布者

要将任务分配给某个会向玩家发布它的 NPC,你需要配置 NPC 文件,而不是任务文件。

在你的 NPC 配置文件(~/plugins/EliteMobs/npcs/)中,添加:

interactionType: CUSTOM_QUEST_GIVER
questFileName: my_quest.yml

对于发布多个任务的 NPC:

interactionType: CUSTOM_QUEST_GIVER
questFileName:
- quest_one.yml
- quest_two.yml

interactionType: CUSTOM_QUEST_GIVER 是必需的 —— 没有它,该 NPC 会完全忽略 questFileName

关于配置 NPC 的更多信息,请参阅 NPC 创建文档。


trackable

设定任务是否使用任务追踪器。

KeyValuesDefault
trackableBooleantrue
示例
trackable: true

questLevel

设定任务的等级。这只是一个视觉参考,方便玩家了解任务会有多大挑战性。它不会以任何方式修改 Boss、物品或其他等级。

KeyValuesDefault
questLevelInteger0
示例
questLevel: 10

create_quest_level.jpg


questAcceptSound

设定接受任务时播放的音效。既可以播放 Minecraft 音效,也可以播放资源包中的音效。未设置此项时,EliteMobs 会改为播放 SoundsConfig 中的全局任务接受音效。

KeyValuesDefault
questAcceptSoundStringnone
示例
questAcceptSound: entity.experience_orb.pickup

create_quest_level.jpg


questCompleteSound

设定完成(上交)任务时播放的音效。既可以播放 Minecraft 音效,也可以播放资源包中的音效。未设置此项时,EliteMobs 会改为播放 SoundsConfig 中的全局任务完成音效。

KeyValuesDefault
questCompleteSoundStringnone
示例
questCompleteSound: entity.player.levelup

create_quest_level.jpg


本地化支持

以下字段支持本地化,适用于多语言服务器:

  • name
  • questLore
  • questAcceptDialog
  • questCompleteMessage
  • customObjectives 的每个条目内部:dialognpcNamelocation

这使你能够为服务器上的不同语言提供翻译。


权限

如上方表格所述,权限通常是 Strings(字符串)或 String Lists(字符串列表)。但下面我们更详细地讲解你将如何使用它们来锁定和解锁任务。

重要: questAcceptPermissionquestAcceptPermissions 并不是权限插件的节点。EliteMobs 检查的是它自己的内部任务标记,玩家只有在完成某个 questLockoutPermission 与之匹配的任务时才会获得该标记。通过 LuckPerms 或任何其他权限插件授予同样的字符串不会解锁该任务。(temporaryPermissions 则不同 —— 在任务进行期间,它们会作为真正的权限节点被附加,这也正是物品的 permission 门控能与它们配合工作的原因。)

假设你正在制作一系列规划好的任务中的 quest_3,并且不希望玩家在完成 quest_2 之前就能接受 quest_3。我们会这样配置任务文件:

questAcceptPermission: elitequest.quest_2.yml
questLockoutPermission: elitequest.quest_3.yml

通过将 questAcceptPermissions 设为 elitequest.quest_2.yml,我们现在就阻止了玩家在完成 quest_2.yml 之前接受 quest_3.yml。
通过将 questLockoutPermission 设为 elitequest.quest_3.yml,我们阻止了玩家在该任务已在其追踪器中或他们已完成该任务的情况下再次接到该任务。这能防止玩家重复进行任务。

如果你想制作一个只有在玩家完成了一系列任务后才会变得可用的任务,那么你会这样配置任务文件:

questAcceptPermissions: 
- elitequest.quest_2.yml
- elitequest.quest_3.yml
- elitequest.quest_4.yml

如果你希望玩家只在拥有正确的任务进行中时才能拾取某些物品,我们可以通过使用 temporaryPermissions 来实现。我们会在任务文件中用 temporaryPermissions 设一个权限,然后在物品文件中用 permission 设一个相匹配的权限

例如,我们会打开任务文件并添加以下内容:

temporaryPermissions: 
- elitequest.my_cool_item.yml

然后我们会打开物品文件,在我们的例子中即 my_cool_item.yml,并添加以下内容:

permission: elitequest.my_cool_item.yml

现在两个文件拥有了相匹配的权限,这应该会让我们的物品只在玩家拥有正确的任务进行中时才掉落。

动态任务

动态任务(Dynamic Quests)是由 EliteMobs 自动创建并刷新的程序化生成任务。与在配置文件中定义的自定义任务不同,动态任务无需手动设置,并会随每位玩家的进度而适应调整。

工作原理

  • 任务层级: 玩家的动态任务层级根据其战斗等级推算:tier = combatLevel / 5,并限制在 1 到 20 的范围内。例如,战斗等级为 45 的玩家会获得第 9 层的动态任务。任务本身(及其奖励)会缩放到玩家的实际战斗等级,该等级被限制在 1 到 100 的范围内。
  • 每层 3 个任务: 对于 20 个任务层级中的每一层,系统每次都恰好生成 3 个随机任务目标。玩家会被提供与其当前层级相匹配的 3 个任务。
  • 自动刷新周期: 动态任务目标池每 60 秒(每 1200 刻)重新生成一次。当任务池刷新时,新目标会替换旧目标,从而为玩家提供轮换的任务选择。
  • 动态副本适配: 当玩家进入一个指定了特定等级的动态副本时,他们所有进行中的动态任务都会适配以匹配该副本的怪物等级。任务等级、目标和显示名称会相应更新,使任务始终与副本内容相关。

队伍与共享击杀计数

任务始终属于个人,但成员获得击杀计数时,同一世界且位于 sharedProgressRange 内(Party.yml 中默认128格)的在线成员也会推进匹配的进行中击杀目标。收集物品、NPC 对话和竞技场目标不会共享,位于无关活动实例中的玩家也会排除。请参阅队伍系统