Quick start tutorial - MikuSnow/BetonQuest GitHub Wiki

快速开始教程

首先,你可能想知道这个插件是如何工作的. 如果你想使用箱子界面,那么修改 config.yml 文件中的 default_conversation_IOchest, 保存之后,控制台输入 /q reload 即可.

然后登陆游戏,放置一个彩色的粘土块. 然后在上门放置一个头颅,然后再粘土块上面放置一个木牌,并且写上下面的文字:

[NPC]
Innkeeper

完成之后. 右键头颅. 就可以显示对话啦. 如果没有任何反应,确定你步骤正确. 和 Innkeeper 对话获取任务. 他会让你砍一些树. 如果你想,你可以输入 /journal 获取一个任务笔记来查看任务进度. 现在开始,不要破坏任何木头,否则插件会增加你需要砍树的数量!去寻找一些树木来砍!砍了16个木头后,你可以去找 Innkeeper 来获取任务奖励啦.

使用 事件(events) 和 条件(conditions)

现在你知道一个常见任务是如何工作的了,是时候开始尝试自己写任务了.让我们从事件开始. 我们不会从对话开始,因为这种就用到了大量的事件和条件, 所以我们先来熟悉一下他们! 你可以在 参考 章节中引用的事件也可以学习当前教程!

事件(Events)

default 文件夹中打开 events.yml 文件. 在最后添加一行文字如下:

foo: message 你好,梦世界!

这是一个事件的指令。BetonQuest将使用他来确定这是什么类型的事件,和它究竟应该做什么。 foo 对应名字, message 对应类型 你好,梦世界! 则告诉了 message 类型需要显示什么. 在这种情况下, 如果你运行 foo 事件, 它将显示给你 你好,梦世界! 的文字。现在保存文件, 控制台输入 /q reload 指令,然后输入 /q e <name> foo 指令 (q 相当于 quest 的缩写, e 相当于 event 的缩写, <name> 是你的游戏ID foo 对应的是事件名称)。 它将会在你的聊天窗口显示白色的 你好,梦世界!

来让我们创建第二个事件, 更加复杂的一个事件。 就先从 teleport 入手。 正如你看到的 事件列表, 他需要参数, 坐标。按下 F3 然后查看你当前的坐标 . 然后再 events.yml 文件中添加新的一行,内容如下:

bar: teleport x;y;z;worldname

保存文件, 重载插件,然后使用命令执行当前事件. 它应该会把你传送到指定位置。

恭喜你,你刚刚创建了第一个事件。 让我们继续和其他事件一起做些实验. 你可以在 Events list 章节中找到它们。一旦你看完了他们,那就让我们来学习条件章节。

条件(Conditions)

打开 conditions.yml 文件,然后在尾部添加新的一行:

foo: location 100;200;300;world;5

你可以看到我们又以 foo 命名了这个条件,就如同 foo 事件一样。 其实他们并没有任何关联。条件和事件名字是完全不同的, 所以你不用担心重复命名。 现在让我们看下上面那段文字的说明。location 是条件的一种, 这代表着,我们会检测玩家是否在坐标附近。 注意一下最后的一个变量, 5. 这代表着你可以离指定坐标最远5格。然后保存文件,重载插件把。

然后走到指定的坐标, 使用指令 /q c <name> foo (ccondition 的缩写)。 它应该显示 "检查条件等等: true". 我们需要注意的是最后的, true. 这意味着你满足了条件:你站在离坐标半径5格内的位置,然后移动两格左右再运行一次命令。你依然可以看到之前的提示,再移动四格并且运行命令。这次,提示会变成 false 。你现在离坐标已经超过了五格距离。懂了吗?很好!

现在,我将会向你展示最基础的条件使用,打开 events.yml , 在foo最后添加 conditions:foo 。 顺便说一下, 重命名 foo 事件为 baz, 这样名字不会混乱. 然后,你添加的一行应该是这样子的。

baz: message Hello world! conditions:foo

现在 baz 事件 只会在符合 foo 条件的情况下触发。 重载插件, 走远点,运行 baz 事件。 无效,什么事情也不会发生。 这是因为你没有满足 foo 条件。 走到之前设定的坐标五格之内,然后运行 baz 事件。 它将正确的显示 你好,梦世界! 的信息.

