跳转至

预设

署名信息

概述

预设是一组文件,可以通过预设接口创建,只需输入一个标识符并点击“创建!”按钮。它们有助于快速设置新的物品、实体或类似功能。本页涵盖API第2版中的预设。

扩展集成

扩展也可以通过在<扩展名称>/presets文件夹中提供新预设来添加。为每个要添加的预设创建一个文件夹。每个文件夹应包含一个manifest.json文件和所有预设应创建的文件模板。

清单格式

主体

名称 类型 描述
name String 在预设窗口中显示的名称
description String 预设描述
icon String 在预设窗口中显示的图标
category String 预设的类别(实体、物品等)
packTypes Array 预设所需的包类型
additionalModels Object 预设脚本的高级可选功能
targetVersion Array 有条件地改变预设的可用性
createFiles Array<string, string, IPresetFileOpts> 要创建的JSON文件或要执行的预设脚本名称
expandFiles Array<string, string, IPresetFileOpts> 要添加数据或扩展的文件
fields Array 创建新的输入框

创建、扩展文件

清单的两个组件createFilesexpandFiles需要3个要素:

  • 模板文件名
  • 创建或扩展的文件路径
  • 创建文件时的其他选项

模板文件名是一个字符串,包含文件名及其扩展名,如.json.lang,将被创建或扩展。 文件路径将定义指定模板文件的创建位置。如果文件需要扩展,则路径需要定义正在扩展的文件。例如:RP/texts/en_US.lang。 将包含在指定模板文件中的变量也需要“注入”,以便桥接知道哪些变量需要替换为相应的值。

选项

interface IPresetFileOpts {
  /*
   * 注入到文件中的变量。
   */
  inject: string[]
  /*
   * 创建预设时是否打开文件。
   */
  openFile?: boolean
  /**
   * 创建文件的包类型。
   */
  packPath?: 'behaviorPack' | 'resourcePack' | 'skinPack' | 'worldTemplate'
}

字段

字段在预设窗口中创建输入框,用户可以在其中输入某种类型的数据,如图像或文本,这些数据将分配给输入框名称后指定的变量。输入类型包括:

  • 文本
  • 文件
  • 选择框
  • 数字
  • 开关

输入类型

输入类型是“框”,用户可以在其中输入不同类型的数据值,如textimagemodels等。输入类型在预设的清单中每个输入框的属性中定义。要创建新的输入框,请在fields数组中创建一个新数组,并为框定义一个显示名称和一个变量,以便将用户的输入分配给该变量。属性可以在输入框中的object内定义。

文本

textInput是默认的输入类型。要创建它,请创建一个数组,第一个元素为文本框的名称(字符串),第二个元素为分配给用户输入的变量(字符串)。

文件

fileInput输入类型将要求用户输入一个文件。要创建该字段,将type属性设置为fileInput。将可选的multiple属性设置为true以选择多个文件。使用accept属性限制输入为一种文件类型。使用icon属性设置输入框的图标。

选择框

selectInput是一种输入类型,创建一个选择框或下拉列表选项。要创建选择框,请创建一个输入框并分配一个变量,然后创建一个属性对象并将输入框的类型定义为selectInput,再设置一个default值,这是输入框的默认选项。创建一个名为options的数组,然后为每个选项创建一个对象,定义显示的textvalue

options还允许一个对象,包含cacheKeyfileType,其中文件类型是文件定义ID,缓存键是获取值的闪电缓存键。

数字输入

numberInput是一种输入类型,创建一个滑块,该滑块从定义的min数字到定义的max数字。此滑块将以定义的step数字向上或向下计数。要创建它,请创建一个新的输入框,将numberInput作为输入type,然后设置minmaxstep数字。

开关

switch是最简单的输入类型,它是一个可以打开或关闭的开关。分配给输入的变量将根据开关状态获得truefalse。要创建它,请将输入type设置为switch

输入属性

输入属性是可以在输入框中的 object 内定义的属性。属性根据所选的输入类型而变化。所有输入类型都有 3 个通用属性:

名称 类型 描述
type String 输入类型。
default String 输入的默认值。
optional Boolean 输入是否为可选。

图标

图标在预设窗口中显示。预设使用Material Design Icons,这是一个可以在manifest.json中通过输入mdi-后跟图标名称来定义的图标集合。

变量

变量可以在清单的createFilesexpandFile组件中使用,也可以在预设的任何其他文件中使用,只要它们被“注入”到文件中。

变量可以通过在两个大括号中使用它们来引用:{{VARIABLE}}。桥接会自动用当前相应的变量值替换变量。

