# 数据包基础

数据包（Data Pack）为玩家自定义Minecraft的游戏内容提供了更多新方法，包括但不限于配置进度、配方、战利品表、魔咒、伤害类型、生物变种和世界生成等。对数据包的修改并不等于修改了包含相同逻辑部分的游戏代码。

建议在你在看完本站的数据包制作文档可以学会查阅 [Minecraft Wiki](https://zh.minecraft.wiki/) 文档。


对于我们想要修改的规则，在 [参见 Minecraft Wiki - 数据包](https://zh.minecraft.wiki/w/%E6%95%B0%E6%8D%AE%E5%8C%85?variant=zh-cn) 中的目录结构处寻找，每个目录都对应一个游戏规则，具体有该方法点击文件名的超连接即可跳转到定义格式页面。

[参见 Minecraft Wiki - 数据包](https://zh.minecraft.wiki/w/%E6%95%B0%E6%8D%AE%E5%8C%85?variant=zh-cn)

## 什么是数据包？

在每个版本的根目录下，都会有一个以版本名为名称的 jar 文件，存放着游戏的资源、行为等，而数据包与此文件目录有着相同的结构，负责覆盖原版 jar 文件中 data 目录的游戏行为数据。

### 数据包结构

一个数据包的结构如下：

```text
数据包根目录/
├── pack.mcmeta                    # 数据包元数据，包含版本号和描述
├── pack.png                       # 数据包图标，64x64 像素
└── data/
    └── <命名空间>/
        ├── advancements/          # 玩家进度 / 成就定义文件目录
        ├── banner_pattern/        # 旗帜图案样式文件目录
        ├── cat_variant/           # 猫的外观变种文件目录
        ├── chat_type/             # 聊天类型文件目录
        ├── damage_type/           # 伤害类型文件目录
        ├── dimension/             # 维度文件目录
        ├── dimension_type/        # 维度环境参数文件目录
        ├── enchantment/           # 附魔效果文件目录
        ├── functions/             # 命令函数文件文件目录
        ├── frog_variant/          # 青蛙的外观变种文件目录
        ├── instrument/            # 山羊号角音效文件目录
        ├── jukebox_song/          # 唱片音乐曲目文件目录
        ├── loot_tables/           # 掉落物和战利品配置文件目录
        │   ├── archaeology/       # 考古战利品文件目录
        │   ├── blocks/            # 方块掉落文件目录
        │   ├── chests/            # 宝箱战利品文件目录
        │   ├── entities/          # 实体掉落文件目录
        │   └── gameplay/          # 游戏玩法战利品文件目录
        ├── predicates/            # 条件判断逻辑文件目录
        ├── recipes/               # 合成 / 冶炼配方文件目录
        ├── structures/            # 建筑结构 NBT 文件目录
        ├── tags/                  # 各类分组标签文件目录
        │   ├── blocks/            # 方块标签文件目录
        │   ├── entities/          # 实体标签文件目录
        │   ├── fluid/             # 流体标签文件目录
        │   ├── functions/         # 函数标签文件目录
        │   ├── game_events/       # 游戏事件标签文件目录
        │   ├── items/             # 物品标签文件目录
        │   └── worldgen/          # 世界生成标签文件目录
        ├── trim_material/         # 盔甲纹饰材料文件目录
        ├── trim_pattern/          # 盔甲纹饰图案文件目录
        ├── wolf_variant/          # 狼的外观变种文件目录
        └── worldgen/              # 世界生成配置文件目录
            ├── biome/             # 生物群系定义文件目录
            ├── configured_carver/ # 地形雕刻器文件目录
            ├── configured_feature/# 世界特征配置文件目录
            ├── density_function/  # 地形密度函数文件目录
            ├── noise/             # 噪声参数文件目录
            ├── noise_settings/    # 噪声整体设置文件目录
            ├── placed_feature/    # 特征放置规则文件目录
            ├── processor_list/    # 结构处理器文件目录
            ├── structure/         # 结构生成定义文件目录
            ├── structure_set/     # 结构生成集合文件目录
            └── template_pool/     # 结构模板池文件目录
```

在编写数据包时，仅创建和编写需要的文件和目录即可。

:::tip
这里的数据包根目录并不是原版存档文件的 `datapacks` 目录，而是你创作的数据包文件的根目录。
:::

## 了解 JSON

数据包的编写要用到 JSON 文件。在开始之前，你需要了解 JSON 格式。

JSON（**J**ava**S**cript **O**bject **N**otation）是一种轻量级的数据交换格式，常用于数据传输与存储。它以键值对的形式组织数据，结构清晰、可读性强，并且与多种编程语言高度兼容。

### JSON 数据类型与格式

JSON 支持的数据类型包括：`{}` 对象、`[]` 数组、`""` 字符串、`number` 数值、`true / false` 布尔值。

- **对象**：由 `{}` 包裹，是一个无序的 `键 / 值` 对集合。每个键（Key）后跟一个冒号 `:`，多个键值对之间使用逗号 `,` 分隔。
- **数组**：由 `[]` 包裹。
- **命名规则**：键名必须被双引号 `""` 包裹。
- **布尔值**：表示“是”或“否”，填写 `true` 或 `false`。

例如，关于柏茯灵的数据可以用以下 `fovlin.json` 文件表示：

```json
{
  "name": "柏茯灵",
  "identity": "Developer",
  "is_human": true,
  "skills": ["Data Pack", "Linux", "Minecraft"]
}
```

如上表示了关于 Fovlin 的数据。

:::danger
JSON 文件不支持注释，上述注释仅为描述各项含义。
:::

## 了解命名空间:ID

命名空间ID主要由以下两部分组成：

- 命名空间（Namespace）：一个字符串，用于标识资源的唯一性。游戏的默认命名空间为 `minecraft`，另外 `Realms` 也使用单独的命名空间realms。

- 路径（Path）：一个字符串。在数据包中，一般也反应了该资源的文件路径。有时也仅作为一种标识名。

在转换为字符串形式时，命名空间和路径之间使用:作为分隔符。

如原版 MC 中的苹果，命名空间ID为 `minecraft:apple`，原版主世界维度命名空间ID为 `minecraft:overworld`，数据包中定义的自定义维度命名空间ID则为 `<命名空间>:<维度名称>`

这意味着你也可以通过创建 `minecraft` 原版命名空间来修改原版的一些数据/行为。

```text
数据包根目录/
├── pack.mcmeta                    # 数据包元数据，包含版本号和描述
├── pack.png                       # 数据包图标，64x64 像素
└── data/
    └── <命名空间>/
        └── ...
```
## 示例

现假设创建一个名为 floating_islands 的数据包，为原版追加浮空岛维度。

创建一个目录作为根目录，取名 floating_islands。

### 创建并编辑元数据文件

在根目录下一个名为 `pack.mcmeta` 的文件，以及一个名为 `data` 的目录。

在 `data` 目录下创建目录 minecraft 这将引用原版的命名空间，你也可以自定义命名空间并创建维度，此处自定义 `example` 命名空间作为演示。

```json title="pack.mcmeta"
{
    "pack": {
        "min_format": 0,
        "max_format": [100, 0],
        "description": "Another world",
        "supported_formats": [0, 100],
        "pack_format": 100
    }
}
```

其中各键的作用详见 [Minecraft 中文 Wiki 数据包#数据包元数据](https://zh.minecraft.wiki/w/%E6%95%B0%E6%8D%AE%E5%8C%85#%E6%95%B0%E6%8D%AE%E5%8C%85%E5%85%83%E6%95%B0%E6%8D%AE)。

### 创建维度定义文件

根据  [Minecraft 中文 Wiki 维度定义格式](https://zh.minecraft.wiki/w/%E7%BB%B4%E5%BA%A6%E5%AE%9A%E4%B9%89%E6%A0%BC%E5%BC%8F?variant=zh-cn) 可知，定义一个新维度的方法如下: 

创建新维度需要在 `floating_islands/data/example/` 目录下创建 `dimension` 目录，并创建以维度名称为命名的 JSON 文件。

```json title="floating_islands.json"
{
    "type": "minecraft:overworld",
    "generator": {
        "type": "minecraft:noise",
        "settings": "minecraft:floating_islands",
        "biome_source": {
            "type": "minecraft:multi_noise",
            "preset": "minecraft:overworld"
        }
    }
}
```

其中各键的作用详见

### 创建维度类型文件

根据 [Minecraft Wiki - 维度类型](https://zh.minecraft.wiki/w/%E4%BC%A4%E5%AE%B3%E7%B1%BB%E5%9E%8B%E5%AE%9A%E4%B9%89%E6%A0%BC%E5%BC%8F) 可知: 

定义维度中的一些规则，需要在 `floating_islands/data/example/` 目录下创建 `dimension_type` 目录，并创建以维度名称为命名的 JSON 文件。

```json
{
    "ultrawarm": false,
    "natural": true,
    "coordinate_scale": 1,
    "has_skylight": true,
    "has_ceiling": false,
    "ambient_light": 0,
    "monster_spawn_light_level": 0,
    "monster_spawn_block_light_limit": 0,
    "piglin_safe": true,
    "bed_works": true,
    "respawn_anchor_works": true,
    "has_raids": true,
    "logical_height": 512,
    "min_y": -256,
    "height": 512,
    "infiniburn": "#minecraft:infiniburn_overworld",
    "effects": "minecraft:overworld"
}
```

### 编辑噪声设置文件

原版中已经预设 `floating_islands` 噪声设置参数，直接在 `floating_islands/data/example/dimension/floating_islands` 文件中的 `generator.settings` 处引用 `minecraft:floating_islands` 原版噪声设置的命名空间ID即可。

***如果执意自定义维度中的地形生成规则***，需要在 `floating_islands/data/example/` 目录下创建 `worldgen` 目录，并创建 `noise_settings` 目录，在此目录下创建以维度名称为命名的 JSON 文件，在 `floating_islands/data/example/dimension/floating_islands` 文件中的 `generator.settings` 处引用 `example:<维度名称>`。


关于噪声设置文件格式详见 [Minecraft Wiki 噪声设置](https://zh.minecraft.wiki/w/%E5%99%AA%E5%A3%B0%E8%AE%BE%E7%BD%AE)


整个文件的目录结构如下

```text
floating_islands
 └─data
    └─example
       ├─dimension
       └─dimension_type
```

随后可以打开游戏-创建新世界-选择数据包，将整个 `floating_islands` 文件夹复制到目标文件夹，在左侧栏中选择启用，开始游戏，使用指令进入此维度。

```
execute in example:floating_islands run tp ~ 128 ~
```

## 打包数据包

:::danger
请不要右键直接压缩打包！直接压缩会添加数据包本体到压缩文件中，而不会使压缩包成为根目录，游戏无法识别。
:::

正确的打包方式为

- 右键创建新压缩(zipped)文件夹

- 选中数据包根目录下的所有文件，复制

- 选择新建的压缩文件夹，粘贴

- 重命名压缩文件夹为你想要的名字

至此打包完成！