方块简介

方块

方块是 Minecraft 世界的基础,构成地形、建筑和机器。制作 Mod 时很可能需要添加方块。本页介绍方块的创建及其部分用途。

Block 定义世界方块行为,BlockState 表达方块状态;物品栏的 ItemStack 由 Item 控制,BlockItem 引用对应 Block。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

创建方块

基础方块

对于不需要特殊功能的简单方块,例如圆石或木板,无需自定义类。使用 BlockBehaviour$Properties 对象实例化 Block 即可创建方块。通过 BlockBehaviour$Properties#of 创建属性对象,再调用其方法进行配置:

  • strength:硬度控制破坏方块所需的时间,是任意数值。石头硬度为 1.5,泥土为 0.5;不可破坏的方块应使用 -1.0,参见 Blocks#BEDROCK。抗性控制爆炸抗性,石头为 6.0,泥土为 0.5。
  • sound:控制敲打、破坏或放置时的声音,接收 SoundType 参数。详见声音。
  • lightLevel:控制方块发光,接收一个以 BlockState 为参数、返回 0 至 15 的函数。
  • friction:控制滑动程度,冰的滑度为 0.98。

这些方法都可链式调用,即连续调用。参见 Blocks 类中的示例。

注意:方块没有设置 CreativeModeTab 的方法。如果方块有对应物品(如 BlockItem),由 BuildCreativeModeTabContentsEvent 处理。方块也没有设置翻译键的方法,因为 Block#getDescriptionId 会从注册表名称生成翻译键。

高级方块

以上只能创建极其基础的方块。如果需要玩家交互等功能,则需要自定义类。Block 类的方法很多,本页无法逐一介绍;本节其他页面介绍了更多可用功能。

注册方块

方块必须注册才能工作。

重要:世界中的方块和物品栏中的“方块”是不同的对象。世界中的方块由 BlockState 表示,其行为由 Block 实例定义;物品栏中的物品则是由 Item 控制的 ItemStack。连接 Block 和 Item 的桥梁是 BlockItem。它是 Item 的子类,block 字段引用其代表的 Block,并定义方块作为物品时的部分行为,例如右键放置。Block 可以没有 BlockItem,例如 minecraft:water 作为方块存在,却没有对应物品,因此不能以物品形式持有。

注册方块时只注册方块,不会自动创建 BlockItem。创建基础 BlockItem 时,应将其注册表名称设为对应 Block 的名称,也可使用自定义 BlockItem 子类。注册后可用 Block#asItem 获取;如果没有对应 BlockItem,该方法返回 Items#AIR。不确定是否存在时应检查返回值。

可选注册方块

过去有些 Mod 允许用户在配置文件中禁用方块或物品,但不应这样做。可注册的方块数量没有限制,因此应注册 Mod 中所有方块。若要通过配置禁用某方块,应禁用其合成配方;若要在创造模式物品栏中隐藏它,可在 BuildCreativeModeTabContentsEvent 构建内容时使用 FeatureFlag。

延伸阅读

原版栅栏、墙等方块使用的属性,参见方块状态。

原文:Blocks。