• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

GuillaumeVDN的插件文档/QuestCreator/基础内容

来自Minecraft插件百科
Qsefthuopq留言 | 贡献2020年11月24日 (二) 02:14的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索
GuillaumeVDN的插件文档
页面

GuillaumeVDN的插件文档 · 迁移

所有插件都有的常见内容

配置 · 杂项 · 关联

QuestCreator

基础内容 · 示例 · 详细特性 · 高级内容 · 关联

视频

QuestCreator介绍(英语)

我制作的这个视频涵盖了大多数核心特性的介绍。如果你是刚使用这款插件,那么我推荐你从头看到尾。在视频下方的描述里写有了时间点,你可以根据需求跳到特定的时间点观看。

https://www.youtube.com/watch?v=5Lwh9qGReVk

QuestCreator介绍(西班牙语)

maxmar628用西班牙语介绍了QuestCreator。

https://www.youtube.com/watch?v=ARukGd7m5zc

QuestCreator介绍(英语)

InkBat制作的介绍任务结构的视频。这个视频有一段时间了,因此配置部分和现在的已截然不同。

https://www.youtube.com/watch?v=KjZ9gaJlObI

文件结构

这一部分描述了 /plugins/QuestCreator/ 内的文件结构。

配置

主要的配置文件是/config.yml,该文件包含了不少有用的设置。文件内的注释详细地解释了每一个选项。

你可以在对应的.yml文件内配置用户、服务器和全局变量。

点击下载默认配置文件

元素存储位置

所有元素(任务模型、任务池、GUI、全局分支、全局目标等)都存储在对应的文件夹内:

  • /quest_activators/
  • /quest_models/
  • /quest_models_functional/
  • /quest_groups/
  • /quest_pools/
  • /guis/
  • /global_branches/
  • /global_conditions/
  • /global_gui_items/
  • /global_objects/
  • /global_time_frames/

在每个文件夹里,每个元素都是一个 .yml格式的文件。比如,/quest_models/my_quest.yml 是id为my_quest的任务模型。id对于大小写敏感(须小写)。

你也可以创建子文件夹来更清晰地给文件分类。

数据

如果你使用JSON作为数据板的后端,数据文件将保存在/plugins/QuestCreator/data_v6/下。删除该文件夹将导致所有当前用户数据的丢失(活跃中的任务、任务历史、用户变量等)。需要注意的是,任务点数存储在GCore的数据统计系统中,在/plugins/GCore/data_v8/statistics/下以JSON的形式存储。

任务介绍

任务模型

你最先需要区分的概念就是“任务”和“任务模型”。

“任务模型”是配置文件,其包含在玩家进行任务时可能会遇到的种种可能性相关的配置。任务模型位于/quest_models/。

“任务”代表活跃中的任务模型。每名玩家(或多名组队玩家)可能会有不同选择和进度的“任务”实例。

理解分支和目标

进行中的任务至少拥有一个已激活的“分支”以及分支内的目标。你可以将分支视作“任务目标的容器”。

任务目标代表以下两者:

  • 玩家必须完成的任务对象
  • 或是服务器必须执行的操作(比如发送消息、播放音效、操控实体等)

在任务中,虽然每个分支只有一个活跃的目标,但你可以给任务设置多个分支。

以下是一份活跃任务可能的配置结构草稿(并不是实际的配置):

my_active_quest:
  branch_1: *active
    - object_1
    - object_2
    - *object_3
    - object_4
  branch_2: *active
    - *object_1
    - object_2
  branch_3: not active
    - object_1
    - object_2
    - object_3
    

在任务模型中共有3个分支,但只有2个分支活跃在玩家的任务中。在这2个分支里有很多种可能的目标,但在每个分支中只有一个是活跃的目标。

实践

让我们将理论付诸于实践吧:


