MC Fabric 1.20.1 学习笔记 —— 制作一个独立配方的工作台 02 BlockEntity

219 阅读1分钟

方块实体类编写

方块实体相对简单,主要是编写其内部存放物品的相关内容。
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接口

建议自己实现一个,这是一个一劳永逸的工作,后续很多类都可以直接使用,你需要对自己实现的这个接口有相当的熟悉。