注意:变量PROJECT_PREFIX已预定义,并包含项目的命名空间(不包括冒号)。

预设脚本

用法

预设脚本是JavaScript文件,可以在创建预设时处理文件创建。

它们可以通过将文件路径添加到createFiles数组中在预设中引用。如果你创建自己的脚本,可以将其放在预设的文件夹中,并使用相对路径引用,例如<扩展名称>/presets/<预设名称>/myScript.js可以用./myScript.js从同一预设文件夹引用。

另外,你可以使用presetScript/<SCRIPT_NAME>引用内置预设脚本

创建

要创建预设脚本,请在你的presets文件夹中创建一个JavaScript文件。内部应将module.exports分配为在创建预设时运行的函数。

此函数传入以下内容:

标识符 类型 描述
createFile (filePath: string, data: any, opts: IPresetFileOpts) => Promise<void> 在给定路径创建文件
expandFile (filePath: string, data: any, opts: IPresetFileOpts) => Promise<void> 在给定路径的文件中添加数据
createJSONFile (filePath: string, data: any, opts: IPresetFileOpts) => Promise<void> 在给定路径创建JSON文件。应将数据作为对象传递,以便转换为JSON字符串
loadPresetFile (filePath: string) => Promise<File> 从预设文件夹返回指定文件
models Object 表示用户输入的模型或在additionalModels中定义的对象

示例

清单

{
  "name": "蝙蝠",
  "icon": "mdi-bat",
  "description": "创建一个新的蝙蝠实体。",
  "category": "fileType.entity",
  "targetVersion": [">=", "1.8.0"],
  "fields": [
    ["标识符", "IDENTIFIER"],
    ["显示名称", "IDENTIFIER_NAME"]
  ],

  "createFiles": [
    "./myPresetScript.js",
    [
      "entity.json",
      "BP/entities/{{IDENTIFIER}}.json",
      { "inject": ["IDENTIFIER", "PROJECT_PREFIX"] }
    ],
    [
      "animation.json",
      "RP/animations/{{IDENTIFIER}}.json",
      { "inject": ["IDENTIFIER"] }
    ]
  ],
  "expandFiles": [
    [
      "en_US.lang",
      "RP/texts/en_US.lang",
      { "inject": ["IDENTIFIER", "IDENTIFIER_NAME", "PROJECT_PREFIX"] }
    ]
  ]
}

变量

{
  "texture_data": {
    "{{IDENTIFIER}}": {
      "textures": ["textures/items/{{IDENTIFIER}}"]
    }
  }
}

字段

["文本", "TEXT"]
[
  "文件",
  "FILE",
  {
    "type": "fileInput",
    "accept": "image/png"
  }
]
[
  "多个文件",
  "FILES",
  {
    "type": "fileInput",
    "accept": "image/png",
    "multiple": true
  }
]
[
  "选择框",
  "SELECT",
  {
    "type": "selectInput",
    "default": "select1",
    "options": [
      { "text": "select1", "value": "select1" },
      { "text": "select2", "value": "select2" },
      { "text": "select3", "value": "select3" }
    ]
  }
]
[
  "实体事件选择",
  "EVENT",
  {
    "type": "selectInput",
    "options": {
      "fileType": "entity",
      "cacheKey": "event"
    }
  }
]
[
  "数字滑块",
  "NUM_SLIDE",
  {
    "type": "numberInput",
    "min": 0,
    "max": 10,
    "step": 1
  }
]
[
  "开关我!",
  "BOOLEAN",
  {
    "type": "switch"
  }
]

预设脚本

module.exports = async ({ createFile, loadPresetFile, models, expandFile }) => {
  let { TEXTURE, IDENTIFIER, PROJECT_PREFIX, DEFAULT_TEXTURE, PRESET_PATH } =
    models
  let fileName = `${IDENTIFIER}.png`

  if (!TEXTURE) TEXTURE = await loadPresetFile(DEFAULT_TEXTURE)
  else fileName = TEXTURE.name
  const fileNameNoExtension = fileName.replace(/.png|.tga|.jpg|.jpeg/gi, '')

  await createFile(`textures/blocks/${PRESET_PATH}${fileName}`, TEXTURE, {
    packPath: 'resourcePack',
  })
  await expandFile(
    'textures/terrain_texture.json',
    {
      texture_data: {
        [`${PROJECT_PREFIX}_${IDENTIFIER}`]: {
          textures: `textures/blocks/${PRESET_PATH}${fileNameNoExtension}`,
        },
      },
    },
    { packPath: 'resourcePack' }
  )
}

更多示例