跳转至

实体命令

署名信息

事件响应

运行实体命令的一个更简单的方法是通过queue_command实体事件响应。

动画控制器

为了触发斜杠命令,我们将使用行为包动画控制器。动画控制器应放置在animation_controllers/some_controller.json。你可以在bedrock.dev的实体事件部分了解更多关于动画控制器的信息

简而言之,动画控制器允许我们从行为包触发事件。

  • 斜杠命令(如/say
  • Molang(v.foo += 1;
  • 实体事件(例如@s wiki:my_event

以下是一个示例动画控制器:

BP/animation_controllers/entity_commands.ac.json
{
  "format_version": "1.10.0",
  "animation_controllers": {
    "controller.animation.sirlich_entity_commands": {
      "states": {
        "default": {
          "transitions": [
            {
              "on_summon": "1" //1评估为true
            }
          ]
        },
        "on_summon": {
          "on_entry": ["/say 我被召唤了"]
        }
      }
    }
  }
}

此动画控制器将在实体被召唤到世界中时立即运行命令/say 我被召唤了。如果你对这个工作原理感到困惑,请查看Molang、动画和实体事件。

简而言之,有states,可以在其on_entry子句中触发事件。我们使用查询在不同状态之间转移。默认情况下,实体将处于default状态,除非定义了initial_state值。

警告

查询在世界/区块重新加载时会重新运行。这意味着"/say 我被召唤了"这行实际上会在每次实体“加载”时运行,而不仅仅是在被召唤时。

如果你需要阻止这种情况发生,你需要添加额外的查询,例如skin_id查询。第一次实体生成时,检查skin_id = 0,然后同时也添加一些更高的skin_id到实体上,例如skin_id = 1。这样,当实体重新加载时,它将无法运行这些命令。文档后面会进一步说明这一点。

使用动画控制器

要将此动画控制器添加到我们的实体中,我们可以在实体定义描述中使用以下代码:

BP/entities/entity_commands.se.json
"description": {
  "identifier": "wiki:entity_commands",
  "scripts": {
    "animate": [
      "wiki:entity_commands"
    ]
  },
  "animations": {
    "wiki:entity_commands": "controller.animation.wiki_entity_commands"
  }
}

如果你对这个步骤感到困惑,请查看实体事件文档

使用事件触发命令:

动画转移是使用查询创建的。你可以在这里阅读关于查询的内容。在我们的第一个示例中,我们的查询只是true,这意味着命令会自动运行。我们可以使用更复杂的查询来创建更有趣的效果。一个非常方便的方法是使用组件作为Molang过滤器来触发命令。

我个人喜欢使用skin_id

我们可以更新我们的动画控制器以基于skin_id触发:

BP/animation_controllers/entity_commands.ac.json
{
  "format_version": "1.10.0",
  "animation_controllers": {
    "controller.animation.sirlich_entity_commands": {
      "states": {
        "default": {
          "transitions": [
            {
              "command_example": "q.skin_id == 1"
            },
            {
              "zombies": "q.skin_id == 2"
            }
          ]
        },
        "command_example": {
          "transitions": [
            {
              "default": "q.skin_id != 1"
            }
          ],
          "on_entry": ["/say 命令一!", "@s execute_no_commands"]
        },
        "zombies": {
          "transitions": [
            {
              "default": "q.skin_id != 2"
            }
          ],
          "on_entry": [
            "/say 啊!到处都是僵尸!",
            "/summon minecraft:zombie",
            "/summon minecraft:zombie",
            "/summon minecraft:zombie",
            "/summon minecraft:zombie",
            "@s execute_no_commands"
          ]
        }
      }
    }
  }
}

此动画控制器现在有两个命令状态:第一个由skin_id = 1触发,第二个由skin_id = 2触发。注意使用了==!===用于测试相等,不要使用单个=!表示不,因此!=用于确保不等于特定值。此外,请注意我在每个命令列表的末尾添加了@s execute_no_commands语法。我们稍后将创建execute_no_commands,它将允许我们将skin_id重置为0,并重新使用我们的命令。

语法是@s后跟实体事件的名称。这允许我们在动画控制器内添加/移除组件。

设置组件组

回到我们的实体文件中,我们可以使用skin_id组件设置skin_id

skin_id组件如下所示:

"minecraft:skin_id": {
  "value": 1
}

我们可以添加包含skin_ids的组件组:

BP/entities/entity_commands.se.json
"component_groups": {
  "execute_no_commands": {
    "minecraft:skin_id": {
      "value": 0
    }
  },
  "command_example": {
    "minecraft:skin_id": {
      "value": 1
    }
  },
  "command_zombies": {
    "minecraft:skin_id": {
      "value": 2
    }
  }
}

添加事件

现在让我们创建事件,以便我们可以轻松添加这些组:

BP/entities/entity_commands.se.json
"events": {
  "minecraft:entity_spawned": {
    "add": {
      "component_groups": [
        "execute_no_commands"
      ]
    }
  },
  "execute_no_commands": {
    "add": {
      "component_groups": [
        "execute_no_commands"
      ]
    }
  },
  "command_example": {
    "add": {
      "component_groups": [
        "command_example"
      ]
    }
  },
  "command_zombies": {
    "add": {
      "component_groups": [
        "command_zombies"
      ]
    }
  }
}

触发事件

在Minecraft中有很多方法可以触发事件。如前所述,你可以使用动画控制器触发事件。此外,让我们看两个具体示例:

互动组件:

此组件将在你点击他时生成僵尸。

BP/entities/entity_commands.se.json
"minecraft:interact": {
  "interactions": [{
    "on_interact": {
      "filters": {
        "all_of": [{
            "test": "is_family",
            "subject": "other",
            "value": "player"
          }
        ]
      },
      "event": "command_zombies"
    }
  }]
}

计时器

此组件将每10秒触发示例命令:

BP/entities/entity_commands.se.json
"minecraft:timer": {
  "looping": true,
  "time": 10,
  "time_down_event": {
    "event": "example_command"
  }
}

通过将这些(和类似的!)组件添加到我们的实体中,我们可以控制skin_id何时更改,从而控制哪些事件运行。

回顾:

以下是它的工作原理:

  • 使用互动或计时器等组件运行example_command
  • 这将添加example_command组件组。
  • 这将添加skin_id组件。
  • 这将设置实体的skin_id,可以在动画控制器中查询。
  • 动画控制器注意到这个skin_id,并转移到example_command状态。
  • 动画控制器运行/say命令。
  • 动画控制器运行实体事件@s execute_no_command
  • execute_no_command事件将skin_id设置为0。
  • 动画控制器看到这一点,并转移回默认状态。
  • 现在动画控制器等待新的skin_id