非常好,我们可以这样添加条件, 但是你可能有个新的疑问:如何设置当玩家在范围 之外 的时候显示指定信息? 不用担心, 你不用再重新添加 inverted_location 之类的条件, 你可以很简单的设置。 否定的意思与之前完全相反,比如之前设定的五格范围内,现在变成了,只要不在那个范围内都会判定为符合条件。实现否定只需要打开 events.yml 然后再 foo 条件前面添加一个英文字符的感叹号!, 如同下方

baz: message Hello world! conditions:!foo

这代表着 "当 不满足 foo 条件的时候显示信息 你好,梦世界! 。保存文件重载插件,然后在坐标范围之外执行事件来看看是否成功运行。

基本的标签(Basic tags)

现在你知道了如何使用条件与标签,我将想你展示什么是标签。创建一个新的事件:

add_beton_tag: tag add beton
del_beton_tag: tag del beton

这种命名可以让你很好的知道它代表着什么.。假设你有100个事件如下, foo24, bar65, baz12 等等, 我想你会疯了的。 所有, add_beton_tag 事件在这代表给玩家添加 beton 标签, del_beton_tag 移除标签. 保存文件重载插件,然后运行这个事件。 嗯。。。有什么事情发生了吗? 输入 /q t <name> 指令(ttags 的缩写)。 会给你显示一些列表条目, 现在注意 default.beton, 其余的条目都是归属于客栈老板的。 好了, default 是标签包的名字, 然后 beton 是标签的名字, 如同定义 add_beton_tag 事件。 现在运行 del_beton_tag 事件。 default.beton 从列表中消失了! 你现在明白了如何添加与删除标签。

标签在 BetonQuest 中是最棒的功能之一。 只需要使用 tag 条件即可. 打开 conditions.yml 然后添加一行

has_beton_tag: tag beton

你可以想象,tag 是一个条件的类型(如同 tag 事件,但是他们不是同一种东西,一个是事件,一个是条件),并且 beton 是一个标签名。你不需要指定 default.beton,当然,如果你想要也是可以的。现在保存文件,然后使用指令运行它。当你删除了 del_beton_tag 后应该会显示 false,重新添加 add_beton_tag 事件,然后检查 has_beton_tag 条件,现在应该会显示 true

你现在知道这个系统又多强大了吧!利用这个系统你可以做很多功能,比如你可以设置,NPC在第二次或以上遇到玩家,会和玩家说已经”欢迎回来”

创建目标(Creating objectives)

是时候写一些目标啦! 打开 objectives.yml 文件,然后添加新行:

kill_creepers: mobkill creeper 3 events:bar conditions:has_beton_tag

