跳转至

自定义组件

署名信息

概述

bridge.允许你定义新的实体、区块和物品组件,以便更快速地编写冗长、复杂和重复的行为。要开始使用,请导航到预设窗口中的“自定义组件”选项卡,并填写选项,包括你希望使用TypeScript还是JavaScript编写组件、文件名,以及你希望创建的是物品、实体还是区块组件。如果你在bridge.之外或在扩展中创建组件,则需要在BP/components/<组件类型><扩展名称>/components/<组件类型>文件夹中创建js或ts文件。

执行范围

defineComponent

自定义组件可以访问defineComponent函数,其格式如下:

defineComponent({ name: (name: string) => void, schema: (schema: any) => void, template: (templateFunction: (componentArgs: T, opts: TemplateContext) => void) => void }): void

参数:

  • name(name: string): void 自定义组件的名称,将在自动补全中显示。

  • schema(schema: any): void 组件的模式。这用于为自定义组件参数创建自动补全,应该采用标准JSON模式。你还可以使用$ref属性访问bridge.的内置自动补全。它们可以在这里找到,并应从data文件夹根目录引用,例如$ref: '/data/packages/minecraftBedrock/schema/general/slotType.json'将访问插槽类型的自动补全。

  • template(templateFunction: (componentArgs: any, opts: TemplateContext) => void): void templateFunction接收componentArgs,这是用户定义的组件参数,opts提供函数,允许你将数据与组件创建所在的文件合并,并允许你创建动画和动画控制器。

TemplateContext

通用

  • compilerMode: 'build' | 'dev' 让你访问当前编译器模式。

  • create(template: any, location?: string, operation?: (deepMerge: (oldData: any, newData: any) => any, oldData: any, newData: any) => any): void 允许你在组件所在的实体/区块/物品内部创建数据。template应该是一个JavaScript对象,包含要与给定location的文件合并的数据。location应该是用'/'分隔的路径,指向你希望创建template的位置。例如:minecraft:entity/description。默认的合并行为可以选择性地通过operation被覆盖,operation应该是一个函数,接受默认合并函数deepMergelocation处的数据(oldData)和要合并的新数据(newData)。它应返回自定义合并的结果。例如:(deepMerge, oldData, newData) => newData将覆盖location处的数据。

  • location: string 让你访问组件在实体/区块/物品文件中的位置。

  • identifier: string 让你访问组件所在的实体/区块/物品的标识符。

实体

interface TemplateContext {
  compilerMode: 'build' | 'dev'
  create: (
    template: any,
    location?: string,
    operation?: (
      deepMerge: (oldData: any, newData: any) => any,
      oldData: any,
      newData: any
    ) => any
  ) => void
  sourceEntity: () => any
  animation: (animation: any, condition?: string | false) => void
  animationController: (
    animationController: any,
    condition?: string | false
  ) => void
  location: string
  identifier: string
  projectNamespace: string
  client: {
    create: (clientEntity: any, formatVersion = "1.10.0") => void
  }
  dialogueScene: (sceneDefinition: any, openDialogue = true) => void
  onActivated: (eventResponse: any) => void
  onDeactivated: (eventResponse: any) => void
  lootTable: (lootTable: any) => string
  tradeTable: (tradeTable: any) => string
  spawnRule: (spawnRule: any) => void
}
  • sourceEntity(): any 访问当前应用于你的组件的源实体。

  • animation(animation: any, condition?: string | false): void 允许你创建一个自动链接到实体的BP动画。animation应该是一个包含应添加到动画名称的动画数据的JavaScript对象。condition是一个可选参数,允许你为动画运行设置一个molang条件。

  • animationController(animationController: any, condition?: string | false): void 允许你创建一个自动链接到实体的BP动画控制器。animationController应该是一个包含应添加到动画控制器名称的动画控制器数据的JavaScript对象。condition是一个可选参数,允许你为动画控制器运行设置一个molang条件。

  • client.create(clientEntity: any, formatVersion?: string): void 为使用自定义组件的实体创建一个新的客户端实体文件。

  • onActivated(eventResponse: any): void 每当你的组件应用于此实体时触发事件响应。

  • onDeactivated(eventResponse: any): void 每当你的组件从此实体中移除时触发事件响应。

  • dialogueScene(sceneDefinition: any, openDialogue?: boolean): void 创建一个新的对话场景以在你的附加包中使用。此函数仅在你的项目目标版本至少为"1.17.40"时可用。

  • lootTable(lootTable: any): string 为实体创建一个掉落表,并返回一个指向此掉落表的字符串。

  • tradeTable(tradeTable: any): string 为实体创建一个交易表,并返回一个指向此交易表的字符串。

  • spawnRule(spawnRule: any): void 为使用自定义组件的实体创建一个新的生成规则文件。

