# 方块基础

方块基于物品，方块在 **ItemsAdder** 的物品配置上增加新的一条属性即可实现。在此之前，我们需要了解一下 **ItemsAdder** 自定义方块实现的原理。

在前文中我们已经了解了 **CustomModelData** 这个概念，我们可以通过原版实现一个物品多个材质，那么方块是否可以呢？答案是否定的，我们只能自定义方块在物品栏时显示的材质，却不能更换它摆放后显示的样子，但是我们可以替换原版方块中提供的大量形态材质以实现自定义方块，但很显然，这是有上限的，从这点来看，我们就可以分析出了在  **ItemsAdder** 中自定义方块也不是那么完美，如果你过于追求，笔者建议你考虑 **Mod** 服务端。

### 方块材质

在 **物品基础** 一节中，我们已经讲述了各个物品都有 `resource` 选项，方块归属于物品，它的该选项示例如下所示：

```
    resource:
      material: PAPER
      generate: true
      textures:
      - block/my_log/log_top.png
      - block/my_log/log.png
      - block/my_log/log.png
      - block/my_log/log.png
      - block/my_log/log_top.png
      - block/my_log/log.png
```

其中：

* material：这只是方块拿在手上后的材质，不是方块本身，所以我们只需要保持它原有 PAPER 物品即可，不需要必须是方块。
* generate：如果我们的方块是正常的正方体方块，那么 `generate` 我们需要保持为 `true`，如果不是，需要读取自己的模型文件，则为 `false` 。
* textures：与物品一致，但此处的 `textures` 下可以有 **6** 行，分布为方块的 **6** 个面。在 **6** 个面材质相同的情况下，也可以只有 **1** 行，那么方块的 **6** 个面将全部是相同的材质。

### 方块特殊属性

前文就盔甲时我们已经提及特殊属性，自定义方块在使用时同样有自定义属性：

```
specific_properties:
  block:
    placed_model:
      type: REAL_NOTE
      break_particles: BLOCK
      rotx: 0
      roty: 0
    cancel_drop: true 
    light_level: 12
    break_tools_blacklist:
    - WOODEN_PICKAXE
    - STONE_PICKAXE
    - IRON_PICKAXE
    break_tools_whitelist:
    - DIAMOND_PICKAXE
    - PICKAXE
    - pickaxe
    hardness: 2
    blast_resistance: 1
    no_explosion: false
    sound:
      break:
        name: BLOCK_WOOD_BREAK
        volume: 1
        pitch: 0.9
      place:
        name: BLOCK_WOOD_PLACE
        volume: 1
        pitch: 0.9
```

方块特殊属性由以下部分组成：

* block：代表以下部分为方块特殊属性，请勿修改。
* placed\_model：自定义方块的类型。下文详细说明。
* cancel\_drop：是否取消掉落，玩家在挖掘该自定义方块后不会获得该方块，默认为 `false`。
* light\_level：亮度等级。对于亮度等级的知识可见 [**Minecraft Wiki**](https://minecraft.fandom.com/zh/wiki/%E4%BA%AE%E5%BA%A6)。默认为 `0`。
* break\_tools\_blacklist：禁止破坏该方块的物品id，你也可以填写 **ItemsAdder** 的 `namespace:id` 格式以指定对应物品。同时也支持模糊匹配，例如 `pickaxe` 代表所有 id 包含 `pickaxe` 的物品，也就是所有的镐子。这里的禁止是完全禁止，也就是说根本无法破坏。
* break\_tools\_whitelist：只可以破坏该方块的物品id，同上。
* hardness：方块的硬度。对于硬度的知识可见 [**Minecraft Wiki**](https://minecraft.fandom.com/zh/wiki/%E6%8C%96%E6%8E%98#%E6%96%B9%E5%9D%97%E7%A1%AC%E5%BA%A6)。总的来说就是合适的工具下所挖掘的时间为 `硬度 x 1.5`。
* blast\_resistance：爆炸抗性。对于爆炸抗性的知识可见 [**Minecraft Wiki**](https://minecraft.fandom.com/zh/wiki/%E7%88%86%E7%82%B8#%E7%88%86%E7%82%B8%E6%8A%97%E6%80%A7)。默认为 `硬度 x 3`。
* no\_explosion：爆炸无法使其破坏，如果设置，爆炸抗性属性也将失效。
* sound：物品破坏和放置时的音效。

### 方块类型

这个属性有这些值：

* `REAL_NOTE`
  * 使用真正的方块（唱片机），没有卡顿，没有实体。
  * 缺点:&#x20;
    * 不支持透明。
    * 最多只能制作 **750** 个方块。
* `REAL`
  * 使用真正的方块（蘑菇），没有卡顿。
  * 缺点:&#x20;
    * 最多 只能制作 **191** 个方块。
* `REAL_TRANSPARENT`
  * 使用真正的方块（紫菘植物），没有卡顿，也支持透明度！
  * 缺点:&#x20;
    * 最多只能制作**63** 个方块。
* `TILE`
  * 使用 **TILE** 方块（修改后的 **刷怪笼** 带有材质），你可以创建**无限多**的方块，不像真实方块那样有 **数量限制**。
  * 缺点:
    * 它不是100%的真实方块，它只是一个套上了材质的刷怪笼。
    * 材质/模型在较远距离看的话会消失，所以它将会直接显示刷怪笼。
    * 如果大量的方块出现在玩家的视野里的话，可能会导致客户端出现延迟。
* `FIRE`
  * 这是一个 **特殊方块**，它是 **火** 方块.
  * 缺点:&#x20;
    * 最多只能制作 **14** 种自定义火。
