NeoForge-1.20.4Mod开发教程之物品处理能力

本篇教程参考为Flandre芙兰的NeoForge1.20.4Mod开发的视频,这篇教程是我边学边总结的,与其说是教程更像我的学习笔记,如有不清楚的地方,大家可以在评论区提问。在我力所能及的范围内,我都会解答的。

 

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

常规的方块注册

public class Trash extends BaseEntityBlock {
     public Trash() {
         super(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE));
    }
 ​
     @Override
     protected MapCodec<? extends BaseEntityBlock> codec() {
         return null;
    }
 ​
     @Override
     public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
         return new TrashBlockEntity(pos, state);
    }
 ​
     @Override
     @SuppressWarnings("deprecation")
     public @NotNull RenderShape getRenderShape(BlockState state) {
         return RenderShape.MODEL;
    }
 }

 

方块实体注册

public class TrashBlockEntity extends BlockEntity {
     public TrashBlockEntity(BlockPos pos, BlockState blockState) {
         super(ModBlockEntities.TRASH_BLOCK_ENTITY.get(), pos, blockState);
    }
 }
public static final Supplier<BlockEntityType<TrashBlockEntity>> TRASH_BLOCK_ENTITY=
             BLOCK_ENTITIES.register("trash_block_entity", () ->
                     BlockEntityType.Builder.of(TrashBlockEntity::new,ModBlocks.TRASH.get()).build(null));

 

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

public class TrashItemHandler extends ItemStackHandler {
     /**
      * 获取物品处理器的槽位数量。
      *
      * @return 槽位数量,固定为 1
      */
     @Override
     public int getSlots() {
         return 1;
    }
 ​
 ​
     /**
      * 获取指定槽位的物品堆叠。
      *
      * @param slot 槽位索引
      * @return 空的物品堆叠
      */
     @Override
     public ItemStack getStackInSlot(int slot) {
         return ItemStack.EMPTY;
    }
 ​
 ​
     /**
      * 将物品插入指定槽位。
      *
      * @param slot     槽位索引
      * @param stack   要插入的物品堆叠
      * @param simulate 是否为模拟插入
      * @return 插入后剩余的物品堆叠
      */
     @Override
     public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
         if (simulate)
        {
             return ItemStack.EMPTY;
        }
         else {
             stack = stack.copy();
             stack.shrink(1);
             return stack;
        }
    }
 ​
 ​
     /**
      * 从指定槽位提取物品。
      *
      * @param slot   槽位索引
      * @param amount 要提取的数量
      * @param simulate 是否为模拟提取
      * @return 空的物品堆叠
      */
     @Override
     public 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
      */
     @Override
     public boolean isItemValid(int slot, ItemStack stack) {
         return true;
    }
 }
event.registerBlockEntity(
                     Capabilities.ItemHandler.BLOCK,
                     ModBlockEntities.TRASH_BLOCK_ENTITY.get(),
                    (myBlockEntity,side)->{
                         if (side== Direction.UP){
                             return new TrashItemHandler();
                        }
                         return null;
                    }
            );
© 版权声明
THE END
喜欢就支持一下吧
点赞3赞赏 分享
评论 抢沙发

    暂无评论内容