方块实体(Block Entities)
方块实体允许在方块上存储数据,适用于方块状态不合适的情况。这对于具有无限选项数量的数据尤其如此,例如物品栏。方块实体是静止的并绑定到方块,但在其他方面与实体有许多相似之处,因此得名。
备注
如果您的方块具有有限且合理数量(最多几百个)的可能状态,您可能需要考虑使用方块状态代替。
创建和注册方块实体
与实体类似但与方块不同,BlockEntity类表示方块实体实例,而不是注册的单例对象。单例通过BlockEntityType<?>类表示。我们需要两者来创建一个新的方块实体。
让我们从创建方块实体类开始:
public class MyBlockEntity extends BlockEntity {
public MyBlockEntity(BlockPos pos, BlockState state) {
super(type, pos, state);
}
}
您可能已经注意到,我们向超类构造函数传递了一个未定义的变量type。让我们暂时保留这个未定义的变量,转而进行注册。
注册以类似于实体的方式进行。我们创建关联的单例类BlockEntityType<?>的实例,并将其注册到方块实体类型注册表,如下所示:
public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITY_TYPES =
DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, ExampleMod.MOD_ID);
public static final Supplier<BlockEntityType<MyBlockEntity>> MY_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register(
"my_block_entity",
// 方块实体类型。
() -> new BlockEntityType<>(
// 用于构造方块实体实例的供应器。
MyBlockEntity::new,
// 可以拥有此方块实体的方块可变参数。
// 这假设引用的方块作为DeferredBlock<Block>存在。
MyBlocks.MY_BLOCK_1.get(), MyBlocks.MY_BLOCK_2.get()
)
);