Minecraft Fabric模组开发 (六) 方块实体

方块实体

  • 上一章节简单了解了方块的状态。启动游戏时,一个方块所有可能的状态都会被注册,这就意味着如果你有14个布尔属性,这个方块就有2^14=16384个状态被注册,因为这个原因,方块不应该有太多的方块状态属性。准确来说,方块状态是用来看的,BlockEntity(方块实体)才是用于更高级状态的。

  • BlockEntity(方块实体)主要用于向方块存储数据,因此在创建方块实体之前,得先有个方块,这一章节讲BlockEntity的创建和注册。

  • 创建和注册

    • 创建方块实体类,继承自BlockEntity (这里会提示有错误,先不用管)

      public class IronFurnaceBlockEntity extends BlockEntity {
      
          public IronFurnaceBlockEntity() {
          }
      }
      
    • 注册方块实体(这里也会提示有错误,先不管)

      //声明
      public static BlockEntityType<IronFurnaceBlockEntity> IRON_FURNACE_BLOCK_ENTITY;
      
      
      //注册, 在onInitialize()方法中
      IRON_FURNACE_BLOCK_ENTITY = Registry.register(Registry.BLOCK_ENTITY, "demo:iron_furnace", BlockEntityType.Builder.create(IronFurnaceBlockEntity::new, IRON_FURNACE_BLOCK).build(null));
      
    • 修改方块实体类构造方法

      public IronFurnaceBlockEntity() {
          super(DemoMod.INSTANCE.IRON_FURNACE_BLOCK_ENTITY);
      }
      
      //这里传入了DemoMod类的实例,下面是实现:
      public class DemoMod implements ModInitializer {
          public static DemoMod INSTANCE;
          public DemoMod(){INSTANCE = this;}
          [...]
      }
      
    • 在你的Block类中实现BlockEntityProvider接口

      public class IronFurnaceBlock extends Block implements BlockEntityProvider {
          [...]
          @Override
          public BlockEntity createBlockEntity(BlockView view) {
              return new IronFurnaceBlockEntity();
          }
      }
      
    • 现在,方块实体就已经可以使用了,但是还没有任何功能。

  • 序列化数据

    • 重写toTagfromTag方法,这里新建了一个变量和方法用来测试。

      private int num = 0;
      @Override
      public CompoundTag toTag(CompoundTag compoundTag) {
          super.toTag(compoundTag);
          compoundTag.putInt("num",num);
          return compoundTag;
      }
      
      @Override
      public void fromTag(CompoundTag compoundTag) {
          super.fromTag(compoundTag);
          num = compoundTag.getInt("num");
      }
      public void numAdd(){ //调用函数,变量+1,并打印
          num++;
          System.out.println("The Number is "+ num);
      }
      
    • IronFurnaceBlock类中重写activate方法,实现右键方块功能

      @Override
      public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
          if (world.isClient)return true; 
          //获取方块实体
          IronFurnaceBlockEntity blockEntity = (IronFurnaceBlockEntity) world.getBlockEntity(pos);
          //数字加1
          blockEntity.numAdd();
          return true;
      }
      
    • 运行游戏,验证实现

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtUrtQ9s-1584884073045)(./Resource/image/19.png)]

      重新进入世界后,数据也能正常读取保存

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F4yuqZQs-1584884073046)(./Resource/image/20.png)]

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值