branches:
  branch_1:
    starts_directly: true
    starts_at: object_3
    objects:
      object_1:
        # …… 此处省略目标设置
      object_2:
        # …… 此处省略目标设置
      object_3:
        # …… 此处省略目标设置
      object_4:
        # …… 此处省略目标设置
  branch_2:
    starts_directly: true
    starts_at: object_1
    objects:
      object_1:
        # …… 此处省略目标设置
      object_2:
        # …… 此处省略目标设置
  branch_3:
    starts_directly: false
    starts_at: object_2
    objects:
      object_1:
        # …… 此处省略目标设置
      object_2:
        # …… 此处省略目标设置
      object_3:
        # …… 此处省略目标设置

这份配置里有很多信息,这些信息混淆了我们迄今谈到的不同概念。

分支配置下的每个分支都代表一个可能的分支,它们拥有不一样的标识符(branch_1、branch_2……)。

每个分支的starts_directly布尔设置用于指示该分支是否在任务开始时自动开始。branch_3的布尔值为false,该分支会之后手动开始。

objects下方是可用的任务目标。你可以在不同的分支内使用相同的目标名。

goto的重要性

虽然分支有可以目标的“列表”,但这些目标并不一定按顺序执行。比如在上面示例中的branch_1,你可以决定先运行object_3再运行object_2。

每个分支的starts_at设置用于指示插件应该在分支开始时开始哪个任务目标。

同一目标可以重复执行,比如:object_3 > object_2 > object_1 > object_4 > object_1 > object_4 > …… 并在满足特定条件时停止循环。

简而言之,从我们看到这里为止,这个插件还“不够聪明”,不能检测出它下一步应该运行什么目标,因为你实际上已经从“固定的列表顺序”中解放出来了。你必须向插件表明它下一步应该运行什么目标,或者更笼统的说是“它应该执行什么goto”。

让我们将goto加入到分支branch_1中吧:

object_1:
  # …… 此处省略目标设置
  goto: OBJECT object_4
object_2:
  # …… 此处省略目标设置
  goto: OBJECT object_1
object_3:
  # …… 此处省略目标设置
  goto: OBJECT object_2
object_4:
  # …… 此处省略目标设置
  goto: OBJECT object_1

这份配置遵循了示例中的顺序:object_3 > object_2 > object_1 > object_4 > object_1 > object_4 > ……,即使由于未设置任何条件,目标1和4会无限循环。条件与逻辑将在本文档后面解释,而该份示例清晰地解释了goto的作用。

所以在这里,你使用goto类型表示你希望在当前目标完成后运行同一分支的目标。但实际上,goto的触发方式不仅仅是目标,它们可以启动或停止分支、完成任务、操作其它任务等。请查看这里的goto类型列表。

在示例中的分支branch_3不会自动开始。 我们可以在任务的任意阶段开始该分支!比如在第二个分支结束时开始该分支:

  branch_2:
    starts_directly: true
    starts_at: object_1
    objects:
      object_1:
        # …… 此处省略目标设置
        goto: OBJECT object_2
      object_2:
        # …… 此处省略目标设置
        goto: BRANCH branch_3

当玩家完成object_2时会开始分支branch_3。因为branch_2的goto不会调用同一分支的目标,所以该分支会停止。别担心,你还有很多方式开始其它分支,而这只是个示例。

最后请注意,如果没有活跃的分支(由于某个地方缺失了goto),任务就会停止。

简易示例

在这个复杂的示例中你可以看到不同的概念。该示例是NPC任务的实际用例。

branches:
  unique_branch:  # 这是个简单任务,因此我们只需要一个分支
    starts_directly: true  # 默认为true,自动开始分支
    starts_at: START_NPC_DIALOG   # 与NPC对话开始任务
    objects:
      START_NPC_DIALOG:
        # …… 此处省略对话设置
        goto: OBJECT FARM_STONE
      FARM_STONE:
        # …… 此处省略挖掘目标设置
        goto: OBJECT DELIVER_ITEMS_TO_NPC
      DELIVER_ITEMS_TO_NPC:
        # …… 此处省略交付物品给NPC的设置
        goto: OBJECT END_NPC_DIALOG
      END_NPC_DIALOG:
        # …… 此处省略对话设置
        goto: QUEST_SUCCESS  # 停止并标记任务为已完成

