跳到主要内容

扩展包:交互检测

本文用于为 NPC 主包中引入的 NPC 添加交互检测

温馨提示
  • 本文的内容基于「主包 v2」的架构。如果您还没有下载主包,请前往下载并阅读相关文档。
  • 本文假定您已经能够独立编写属于自己的自定义实体。如果您还不能编写自定义实体,请阅读模块 2 的教程:5.3.1 数据驱动实体

添加交互检测

在本文中,我们要更改或新增下面的粗体文件,请提前准备:

  • BP_npc 文件图标BP_npc:行为包根目录
    • entities 文件图标entities:实体服务端定义
      • template 文件图标template:(建议换名)分类
        • npc.server_entity.json 文件图标npc.server_entity.json:NPC 的行为包定义(更改)
    • functions 文件图标functions:函数(新增)
      • entities 文件图标entities(新增)
        • npc 文件图标npc(新增)
          • interact.mcfunction 文件图标interact.mcfunction:NPC 被交互后调用的函数(新增)
    • manifest.json 文件图标manifest.json:清单文件
    • pack_icon.png 文件图标pack_icon.png:包图标
  • RP_npc 文件图标RP_npc:资源包根目录
    • entity 文件图标entity:实体客户端定义
      • npc.client_entity.json 文件图标npc.client_entity.json:NPC 的资源包定义
    • models 文件图标models:模型
      • entity 文件图标entity:实体模型
        • npc.geo.json 文件图标npc.geo.json:NPC 的模型
    • render_controllers 文件图标render_controllers:渲染控制器
      • npc.render_controllers.json 文件图标npc.render_controllers.json:NPC 的渲染控制器
    • texts 文件图标texts:文本
      • zh_CN.lang 文件图标zh_CN.lang:中文翻译文本(更改)
      • en_US.lang 文件图标en_US.lang:英文翻译文本(更改)
    • textures 文件图标textures:贴图
      • entity 文件图标entity:实体贴图
        • npc 文件图标npc:NPC 贴图
          • 0.png 文件图标0.png:NPC 0 的贴图(Steve)
          • 1.png 文件图标1.png:NPC 1 的贴图(Alex)
    • manifest.json 文件图标manifest.json:清单文件
    • pack_icon.png 文件图标pack_icon.png:包图标

打开 NPC 的行为包定义,在其组件(components)内部添加一个minecraft:interaction组件,然后添加对应的事件调用:

BP_npc/entities/template/npc.server_entity.json
{
"format_version": "1.21.0",
"minecraft:entity": {
...,
"components": {
...,
"minecraft:equipment": { "slot_drop_chance": [ { "slot": "slot.weapon.mainhand", "drop_chance": 0 } ] },
"minecraft:interact": { "interactions": [ { "interact_text": "action.interact.chat", "on_interact": { "event": "template:interacted", "target": "self" } } ] }
},
"events": {
...,

"template:interacted": { "queue_command": { "command": [ "function entities/npc/interact" ] } }
}
...
}
}

这样,函数entities/npc/interact就将在被交互时,以 NPC 为执行者、NPC 的环境为执行环境参数执行其中的命令。例如,可以设置 NPC 在被交互时执行say命令:

BP_npc/functions/entities/npc/interact.mcfunction
# ===== NPC 被交互 =====
say Hello, world!

记得设置聊天按钮的文本:

RP_npc/texts/en_US.lang
## ===== Interaction Buttons =====
action.interact.chat=Chat
RP_npc/texts/zh_CN.lang
## ===== 聊天按钮 =====
action.interact.chat=聊天