> For the complete documentation index, see [llms.txt](https://miao-3.gitbook.io/betonquest-zhong-wen-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://miao-3.gitbook.io/betonquest-zhong-wen-wiki/jiao-cheng/ru-men/ji-chu-jiao-cheng/shi-jian.md).

# 事件

在你了解完如何创建对话之后，我们现在来学习事件。这些事件可以改变你的游戏世界。这可以是任何事情，从修改玩家的背包到放置方块。 在本教程中，我们将为玩家提供物品并使用事件将他传送到不同的位置。

{% hint style="danger" %}
要求

你必须已完成上一节“[对话](/betonquest-zhong-wen-wiki/jiao-cheng/ru-men/ji-chu-jiao-cheng/dui-hua.md)”内容
{% endhint %}

## 下载教程预设

<img src="https://twemoji.maxcdn.com/v/latest/svg/26a0.svg" alt="⚠" data-size="line"> <mark style="color:red;">**如果您已经使用了上一个教程步骤的配置，请不要执行此操作。**</mark> <img src="https://twemoji.maxcdn.com/v/latest/svg/26a0.svg" alt="⚠" data-size="line">

在聊天框中输入以下命令下载本节教程的预设内容：

```
/bq download BetonQuest/Quest-Tutorials main QuestPackages /Basics/Conversations/1-DirectoryStructure /tutorialQuest
```

您现在可以在此位置找到本教程所需的所有文件：

&#x20;"*你的服务器文件存放位置/plugins/BetonQuest/QuestPackages/tutorialQuest*"

## 1.为第一个事件创建文件结构

在“*tutorialQuest”*&#x7684;文件夹里，新建一个名为"*events.yml*"的文件，

以下是你现在的文件结构：`QuestPackage`

* &#x20;:file\_folder:tutorialQuest
  * &#x20;:open\_file\_folder:package.yml
  * &#x20;:open\_file\_folder:events.yml
  * :file\_folder:conversations
    * &#x20;:open\_file\_folder:jack.yml

现在，我们的文件结构已准备就绪，可以开始编写事件了！

## 2.定义你的第一个事件

打开我们已创建的`events.yml`，并添加以下内容：

{% code title="events.yml" lineNumbers="true" %}

```
events: 
  giveFoodToPlayer: "give steak:16"
```

{% endcode %}

那么我们在这里看到了什么呢？

* `giveFoodToPlayer`是事件的名称。您可以随便起一个名字。但是，建议以它的作用命名它。这会让你更方便的编写你的任务。
* 事件说明：
  * `give`指令中的第一个值永远都是**事件类型**。
  * `steak:16`这是给定事件的一**个选项**。它定义了您要提供的物品以及由冒号隔开的数量。

在我们测试事件是否在游戏中起作用之前，我们必须创建该物品`steak`，因为BetonQuest不知道`steak`是什么。

## 3. 在物品部分中创建一个物品 <a href="#id-3-creating-the-item-in-the-items-section" id="id-3-creating-the-item-in-the-items-section"></a>

对于某些事件类型，例如你需要在部分中指定物品。它包含您要在任务中创建/使用的所有物品的定义。我们将在“*package.yml*”文件中创建项目部分。`giveitems`

{% code title="package.yml" lineNumbers="true" %}

```
npcs:
  '1': "Jack"

items:
  steak: "COOKED_BEEF" 
```

{% endcode %}

现在一个名为`steak`的物品可以在整个任务中被使用。

## 4. 将事件整合到对话中 <a href="#id-4-integrating-events-into-conversations" id="id-4-integrating-events-into-conversations"></a>

让我们在对话中执行事件。

{% hint style="success" %}
**与前面的示例相比，第9、10、13、14行，为新增部分。**
{% endhint %}

{% code title="jack.yml" lineNumbers="true" %}

```
conersations:
  Jack:
    quester: "Jack"
    first: "firstGreeting"
    NPC_options:
      #... 
      foodAnswer:
        text: "Your welcome! Take it... &7*gives food*"
        events: "giveFoodToPlayer" 
        pointer: "thankYou"
    player_options:
      #...
      thankYou: 
        text: "Oh that smells really good!"
```

{% endcode %}

* 第**6、12**行`#...` ：<mark style="color:red;">**为了方便你的阅读与学习，从现在开始，本教程将只显示示例的相关部分。**</mark>
* 第**9**行`events`：事件的参数必须包含一个或多个事件名称。当向玩家显示相应的选项时，将执行这些事件。 此参数可用于玩家和 NPC 的选项。

## 5. 测试你的第一个游戏事件 <a href="#id-5-testing-your-first-event-ingame" id="id-5-testing-your-first-event-ingame"></a>

{% hint style="info" %}
每当测试一些内容时，保存所有文件是非常重要的！

保存后在服务器上输入：**`/bq reload`**
{% endhint %}

你还可以使用命令运行事件。

执行此操作的最简单方法是执行命令：

在服务器上输入：`/bq event NAME tutorialQuest.giveFoodToPlayer`

如果你按照教程设置无误，此命令会给你指定数量的牛排！

{% tabs %}
{% tab title="命令拆解分析" %}

| 命令部分               | 含义                                                                 |
| ------------------ | ------------------------------------------------------------------ |
| `/bq event`        | 告诉BetonQuest要执行一些事件                                                |
| `NAME`             | 玩家名                                                                |
| `tutorialQuest`    | QuestPackage的名字。在不同的package中可能具有相同名称的事件。                           |
| `giveFoodToPlayer` | 要执行的事件的名称。不要忘记用一个点（.）将它与package分开：`tutorialQuest.giveFoodToPlayer` |
| {% endtab %}       |                                                                    |
| {% endtabs %}      |                                                                    |

你也可以直接从控制台执行命令（开头不带斜杠“/”）。

<details>

<summary>这个示例不起作用吗？</summary>

通过运行以下命令获取正确的配置。\
***这将覆盖您对示例所做的任何更改（包括 NPC ID）。***\
[基础教程](https://miao-3.gitbook.io/betonquest-zhong-wen-wiki/jiao-cheng/ru-men/ji-chu-jiao-cheng/pages/3gPGDyqwfkb9OR8DAmsm#1.-jiang-dui-hua-lian-jie-dao-npc-shang)中介绍了如何将 NPC 连接到对话上。<img src="https://twemoji.maxcdn.com/v/latest/svg/26a0.svg" alt="⚠" data-size="line">

```
/bq download BetonQuest/Quest-Tutorials main QuestPackages /Basics/Events/1-FirstEvent /tutorialQuest overwrite
```

</details>

## 6.新建事件文件夹 <a href="#id-6-creating-folder-events" id="id-6-creating-folder-events"></a>

现在，我们要创建一个游览市长城市的事件。同时，我们将了解传送和文件夹事件。

打开“*events.yml*”文件并添加**以下内容的**<mark style="color:red;">**3-7**</mark>**行**：

{% code title="events.yml" lineNumbers="true" %}

```
events:
  giveFoodToPlayer: "give steak:16"
  townTour: "folder tpLocation1,tpLocation2,tpLocation3,tpBlacksmith delay:2 period:5"
  tpLocation1: "teleport 100;70;100;world" 
  tpLocation2: "teleport 200;73;200;world" 
  tpLocation3: "teleport 300;71;300;world" 
  tpBlacksmith: "teleport 50;70;50;world" 
```

{% endcode %}

* 第**4-7**行：根据你的世界调整传送的位置。它必须采用[统一的位置格式](https://docs.betonquest.org/2.0.0-DEV/Documentation/Reference/#unified-location-formating)

如你所见，有一些新的事件类型。events事件合集里面包含了多个事件。一旦触发，它只是执行里面的事件。每个事件类型都记录在事件列表中，请阅读有关[events](https://docs.betonquest.org/2.0.0-DEV/Documentation/Events-List/#run-multiple-events-folder)的更多信息以及上方的[传送](https://docs.betonquest.org/2.0.0-DEV/Documentation/Events-List/#teleport-teleport)事件。`folderteleport`

执行`townTour`事件时每五秒钟会把你传送到一个新的位置，直到我们到达最终目的地——铁匠。evernt事件合集在`tpBlacksmith`事件执行完后完成。&#x20;

现在，我们要把evernt事件合集添加到 Jack 的对话当中。

{% hint style="success" %}
**与前面的与前面的示例相比，第11-18、23-29行，为新增部分。**
{% endhint %}

{% code title="jack.yml" lineNumbers="true" %}

```
conversations:
  Jack:
    quester: "Jack"
    first: "firstGreeting"
    NPC_options:
      #...
      foodAnswer:
        text: "You're welcome! Take it... &7*gives food*"
        events: "giveFoodToPlayer"
        pointer: "thankYou"
      townTour:
        text: "Yeah that's true. You know what also smells good? The fresh air in my town! Would you like to take a little tour?"
        pointer: "enoughTime,noTimeForThat" 
      startTheTour:
        text: "Great! It is a honor for me to guide you through the town."
        events: "townTour" 
      noProblem:
        text: "That's fine! Maybe you have time another day... Just talk to me again. See you!"
    player_options:
      #...
      thankYou:
        text: "Oh that smells really good!"
        pointer: "townTour" 
      enoughTime:
        text: "Yes of course! Show me everything."
        pointer: "startTheTour"
      noTimeForThat:
        text: "Sorry but I don't have time now..."
        pointer: "noProblem"
```

{% endcode %}

* 第**13**行 `pointer`：玩家玩家再次有了选择。
* 第**16**行 `events`：是我们刚创建新事件的`startTheTour`名称。当显示NPC该选项时，它就会被触发。
* 第**23**行 `pointer`：它扩展了现有的对话。

以上的修改可以让玩家选择是否要进行城镇游览。

现在再次与NPC交谈来开始城镇游览。

<details>

<summary>这个示例不起作用吗？</summary>

通过运行以下命令获取正确的配置。\
***这将覆盖您对示例所做的任何更改（包括 NPC ID）。***\
[基础教程](https://miao-3.gitbook.io/betonquest-zhong-wen-wiki/jiao-cheng/ru-men/ji-chu-jiao-cheng/pages/3gPGDyqwfkb9OR8DAmsm#1.-jiang-dui-hua-lian-jie-dao-npc-shang)中介绍了如何将 NPC 连接到对话上。<img src="https://twemoji.maxcdn.com/v/latest/svg/26a0.svg" alt="⚠" data-size="line">

```
/bq download BetonQuest/Quest-Tutorials main QuestPackages /Basics/Events/2-TownTour /tutorialQuest overwrite
```

</details>

## 总结

非常好！你已经了解了什么是事件以及如何创建它们。现在，你可以给玩家一些食物，甚至可以传送他穿过整个城镇！可以在事件列表中找到更多[事件](https://docs.betonquest.org/2.0.0-DEV/Documentation/Events-List/)。接下来，您将学习如何使用**目标**向玩家分配任务。
