Flandre923
753 words
4 minutes
33 原版提供的能力ItemHander物品处理能力

参考#

https://boson.v2mcdev.com/capability/simpleusage.html https://docs.neoforged.net/docs/datastorage/capabilities

开始构建能力#

这次我们来使用原版给我们提供的ItemHandler处理物品的输入和输出。关于介绍看之前的教程,然后我们这次实现一个垃圾桶,从上方输入,然后只能输入石头,然后删除石头。

常规的方块注册。

public class TrashBlock extends BaseEntityBlock {
    public TrashBlock() {
        super(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE));
    }

    @Override
    protected MapCodec<? extends BaseEntityBlock> codec() {
        return null;
    }

    @Nullable
    @Override
    public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) {
        return new TrashBlockEntity(pPos,pState);
    }

    @Override
    public RenderShape getRenderShape(BlockState pState) {
        return RenderShape.MODEL;
    }
}

方块实体注册

public class TrashBlockEntity extends BlockEntity {
    public TrashBlockEntity(BlockPos pPos, BlockState pBlockState) {
        super(ModBlockEntities.TRASH_BLOCK_ENTITY.get(), pPos, pBlockState);
    }
}
    public static final Supplier<Block> TRASH_BLOCK = registerBlock("trash_block",TrashBlock::new);
    public static final Supplier<BlockEntityType<TrashBlockEntity>> TRASH_BLOCK_ENTITY =
            BLOCK_ENTITIES.register("trash_block_entity", () ->
                    BlockEntityType.Builder.of(TrashBlockEntity::new,
                            ModBlocks.TRASH_BLOCK.get()).build(null));

给我们的实体注册的对于的物品处理的能力。我们让provider返回物品处理的API接口,我们自己实现这个API接口。

/**
 * ModEventBus 类是一个静态内部类,用于处理 Mod 事件总线上的事件。
 * 它使用 @Mod.EventBusSubscriber 注解来订阅 Mod 事件总线上的事件。
 */
@Mod.EventBusSubscriber(modid = ExampleMod.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public static class ModEventBus {
    /**
     * registerCapabilities 方法用于注册方块实体的能力。
     * 它使用 @SubscribeEvent 注解来订阅 RegisterCapabilitiesEvent 事件。
     *
     * @param event RegisterCapabilitiesEvent 事件对象
     */
    @SubscribeEvent
    private static void registerCapabilities(RegisterCapabilitiesEvent event) {
        // 注册方块实体的物品处理器能力
        event.registerBlockEntity(
                Capabilities.ItemHandler.BLOCK,
                ModBlockEntities.TRASH_BLOCK_ENTITY.get(),
                (myBlockEntity, side) -> {
                    // 如果方块实体的面为上面,则返回一个自定义的物品处理器
                    if (side == Direction.UP) {
                        return new IItemHandler() {
                            /**
                             * 获取物品处理器的槽位数量。
                             *
                             * @return 槽位数量,固定为 1
                             */
                            @Override
                            public int getSlots() {
                                return 1;
                            }

                            /**
                             * 获取指定槽位的物品堆叠。
                             *
                             * @param slot 槽位索引
                             * @return 空的物品堆叠
                             */
                            @Override
                            public @NotNull ItemStack getStackInSlot(int slot) {
                                return ItemStack.EMPTY;
                            }

                            /**
                             * 将物品插入指定槽位。
                             *
                             * @param slot     槽位索引
                             * @param stack    要插入的物品堆叠
                             * @param simulate 是否为模拟插入
                             * @return 插入后剩余的物品堆叠
                             */
                            @Override
                            public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) {
                                // 如果物品不合法,则直接返回原物品堆叠
                                if (!this.isItemValid(slot, stack)) return stack;
                                // 如果是模拟插入,则返回空的物品堆叠
                                if (simulate) {
                                    return ItemStack.EMPTY;
                                } else {
                                    // 复制物品堆叠并减少数量,返回剩余的物品堆叠
                                    stack = stack.copy();
                                    stack.shrink(1);
                                    return stack;
                                }
                            }

                            /**
                             * 从指定槽位提取物品。
                             *
                             * @param slot    槽位索引
                             * @param amount  要提取的数量
                             * @param simulate 是否为模拟提取
                             * @return 空的物品堆叠
                             */
                            @Override
                            public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) {
                                return ItemStack.EMPTY;
                            }

                            /**
                             * 获取指定槽位的物品数量限制。
                             *
                             * @param slot 槽位索引
                             * @return 槽位索引值
                             */
                            @Override
                            public int getSlotLimit(int slot) {
                                return slot;
                            }
                            /**
                            * 判断指定槽位是否可以接受给定的物品堆叠。
                            *
                            * @param slot 槽位索引
                            * @param stack 物品堆叠
                            * @return 如果物品为圆石,则返回 true,否则返回 false
                            */
                            @Override
                            public boolean isItemValid(int slot, @NotNull ItemStack stack) {
                                return stack.getItem() == Items.COBBLESTONE;
                            }
                            };
                        } else {
                            // 如果方块实体的面不是上面,则返回 null
                            return null;
                        }
                    }
            );
        }
    }
33 原版提供的能力ItemHander物品处理能力
https://fuwari.vercel.app/posts/minecraft1_20_4/out_33-原版提供的能力itemhander物品处理能力/
Author
Flandre923
Published at
2024-04-14