- 欢迎来到Minecraft插件百科!
- 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
- 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289
QuestCreator/教程
全面教程
这个教程主要由 Lordinouille 编写(十分感谢 :D), 并由 PYRRH4 审核. 如果你想要购买这款插件或是想要了解如何使用这款插件的话这个教程就很有用.
这个教程写于 QuestCreator v4.0.0 版本之前所有没有 'pseudo-scripting' 特点的解释.
教程的第一个目的是学习如何使用文件创建一个任务. YAML 文件更加准确且你可以掌控更多东西. 但是如果你觉得配置文件很麻烦, 你完全可以使用游戏内的编辑器但还是建议你阅读这部分教程.
请毫不犹豫地先看一下这一页面,这个页面包括了默认的示例任务文件, 你可以在这里看到"行为"的解释 : https://github.com/PYRRH4/QuestCreator/wiki/Create-a-quest
如果你对这部分内容不理解,你可以来discord服务器提问. 链接在插件页面 :)
任务之始
任务配置主要分成两部分, 设置和目标 :
- 设置为任务的常用参数, 你可以设置任务如何开始、完成任务所需时间、开始任务缩写权限、GUI菜单物品等.
- 目标按任务分支分组并被视为任务的不同路径目标(同一个意思).目标分为两种, 玩家 和 服务器.
这两部分的详解请看下面.
设置
设置的wiki页面 (建议阅读) : https://github.com/PYRRH4/QuestCreator/wiki/Create-a-quest
常用设置
位于文件开头 :
setting1: ... setting2: ... setting3: ...
实际设置:
saving: ENABLED name: 'Example Quest' description: - '&7Just a sample quest' max_concurrent_instances: -1 max_concurrent_instances_queue: true min_players: 1 max_players: 1 max_completions: 1 time_limit: 0 cooldown: DISABLED actionbar: '' send_status_message: true send_objective_update_message: true restricted_worlds: [] permission: ''
你的第一个任务所需的东西 :
saving: ENABLED
为保存任务进度的方式, 共有以下三种:
- ENABLED
- SERVER_EPHEMERIAL
- PLAYER_EPHEMERIAL
请暂时设置为 ENABLED,因为 SERVER_EPHEMERIAL 和 PLAYER_EPHEMERIAL 用于 特殊情况. 一般来说, ENABLED 会保存所有进行中的任务到数据库内, SERVER_EPHEMERIAL 会保存任务直至服务器重启/重载, PLAYER_EPHEMERIAL 保存任务直至玩家离线.
name: '示例任务'
为可视的任务名. 你需要注意的是这个名字不能用于指令. 这和任务 id 不同(.yml的文件名).
description:
任务描述.
max_concurrent_instances: -1
可设置数值,限制全服玩家可同时进行的任务数. 用于与NPC有关的任务, 因为每个玩家都可以和同一个NPC交互来接受任务. 设置为-1 关闭限制.
你也可以更改其他你想要更改的参数.
菜单设置
敬请期待...(咕咕咕)
任务分支
分支为任务的核心. 它包含了设置任务"路径"的目标,你可以用此为任务设置路线抉择或第二个任务目标.
不仅如此, 你可可以用于简洁任务. 何为此言? 如果你在一个任务分支内拥有500个不同抉择的路线,这也许看起来十分复杂且不易于理解.所以 从头开始理清思路很重要.
任务分支Wiki页面(建议阅读) : https://github.com/PYRRH4/QuestCreator/wiki/Quest-branches
开始任务你需要复制粘帖以下内容 :
branches: main: name: '万物之源' auto_start: true starts_at: START_OBJECT objects: START_OBJECT: ... OBJECT_NAME_THAT_I_WANT: ...
所以在这里,我们创建了告诉插件任务存在路径且有要完成的目标的主要分支.
main
为主分支的id, 你可以随意更改id :
branches: main_branch: ...
可以这样
branches: this_is_the_main_branche_with_a_super_dupper_long_name: ...
也可以这样
branches: tapioca: ...
还可以这样
分支就像任务中特殊的路径. 如果在任务的后期,你想把任务分为完全不同的抉择,那么你可以为每个抉择路线创建一个分支,从而“拥有一个干净的配置”。例如:
branches: main: name: 'Meh !' auto_start: true starts_at: START_OBJECT objects: START_OBJECT: ... ... bla, bla, bla, some objects ... and later here we offer a choice to the player. Depending on his choice, we'll either start branch 'choice_tapioca' or 'choice_arabicca' choice_tapioca: name: 'The tapioca branch' auto_start: false (since we don't want this branch to start when the quest begins but only if the player choose tapioca) starts_at: START_OBJECT objects: ... choice_arabicca: name: 'The arabicca branch' auto_start: false (since we don't want this branch to start when the quest begins but only if the player choose tapioca) starts_at: START_OBJECT objects: ...
但这不是必须的,这取决于你是否在一个分支内塞入了大量内容, 我个人推荐你创建更多的分支... 如果你创建了有大量选择和目标的大型任务, 你就会指定你必须要建立分支来使任务更加明确.
让我们深入了解一个分支的结构.
一个分支有3个参数和1个 'box' (目标box).
第一个参数为 name: 'whatever_you_want'
, 这是可以输入 /quest progress 看到的分支名.
第二个参数为 auto_start: true
正如我之前所说,你可以建立多个分支. 如果你设置为true, 这个分支会在任务开始时开始, 如果设置为false,这个分支可以在你想要开始的时间开始.
最后一个参数为 starts_at: name_of_the_object
, 这可以设置开始分支的任务目标.
目标
如果你了解了分支的使用方法的话,让我们继续了解目标吧.
目标的概念
正如在教程开头所说, 任务目标分为两类, 玩家和服务器.
我们这里所说的目标实际上是任务的步骤,它是玩家所遵循的路径
目标可以用分支的方式运行 (也就是最常用到的地方) and more objects can be specified in two cases, if the player succeeds or fails the quest, but that'll be explained later. Let's focus on objects in branches for now.
目标的Wiki页面 : https://github.com/PYRRH4/QuestCreator/wiki/Quest-objects
玩家目标
玩家目标是玩家在整个任务中必须完成的目标和行为。一个任务中可以有多个玩家目标
PLAYER_BED_ENTER #玩家必须睡觉才能完成这个目标 PLAYER_BLOCK_INTERACT #玩家必须与一个方块交互才能完成目标 PLAYER_JUMP #玩家必须跳跃才能完成目标 ... 等等, 还有更多的目标类型. 详情查看目标wiki页面.
服务器目标
服务器目标为在任务过程中由服务器执行的行为. 一个任务中可以有多个服务器目标.
SERVER_COMMANDS_PERFORM #以服务器身份执行指令 SERVER_ITEM_GIVE #以服务器身份给予玩家物品 SERVER_ITEM_REMOVE #以服务器身份删除一个物品 (比如: 任务结束时删除任务物品) ... 等等, 还有更多的目标类型. 详情查看目标wiki页面.
目标用法和设置
如果你想要在任务内鼠标目标,你必须明白如何编写和构建目标.
首先要设置的是目标名
举个例子, 你想要设置与NPC谈话的目标, 你必须先给目标起名.
和分支名一样,可随意设置名称.
1 或 TALK_TO_SOMEONE 或 TALK_TO_NPC 或 STEP-1 或 STEP_1_WHERE_I_HAVE_TO_TALK_TO_AN_NPC 或 THENAMEOFTHEOBJECTIN1WORDLINE ... 等
给第一个目标起名吧
Now I have the name of my object I will need it's type. Because it's cool to name things, but we want it to execute an action or give an objective So let's write :
TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT
Good job, now the plugin knows what TALK_TO_SOMEONE will be used for. You just wrote that it will be used for the type of object PLAYER and this object is an NPC_INTERACT.
Well, so as you can see, say to the plugin that TALK_TO_SOMEONE is an PLAYER_NPC_INTERACT won't be enough, the plugin wants to know other things, and they are called parameters of the object.
Let's write them down.
TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT item: type: DIAMOND amount: 32 must_have_in_hand: true remove_after_action: true npc: 15 amount: 1
Let's explain what we added.
We added 3 things : item, npc and amount
Let's start with npc :
Here npc: 15
is a mandatory parameter, you declare to which NPC you want the player to interact with.
The item:
is an optional parameter, it is here in the case you want the player to interact with an NPC with an item in hand, and that item will be taken from his inventory when the object is completed.
What's special here is that item:
has it's own parameters. So objects parameters can also have their own parameters, like the location:
, we will talk more in-depth of that after...
And finally the amount: 1
is the amount of time the objects has to be done to be considered as completed (so in our case how many times the player must interact with the NPC).
So let's clarify what we have done here :
- We created an object called TALK_TO_SOMEONE
- With type PLAYER_NPC_INTERACT
- We said that the player will have to interact with the npc with id 15, and he'll have to do it one time
- And that he will need to have 32 DIAMONDS in his hand that will be taken from his inventoryonce he clicked on the NPC
You think there are too much parameters to learn ? Don't worry ! Every parameters and optional settings are listed here : https://github.com/PYRRH4/QuestCreator/wiki/Quest-objects
You just created an correctly structured object
*BUT WAIT, we have a problem Youston ! A problem that you will often have if you forget to rigorously write down your quests.
It's cool we have our object but now what are we supposed to do with it ?
As I said before, objects are like the path of the quest and they have to be linked together to have a clean path.
So let's say that after our object TALK_TO_SOMEONE we want this someone to start a discussion with you.
Let's write it down with the method seen before :
TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT item: type: DIAMOND amount: 32 must_have_in_hand: true remove_after_action: true npc: 15 amount: 1 THIS_SOMEONE_TALKS_TO_YOU: type: SERVER_MESSAGE_LIST messages: - 'Yeah man I''m talking to ya' - 'WAIT 3' - 'You just gave me 32 diamonds, now I feel happy' - 'It''s the minimum to talk to ya no ?' - 'WAIT 5' - '&cLove red color m8'
So I have created a new object called THIS_SOMEONE_TALKS_TO_YOU with the type SERVER_MESSAGE_LIST and then precised the parameters with messages:
(and because it's a list i put -
before my messages). This object can be found here with all the others : https://github.com/PYRRH4/QuestCreator/wiki/Quest-objects
*Yay ! Another object, that's fantastic, I understand the idea. But how are we supposed to link them together ? *
**We will use the last parameter : goto:
Literally like a path, you will tell to the plugin where you have to go when the object is completed, and you will do this with goto:
Let's add it :
TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT item: type: DIAMOND amount: 32 must_have_in_hand: true remove_after_action: true npc: 15 amount: 1 goto: OBJECT THIS_SOMEONE_TALKS_TO_YOU THIS_SOMEONE_TALKS_TO_YOU: type: SERVER_MESSAGE_LIST messages: - 'Yeah man I''m talking to ya' - 'WAIT 3' - 'You just gave me 32 diamonds, now I feel happy' - 'It''s the minimum to talk to ya no ?' - 'WAIT 5' - '&cLove red color m8' goto: QUEST_SUCCESS
goto:
is a special and mandatory parameter, NEVER FORGET to put it in the last line of each of your objects, except for some (rare) special ones (will be explained later).
It can admit multiple values like QUEST_SUCCESS or QUEST_FAIL (and other) but here let's focus on what I have written down (other values are, again, detailed here : https://github.com/PYRRH4/QuestCreator/wiki/Quest-objects)
So with the goto:
added, we say to the plugin that when TALK_TO_SOMEONE has been completed he has to go to the OBJECT THIS_SOMEONE_TALKS_TO_YOU And when THIS_SOMEONE_TALKS_TO_YOU is completed (meaning that each lines of the message list has been showed up), the plugin has to go to QUEST_SUCCESS (a way of ending the quest, marking it as succeeded).
Result :
We now have a path where you will have to speak to the NPC 15, with 32 diamonds in hand that will disappear once you clicked, and once you clicked on him he will start to say to you strange things with strange delays between each line and a colored line at the ending.
Ta-daaam ! You created your first working path of quest ! It will be the most important things you will have to write in the YAML of your quests.
Precisions and deepening about objects
We are starting to have a lot of tools in hand to create our quest, we will see soon how to use them all together to create a quest. But firstly I want to explain you some little things about objects that you will have to understand to create optimized and clean objects.
As I said objects have mandatory and optional parameters.
The mandatory parameters are usually always specified when you copy paste an object on : https://github.com/PYRRH4/QuestCreator/wiki/Quest-objects
But the optional ones aren't directly in the object type. They are on the top of the page.
Let's give them to you here :
name
(optional) is the object name. For instance : "Break 10 cobblestone on the ground"progress_name
(optional) is the short object name. It'll be used in the GUI or in the /quest progress command for example. For instance : "Break cobblestone" message
(optional) is a text that'll be send when the object starts. sound
(optional) is a sound that'll be played when the object starts.post_message
(optional) is a text that'll be send when the object ends. post_sound
(optional) is a sound that'll be played when the object ends. location
is the location settings for the object (detailed below).
The location setting can be either very useful or completely mandatory for some objects.
Let's explain how to use them !
Here's an example of object with a lot of settings in here.
CRAFT_A_PICKAXE: type: PLAYER_ITEM_CRAFT item: type: DIAMOND_PICKAXE amount: 1 name: 'Craft a diamond pickaxe for your friend' progress_name: 'Craft diamond pickaxe' message: '&aI''m showing at the very start of the object, when the player didn''t complete it yet ! So now, you need to craft a diamond pickaxe.' sound: type: VILLAGER_IDLE volume: 1.0 pitch: 1.0 post_message: '&aI''m showing only when the object is totally finished ! Good job crafting this pickaxe man.' post_sound: type: LEVEL_UP volume: 1.0 pitch: 1.0 location: base: world,100,70,100 near: 10 goto: QUEST_SUCCESS
Let's explain this so you understand everything,
I have added name, progress_name, message, sound, post_message, post_sound and location. Those are optional settings (except for objects with location, mostly SERVER objects that need to know where to do their action).
What does it mean ? It means that you can put them in every object and they will work. They are called "generic settings".
name
will be used in things such as /quest progress
and other features of the plugin.progress_name
will be used in /quest progress
and the GUI items. message
is a graphical settings, shown at the beginning, very useful if you want to tell to a player the actual objective he has to do now. It can has multiple lines with colors. sound
is an audio setting works the same way as messagepost_message
is also a graphical settings, shown at the end of the object post_sound
is also an audio setting, and works the same way as post_message
And location can be used almost everywhere. In fact in some case it will be mandatory (again, for some SERVER objects, for example SERVER_BLOCK_PLACE : the server needs to know where to change the block).
Let's show you some examples.
Initial object, it works :
object: type: PLAYER_ITEM_DROP item: type: DIAMOND_PICKAXE amount: 1
With location, it also works :
object: type: PLAYER_ITEM_DROP item: type: DIAMOND_PICKAXE amount: 1 location: base: world,100,70,100 near: 10
... but here I say to the plugin that I want the player to drop 1 DIAMOND_PICKAXE but in a zone with a spheric radius with a center in x 100, y 70 and z 100. If he drops it elsewhere, the object won't complete.
So it can be very useful to do some accurate actions.
But in this object :
object: type: SERVER_WORLDEDIT_SCHEMATIC_PASTE schematic_file: 'schematic_file.schematic'
In this case you tell the plugin to paste a schematic file, but as you may know WorldEdit is a coordinate-relative plugin. In such a case, you have to put the location of the paste origin or it won't work.
object: type: SERVER_WORLDEDIT_SCHEMATIC_PASTE schematic_file: 'schematic_file.schematic' location: base: world,123,13,543
Here you tell the plugin where to paste the schematic, it's happy now !
常见错误和需要知道的东西
错误
一个目标 = 一个目标类型. 你无法把两个目标类型放到一个目标内,你必须创建两个不同的目标并用goto连接
错误配置 :
OBJETC_1: type: SERVER_MESSAGE_LIST messages_sound: VILLAGER_IDLE messages: - '&f[Système de survie] Objectif actualisé : Rendez vous à Oneill en [-1227,180,2715] et donner au [Gérant d''Oneill] le [FRET]' name: 'dialogue2' progress_name: '' message: '' sound: VILLAGER_IDLE post_message: '' post_sound: VILLAGER_IDLE type: PLAYER_NPC_INTERACT item: type: PISTON amount: 1 name: '&7&m-----&f &dF.R.E.T&f &7&m-----&f &8(Quest)' must_have_in_hand: false remove_after_action: true npc: 256 name: 'DONNER_FRET_ONEILL' progress_name: '' message: '' sound: VILLAGER_IDLE post_message: '' post_sound: VILLAGER_IDLE goto: OBJECT OBJECT_2
正确配置 :
OBJECT_1: type: SERVER_MESSAGE_LIST messages_sound: VILLAGER_IDLE messages: - '&6Well played.' - 'WAIT 2' - '&f[Survival System] New objective : &aGo to Oneill in &l[-1227,180,2715] &aand give the &l[F.R.E.T] &ato the &l[Oneill Manager]&f.' name: '[dialogue]' progress_name: '[dialogue]' message: '' sound: VILLAGER_IDLE post_message: '' post_sound: VILLAGER_IDLE goto: OBJECT OBJECT_2 OBJECT_2: type: PLAYER_NPC_INTERACT item: type: PISTON amount: 1 name: '&7&m-----&f &dF.R.E.T&f &7&m-----&f &8(Quest)' must_have_in_hand: false remove_after_action: true npc: 256 name: 'Give the FRET to the Oneill Manager' progress_name: 'Give FRET to Oneill Manager' message: '' sound: VILLAGER_IDLE post_message: '' post_sound: VILLAGER_IDLE goto: OBJECT OBJECT_3
在输入文本信息post_message等消息时请使用''
. 比如: message: 'I love tapioca'
而不是 message: I love tapioca
. (虽然有时候这样也能用,但仍推荐加上引号)
也不要忘记加上两个 '
when you want to put one '
. 比如: I''ll want you''re tapioca when he''ll want it
(YAML书写基础规则)
不要忘记设置链接目标. goto: OBJECT A_THING_WITH_A_COOL_NAME
and not goto: A_THING_WITH_A_COOL_NAME
需要知道的事:
在一个 item
参数内 you can absolutely add other sub-parameters like this :
object: type: SERVER_ITEM_GIVE item: type: PISTON name: '&7&m-----&f &dF.R.E.T&f &7&m-----&f &8(Quest)' amount: 1
There are 2 type of amount:
that you will see during your quest writing. They can be confusing but they are different.
For instance :
object: type: SERVER_ITEM_GIVE item: type: PISTON name: '&7&m-----&f &dF.R.E.T&f &7&m-----&f &8(Quest)' amount: 1 amount: 2
The first amount:
in the item is the number of items that will be given to the player. The second amount:
in the object, written under the type and the item parameters, is the amount of time this action will be repeated. Can be useful if you want the player to do one object multiple times. I let you imagine what you can do with this feature.
If you find yourself stuck in front of an issue in your quest, it might be a simple syntax error messing everything up. So don't hesitate to first check what you've written on a YAML validator, such as : https://codebeautify.org/yaml-validator
Second check if you have any tabulation, YAML absolutely needs only spaces, not tabulations.
Summary
Now let's converge everything we just saw !
The parameters :
saving: ENABLED name: 'Example Quest' description: - '&7Just a sample quest' max_concurrent_instances: -1 max_concurrent_instances_queue: true min_players: 1 max_players: 1 max_completions: 1 time_limit: 0 cooldown: DISABLED actionbar: '' send_status_message: true send_objective_update_message: true restricted_worlds: [] permission: ''
The branch:
branches:
main:
name: 'main'
auto_start: true
starts_at: START_OBJECT
objects:
...
And the objects:
TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT item: type: DIAMOND amount: 32 must_have_in_hand: true remove_after_action: true npc: 15 amount: 1 goto: OBJECT THIS_SOMEONE_TALKS_TO_YOU THIS_SOMEONE_TALKS_TO_YOU: type: SERVER_MESSAGE_LIST messages: - 'Yeah man I''m talking to ya' - 'WAIT 3' - 'You just gave me 32 diamonds, now I feel happy' - 'It''s the minimum to talk to ya no ?' - 'WAIT 5' - '&cLove red color m8' goto: QUEST_SUCCESS
Aaand the FUUSSIIOONN :
saving: ENABLED name: 'Example Quest' description: - '&7Just a sample quest' max_concurrent_instances: -1 max_concurrent_instances_queue: true min_players: 1 max_players: 1 max_completions: 1 time_limit: 0 cooldown: DISABLED actionbar: '' send_status_message: true send_objective_update_message: true restricted_worlds: [] permission: '' branches: main: name: 'main' auto_start: true starts_at: START_OBJECT objects: TALK_TO_SOMEONE: type: PLAYER_NPC_INTERACT item: type: DIAMOND amount: 32 must_have_in_hand: true remove_after_action: true npc: 15 amount: 1 goto: OBJECT THIS_SOMEONE_TALKS_TO_YOU THIS_SOMEONE_TALKS_TO_YOU: type: SERVER_MESSAGE_LIST messages: - 'Yeah man I''m talking to ya' - 'WAIT 3' - 'You just gave me 32 diamonds, now I feel happy' - 'It''s the minimum to talk to ya no ?' - 'WAIT 5 - '&cLove red color m8' goto: QUEST_SUCCESS
Bam, your first working quest, good job ! As you can see, it can already seem a little complicated just to interact with a NPC, so, again, organisation is very important in your files.
You now know the bases to create any quest you want. Yes, really. You will just need some testing, experimentations and patience and everything that comes out of your imagination should be playable one day. Just think outside the box : a LOT is possible.
If you are having any issue after having checked everything on your side, don't hesitate to go on the support discord, we will be happy to help you !
You can also come and share your creations and your use of quest mechanics, on the same discord ! ^_^
Thanks for reading this tutorial ! (NB : and thumbs up again to Lordinouille who wrote it, that's a pretty good job !)
Now, that's your turn. The plugin is just awaiting : it's up to you to create quests !