# 事件

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

{% 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>

通过运行以下命令获取正确的配置。\
\&#xNAN;***这将覆盖您对示例所做的任何更改（包括 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>

通过运行以下命令获取正确的配置。\
\&#xNAN;***这将覆盖您对示例所做的任何更改（包括 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/)。接下来，您将学习如何使用**目标**向玩家分配任务。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://miao-3.gitbook.io/betonquest-zhong-wen-wiki/jiao-cheng/ru-men/ji-chu-jiao-cheng/shi-jian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
