方块实体类编写
方块实体相对简单,主要是编写其内部存放物品的相关内容。
EasyInventory是我自己实现的一个存储物品的接口,你可以自己去实现一个,只要实现net.minecraft.inventory.Inventory即可,文末有我自己实现的EasyInventory范例,仅供参考,不做详细注释。
public class WorkBlockEntity extends BlockEntity implements EasyInventory {
public static final String NAME = "work_block_entity";
public static BlockEntityType<WorkBlockEntity> WORK_BLOCK_ENTITY_BLOCK_ENTITY_TYPE;
// DefaultedList可以看做一个MC定制版本的ArrayList
private final DefaultedList<ItemStack> items = DefaultedList.ofSize(9, ItemStack.EMPTY);
public WorkBlockEntity(BlockPos pos, BlockState state) {
super(WORK_BLOCK_ENTITY_BLOCK_ENTITY_TYPE, pos, state);
}
@Override
public DefaultedList<ItemStack> getItems() {
return items;
}
// 在NBT标签内存放方块实体内的物品列表,这里read和write用于服务器和客户端的网络通信。
@Override
public void readNbt(NbtCompound nbt) {
super.readNbt(nbt);
Inventories.readNbt(nbt, items);
}
@Override
protected void writeNbt(NbtCompound nbt) {
super.writeNbt(nbt);
Inventories.writeNbt(nbt, items);
}
// 这是我自己写的注册方法,如果你有自己的注册方法可以忽略。
public static void registerBlockEntityType(){
WORK_BLOCK_ENTITY_BLOCK_ENTITY_TYPE =
Registry.register(Registries.BLOCK_ENTITY_TYPE,
new Identifier(ModInfo.MOD_ID, NAME),
FabricBlockEntityTypeBuilder.create(WorkBlockEntity::new, WorkBlock.INSTANCE).build()
);
}
}
EasyInventory接口
建议自己实现一个,这是一个一劳永逸的工作,后续很多类都可以直接使用,你需要对自己实现的这个接口有相当的熟悉。