提示:我知道goto系统可能看起来很复杂,但实际上,特别是对于简单的任务,你的goto会按照列表顺序执行。对于更高级的任务,goto带来的自由度必不可缺。没有goto你就难以实现执行对话、循环、逻辑等功能。QuestCreator的设计理念不是简单,而是强大。熟能生巧,多练练你就会用了。:D

更多目标和模型设置

显然任务模型中不只有分支和目标,还有很多其它设置。

点击查看目标设置列表

点击查看模型设置列表

激活器介绍

现在你应该创建了一个任务了吧?但玩家怎么开始任务呢?

你可以给予玩家/quest start [任务] 指令的权限来开始任务,你也可以设置一个可查看并管理全部任务的GUI。

你还可以让玩家与Citizens的NPC对话来开始任务,或在玩家进入特定区域时自动开始任务。

而这就是激活器的主要用途:在特定条件下激活任务。激活器位于/quest_activators/。

给任务添加激活器很简单:创建激活器及其设置,将激活器加到你的任务模型中:

activators:
  - my_activator

如果my_activator是物理激活器,任务会在玩家与之交互时开始。否则激活器会在满足特定条件时激活任务。

点击查看激活器及其设置。

任务池介绍

你可能想要设置不同的每日或每周任务。

而这就要用到任务池。任务池位于/quest_pools/。

理解任务池处理方式

任务池并不会直接控制任务的开始。任务池只能“处理”每段时期的任务(一段时期指当前一天/一周/……):计算在这个时期内会有哪些任务。

当玩家连接到服务器时,任务池会检测是否已处理该玩家该时期的任务。比如阶段为每日,当GuillaumeVDN在当天15:30首次连接到服务器时,此时任务池未处理该玩家的任务。然而此时任务池已处理在当天14:00连接到服务器并完成每日任务的玩家Notch的任务。

当任务池在一段活跃时期内处理了玩家的任务后就不再处理,直到下一个时期。

任务券

和普通的任务管理不同的是,任务池使用“任务券”来管理任务。任务池处理其中的任务时会给予玩家任务券。

当玩家开始任务时,插件会检测任务是否在池中并且玩家是否有该任务的券。

玩家每开始一次任务就会消耗一个任务券。玩家用光了任务券就无法再次开始任务,直到下一个时期任务池再次处理任务。

如果每日任务的券在今天的18:30被消耗,则只有在第二天才会刷新任务券。

任务池设置

点击查看任务池及其设。

游戏内编辑器

尽管我个人喜欢通过YAML文件进行编辑(因为这样可以有一个更全面的视角),你也可以用游戏内编辑器来编辑几乎所有的东西(输入/qc edit 打开)。

不过,我建议你先阅读一次文档,对插件有一个大致的了解。游戏内编辑器只是包含了所有的设置,并提供了编辑工具,但它实际上并没有“解释”任何东西("什么是任务模型","什么是激活器","如何这么做",等等)。所以,在进入游戏之前,你最好先了解这些内容!

通过文件编辑和在游戏内编辑的全部设置都是一样的。增加深度(YAML的缩进数)会打开子菜单。

每个基础值在GUI内都有图标和不同的点击类型。你可以在这里查看对设置内的一切选项的解释。

你可以在菜单中选取或快捷导入大多数我之前所列举出的选项(Citizens NPC、点击类型、方块类型、附魔等)。

我建议你自己进游戏感受这些功能 ^_^

由于我使用了自定义的YAML读取器,插件会在重写文件时保留文件的设置顺序和注释,所以你不必担心注释丢失的问题。