概念
特性
所有方块都分别有其基类型。基类型的例子有泥土、楼梯、树叶等。然而,为了进一步区分这些基类型,每一种方块都有一系列不同的属性,每种属性都只能取不同的有限值的集合(例如:灰化土、砖块楼梯、橡树树叶等)。一种方块可以有多个属性(例如:朝向东的砖块楼梯)。
Examples of block properties
minecraft:dirt[snowy=false,variant=default]
minecraft:dirt[snowy=true,variant=default]
minecraft:dirt[snowy=false,variant=grassless]
minecraft:dirt[snowy=true,variant=grassless]
minecraft:planks[variant=oak]
minecraft:planks[variant=spruce]
minecraft:planks[variant=birch]
minecraft:redstone_wire[east=up,north=up,power=0,south=up,west=up]
minecraft:redstone_wire[east=side,north=up,power=0,south=up,west=up]
minecraft:redstone_wire[east=none,north=up,power=0,south=up,west=up]
minecraft:redstone_wire[east=up,north=side,power=0,south=up,west=up]
然而,有些属性是临时的——它们只在游戏运行的时候才存在。它们的值不会被写入到存档文件中,因为它们的值可以被自动检测到。例如,就红石线来说,它们的被充能与否可以通过环境被检测到 (在这里有一个打开的拉杆么?) 。按照这种标准,minecraft:redstone_wire
的 power
属性,就是一个临时属性。
As of writing, Minecraft still stores block data to an old format with 12 bits for a base type (4096 possible base types) and 4 bits for 「metadata」 (16 possible values per base type). However, properties do not map directly to metadata due to legacy reasons: for example, the furnace block consists of two base types (currently smelting versus not smelting), each not utilizing their metadata at all. On the other hand, logs do use their metadata fully, but because the combination of properties exceeds 16 possible values (think tree type and direction), logs must be split over two base types.
在未来,仍然只会使用一个 16 bit 数字(基类型和属性的 65536 种组合)。方块将被自动分配一个ID上,而这一分配将会保存到世界存档中。如下所示:
0 => minecraft:dirt[snowy=false,variant=default] 1 => minecraft:dirt[snowy=true,variant=default] 2 => minecraft:dirt[snowy=false,variant=grassless] 3 => minecraft:dirt[snowy=true,variant=grassless] 4 => minecraft:planks[variant=oak] 5 => minecraft:planks[variant=spruce] 等等。
Tile Entity 数据
65536种可能的组合是没有办法存储诸如物品栏之类的大量信息的。所以*某些*方块通过额外的方式存储信息:Tile Entity。
TileEntity 本身是 Java 的对象(Object,例如一个`Chest`类)。Minecraft 通常会通过获取一个 TileEntity 的实例然后调用方法或访问字段以获取数据,就像一个普通的对象一样(world.getTileEntity(position).getInventory()
)。当 Tile Entity 需要写入文件保存时,它们将会以 NBT 格式 <https://minecraft.gamepedia.com/NBT_format>存储。
小訣竅
一些东西,比如说挂画,实际上是实体(Entity)。
不过,Tile Entity也可以覆写渲染方法使其看起来不太像一个正常的方块,尽管这往往效率低下而且会造成客户端的帧率下降。