现在让我们分析它. kill_creepers 是当前目标的名字. mobkill 是一个类型。在这种情况下,玩家想要完成目标,不得不杀死一些生物。creeper 是生物的一个类型,3 是指要杀死3个苦力怕。events:bar 表示当玩家杀死了3个苦力怕后,bar 事件将会运行(之前设置的坐标事件)。conditions:has_beton_tag 则表示玩家必须拥有 beton 标签才能击杀苦力怕来完成目标。保存然后重载插件,运行 /q o <name> add kill_creepers 指令(o 是 objective的缩写)add` 为添加目标。

现在你可以输入指令 /q o <name> 来查看你的目标, 这将显示你所有正在计激活的目标. 目前,他应该显示的是 default.kill_creepers。然后移除 beton 标签,然后找一些苦力怕来击杀。 当你击杀三个的时候,你会发现,啥事都没发生。这因为 has_beton_tag 条件未满足, 所以你没法开始完成你的目标。现在讲beton 标签再次添加回去,然后击杀三个苦力怕,当你击杀第三个之后,你会被bar 事件给传送到指定坐标。

恭喜你,现在你知道了如何使用目标了。你需要尝试其他的类型,来完成你的任务编写。下面我们可以来学习如何写一段自定义对话了!

写出你的第一次对话(Writing your first conversation)

现在,你学会了事件,条件和目标,是时候开始创建一段对话了。在 conversations 目录中,你可以找到 _innkeeper.yml_文件,这是自带的一个任务对话。现在创建一个新的文件,比如 miner.yml 。 然后输入下面的文字(最好不要复制,如果你亲自写的话,会更好的帮助你理解):

quester: Miner
first: greeting
NPC_options:
  greeting:
    text: 嘿,伙计,看这里!

这是最基本的对话格式。NPC名字叫做 Miner 当你与他对话的时候,他会向你说一句 嘿,伙计,看这里!。 然后对话结速,因为你没有设定其余的选项。

你现在需要将当前对话连接到NPC身上。你可以在 main.yml 文件中设定。如同你在 inkeeper.yml 文件中看到的 Innkeeper 单词。 就像教程最开始那样,还记得吗? 现在在Innkeeper下面添加新的一行 Miner: miner.yml, 保存插件,然后重载服务器。然后如同一开始创建那样,防止木牌,创建一个NPC,然后右键头颅。

你猜发生了什么?对话一开始就结束了。NPC说了一句话,然后就没有下文了。所以我们需要像下面这样去编辑: NPC_optopns: greeting: text: 嘿,伙计,看这里! pointers: hello,bye player_options: hello: text:你好! bye: text: 我在赶路,抱歉!

当你保存并且重载之后,与NPC对话,你能发现有两个对话了分别是: 你好! and 我在赶路,抱歉! 随便选择一个选项,然后对话将会结速,这是因为你没有定义后续的选项。

我们继续添加新的选项,比如weather 内容为: 今天天气真好!, 然后使hello 选项连接到这个上面。当你保存并且重载后,当你对NPC说你好!的时候,NPC会对你说今天天气真好!,我想到这个时候,你就明白他是如何工作的了:

NPC_options:
  greeting:
    text: 嘿,伙计,看这里!
    pointers: hello, bye
  weather:
    text: 今天天气真好!
player_options:
  hello:
    text: Hello!
    pointer: weather
  bye:
    text: 我在赶路,抱歉!

现在,每当你和NPC对话的时候,他都会说一模一样的内容。如果设置成第二次聊天,你会告诉他你的名字,这样会不会很棒?我们可以利用 标签 来实现。定义一个 meet_miner 事件 和 has_met_miner 条件。 当你和NPC第一次聊天的时候,他会通过 标签来检查你是否和他是第一次见面。如果没有,他会给你打上一个见过面的标签, 然后下次你们聊天的时候,他就可以知道你的名字啦。

重命名 greeting NPC option选项为 first_greeting。 添加 meet_miner 事件和否定 has_met_miner 条件 (否定条件是因为这只会在第一次见面才会触发)。 你需要使用''字符将否定条件括起来, 如下:

first: first_greeting
NPC_options:
  first_greeting:
    text: 嘿,伙计,看这里!
    condition: '!has_met_miner'
    event: meet_miner
    pointers: hello, bye 

这代表着,first_greeting 条目会在玩家 通过 has_met_miner 条件判断的时候生效(因为玩家未对话,所以未被打上对应的标签。)。当选项被使用,将会触发 meet_miner 事件,并且显示 hellobye 的选项。下面,如果给玩家打上了标签,那么当玩家第二次与NPC对话的时候,选项不就没有了吗?是的,所以我们需要添加其他的选项来使玩家能够正常对话!让我们看看下面的例子:

first: first_greeting,regular_greeting
NPC_options:
  regular_greeting:
    text: Hi %player%!
    pointers: hello, bye

这个选项没有任何的使用条件,如果当 first_greeting 失败,NPC总会选择这一个条目来进行对话。现在,让我们看看 %player%。这是一个变量,这个编辑在执行的时候将会替换成你的名字。当然这里有许许多多的变量可以使用,在 Variables List 章节中你可以看到他们。保存然后重载,如果你做的都没问题,那么第一次对话的时候,NPC会把你当成一个旅客,第二次就会知道你的名字了。

下面是全部的对话例子,你可以参考一下来学习:

quester: Miner
first: first_greeting,regular_greeting
NPC_options:
  first_greeting:
    text: 嘿,伙计,看这里!
    condition: '!has_met_miner'
    event: meet_miner
    pointers: hello, bye 
  regular_greeting:
    text: 你好呀,%player%!
    pointers: hello, bye
  weather:
    text: 今天天气真好。
player_options:
  hello:
    text: 你好!
    pointer: weather
  bye:
    text: 我在赶路,抱歉!

现在,你应该尝试做更多的对话,你可以通过阅读 innkeeper.yml 来学习,试着了解一步一步是如何工作的。下面你可以尝试自己独立做一个简单的任务,比如与矿工对话,他会要求你找一些矿石,然后使用熔炉冶炼,最后做出铁质盔甲拿给矿工。

你可以在其他章节目录中查看更多的物品,目标,事件等说明,当你把这些都理解透彻了,相信你可以很容易的就创建出各种任务。

⚠️ **GitHub.com Fallback** ⚠️