物品

interface TemplateContext {
  compilerMode: 'build' | 'dev'
  create: (
    template: any,
    location?: string,
    operation?: (
      deepMerge: (oldData: any, newData: any) => any,
      oldData: any,
      newData: any
    ) => any
  ) => void
  location: string
  identifier: string
  projectNamespace: string
  sourceItem: () => any
  lootTable: (lootTable: any) => string
  recipe: (recipe: any) => void
  player: {
    create: (
      template: any,
      location?: string,
      operation?: (
        deepMerge: (oldData: any, newData: any) => any,
        oldData: any,
        newData: any
      ) => any
    ) => void
    animation: (animation: any, condition?: string | false) => void
    animationController: (
      animationController: any,
      condition?: string | false
    ) => void
  }
}
  • sourceItem(): any 访问当前应用于你的组件的源物品。

  • lootTable(lootTable: any): string 为物品创建一个掉落表,并返回一个指向此掉落表的字符串。

  • recipe(recipe: any): void 为使用自定义组件的物品创建一个新配方。

player 对象提供对以下函数的访问:

  • animation(animation: any, condition?: string | false): void 允许你创建一个自动链接到玩家的BP动画。animation应该是一个包含应添加到动画名称的动画数据的JavaScript对象。condition是一个可选参数,允许你为动画运行设置一个molang条件。

  • animationController(animationController: any, condition?: string | false): void 允许你创建一个自动链接到玩家的BP动画控制器。animationController应该是一个包含应添加到动画控制器名称的动画控制器数据的JavaScript对象。condition是一个可选参数,允许你为动画控制器运行设置一个molang条件。

  • create(template: any, location?: string): void 允许你在玩家内部创建数据。template应该是一个JavaScript对象,包含要合并到玩家行为文件中的数据,位于给定的locationlocation应该是用'/'分隔的路径,指向你希望创建template的位置。例如:minecraft:entity/description。默认的合并行为可以选择性地通过operation被覆盖,operation应该是一个函数,接受默认合并函数deepMergelocation处的数据(oldData)和要合并的新数据(newData)。它应返回自定义合并的结果。例如:(deepMerge, oldData, newData) => newData将覆盖location处的数据。

区块

interface TemplateContext {
  compilerMode: 'build' | 'dev'
  create: (
    template: any,
    location?: string,
    operation?: (
      deepMerge: (oldData: any, newData: any) => any,
      oldData: any,
      newData: any
    ) => any
  ) => void
  sourceBlock: () => any
  location: string
  identifier: string
  projectNamespace: string
  onActivated: (eventResponse: any) => void
  onDeactivated: (eventResponse: any) => void
  lootTable: (lootTable: any) => string
  recipe: (recipe: any) => void
}
  • sourceBlock(): any 访问当前应用于你的组件的源区块。

  • onActivated(eventResponse: any): void 每当你的组件应用于此区块时触发事件响应。

  • onDeactivated(eventResponse: any): void 每当你的组件从此区块中移除时触发事件响应。

  • lootTable(lootTable: any): string 为区块创建一个掉落表,并返回一个指向此掉落表的字符串。

  • recipe(recipe: any): void 为使用自定义组件的区块创建一个新配方。

创建文件

文件也可以通过自定义组件自动创建。可以调用以下函数来创建文件:

  • animation(animation: any, condition: string | false): string返回动画的名称。

  • animationController(animationController: any, condition: string | false): string返回动画控制器的名称。

  • client.create(clientEntity: any, formatVersion?: string): void

  • dialogueScene(sceneDefinition: any, openDialogue?: boolean): void

扩展清单

在扩展中创建自定义组件时,你需要在扩展清单中指定它应该安装的位置,使用contributeFiles字段。

示例

示例可以在以下位置找到: