Quests - Chunk7w/mappet GitHub Wiki

任务 是一种,可以让玩家为获得奖励而做一些事情的机制。你可以利用这一机制,来奖励玩家酷炫的战利品,或者通过任务链让玩家沉浸在剧情中。

玩家可以在玩家记录表(默认为 J 键)界面,查看当前进行的任务,任务可以通过对话任务链以及 /mp quest 子命令来接受和完成。

可以在 Mappet 仪表板内,对任务进行管理。选择仪表盘左侧边栏的第二个面板,即可打开任务编辑器。

编辑

当你选中或创建了一个任务后,你就会看到一个类似这样的编辑器:

任务编辑器

任务的标题与描述

如其本身所述,它们是任务的标题与描述。标题可以让你用简单的文字来概括任务的要点,而描述则可以让你深入了解任务的细节,如提供地点、内容、人物等细节。

它们会在对话任务视图中出现,类似于这样:

任务

:为了方便编辑,你可以右键描述文本框,并选择 全屏编辑...

描述的格式化符号

对于描述参数,你允许使用一些简单的格式符号。输入 \n 会被识别为换行,所以如果你想另起一个段落的话,则需要输入两个换行符,即 \n\n

你还可以使用 [ 来代替 § 符号,来实现设置颜色格式,详情可查看 Minecraft Wiki 中的 格式化代码 页面。

:以上内容都是适用于当前的 Alpha 版本的真实情况。

可以取消

可以取消 开关,用于定义玩家是否可以在玩家记录表中拒绝该任务。如果任务不能取消,则拒绝按钮将无法点击:

取消按钮不可用

目标

目标 即你给玩家设置的目标,决定了玩家为了完成任务所必须要做的事情。目前,模组可以使用以下目标:

  • 击杀目标 - 该目标需要玩家击杀特定数量的生物
  • 收集目标 - 该目标需要玩家获得特定的物品
  • 状态目标 - 该目标会在某个状态改变时满足条件,从而会被标记为完成

你可以点击 目标 标签行右侧的 ➕ 图标来添加目标。点击之后,会弹出一个下拉菜单,即可以选择你想添加的目标。如果你想删除一个目标,可以右击它所在的区域,并选择 ➖ 移除该目标的上下文菜单项目。

自定义目标信息

所有目标都支持对目标信息进行自定义。通过这个功能,你可以自定义玩家在目标窗口所看到的内容。这有助于将语法较为复杂的语言的目标信息进行本地化,使目标信息更加模糊(如果你想让玩家看谜语的话),或者只是对目标信息进行自定义,以适应任务的语言(例如,你可以让它显示成「消灭 10 只蟑螂」,而不是默认的「杀死蟑螂(0/10)」)。

击杀目标和收集目标支持以下可替换的变量:

  • ${count} - 已击杀多少生物 / 已收集多少物品?
  • ${total} - 需要击杀多少生物 / 需要收集多少物品?
  • ${entity} - 显示需要击杀的生物的名称(仅适用于 击杀目标
  • ${name} - 显示需要收集的物品的名称(仅适用于 收集目标

举个例子,如果是击杀目标,假设你设置了一个叫做 消灭末影螨 的任务,需要玩家击杀 15 只末影螨。以下是自定义目标信息:

消灭 ${count}/${total} 只末影螨

击杀目标

击杀目标 有多个需要你留意的参数。它们分别是:实体 ID、数量以及匹配 NBT。

选取实体 ID 按钮会打开一个弹窗模块,其中包含了游戏中所有可用实体的列表。例如,如果你选择 minecraft:pig,那么玩家就需要击杀一只猪。需要注意的是,并非所有实体都是可以击杀的,也就是说像船、物品展示框等实体是无法击杀的。如果你不确定实体能否被击杀,可以先进行测试。

数量 参数决定了需要击杀多少与实体 ID 和匹配 NBT(如果有写参数的话)相匹配的实体,才会把给定的目标判定为完成。

最后,匹配 NBT 参数用于输入附加的 NBT 数据,并用于和被击杀的实体进行比较。例如:

  • 如果你想要指定小僵尸,则需要在实体 ID 选择器中指定 minecraft:zombie,并在 匹配 NBT 参数中填写 {State:{Id:"test"}}
  • 如果你想要指定某个 NPC ID 为 test 的 Mappet NPC,你需要在实体 ID 选择器中指定 mappet:npc,并在 匹配 NBT 参数中填写 {State:{Id:"test"}}

进阶技巧™:如果你想获得适用于匹配 NBT 的标签变量,最好办法是击杀那个特定的生物,捡起它的伪装,即可查看它的 NBT 数据,你可以在伪装编辑器中进行这一操作。

收集目标

收集目标只有一个参数,即物品槽,只需点击物品槽,随后挑选物品即可。设置好后,玩家需要收集这一特定的物品,并需要达到这组物品的右下角所显示的数量。

需要注意的是,如果物品的 NBT 标签包含有自定义的 NBT 数据,玩家必须准确地收集到这个物品,但物品的耐久度不会参数匹配。

状态目标

状态目标会通过监测器来判断目标是否完成。它 只会在状态得到更新的时候 进行监测,例如通过 /mp state 命令更改了状态。

从技术上讲,你可以把任何表达式条件设为状态目标,包括那些不依赖于状态的表达式或条件,但你必须不断地更新一些状态的全局(~)状态,例如每红石刻更新一次。

触发器

最后一个任务选项是 接受、拒绝和完成任务触发器选项。

正如选项所述,当玩家通过对话直接接受或通过 /mp quest accept 命令被动分配得到任务;从玩家记录表拒绝或通过 /mp quest decline 拒绝任务;以及从对话完成或通过 /mp quest complete 命令完成任务时,这些独立的触发器就会被触发。

机制

这里还有一个你值得去了解的任务机制。

当某个玩家完成了某项任务时,一个值 1 会被添加至全局状态,以及那个特定玩家的状态中去,状态键为 quests.QUEST_ID。所以,如果我完成了一个 ID 为 mchorse.intro 的任务,那么在 ~(全局)和我的玩家状态中,值 1 会被添加至状态键 quests.mchorse.intro 中去(你可以通过完成一个任务并执行 /mp print ~/mp state print YOUR_USERNAME 进行验证)。