NeoForge-1.20.4Mod开发教程之方块的tick方法

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

 

和上期一样,先创建方块实体和相关的方块,这期方块的功能是向最近的玩家每隔一定时间发送信息

创建HelloBlockEntity类

public class HelloBlockEntity extends BlockEntity {
     private static final int MAX_TIME = 5 * 20;//发送间隔时间,5s
     private int timer = 0;
     private final Component message = Component.literal("Hello");//发送内容
 ​
     public HelloBlockEntity(BlockPos pos, BlockState blockState) {
         super(ModBlockEntities.HELLO_BLOCK_ENTITY.get(), pos, blockState);
    }
 ​
     public static void serverTick(Level level, BlockPos pos, BlockState state, HelloBlockEntity blockEntity) {
         if (level.isClientSide) {//逻辑处理要在服务端
             return;
        }
 ​
         blockEntity.timer++;
         if (blockEntity.timer >= MAX_TIME) {
             Player nearestPlayer = level.getNearestPlayer(pos.getX(), pos.getY(), pos.getZ(), 10.0, false);//10为距离
             if (nearestPlayer != null) {
                     nearestPlayer.sendSystemMessage(blockEntity.message);
            }
             blockEntity.timer = 0;//发送成功后归零。注意退出游戏后计时也会归零
        }
    }
 }

 

创建HelloBlock类

public class HelloBlock extends BaseEntityBlock {
 ​
     public HelloBlock() {
         super(Properties.ofFullCopy(Blocks.STONE));
    }
 ​
     @Override
     protected MapCodec<? extends BaseEntityBlock> codec() {
         return null;
    }
 ​
     @Override
     public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
         return new HelloBlockEntity(pos, state);
    }
 ​
     @Override
     public @NotNull RenderShape getRenderShape(BlockState state) {
         return RenderShape.MODEL;
    }
     @Override
     public @Nullable <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> blockEntityType) {
         return level.isClientSide ? null : createTickerHelper(blockEntityType,
                 ModBlockEntities.HELLO_BLOCK_ENTITY.get(), HelloBlockEntity::serverTick);//最后调用我们写的tick方法
    }
 }

 

调用流程(从放方块到每 tick 执行)

1.玩家放置方块

2.引擎发现这个方块是“可带实体”的方块(如BaseEntityBlock

3.调用方块的newBlockEntity(...)创建BlockEntity实例

4.方块和这个BlockEntity绑定在该坐标上

5.每个游戏tick,游戏会询问方块getTicker(...)

6.如果getTicker返回 null:这个方块实体本tick不更新

7.如果返回BlockEntityTicker:游戏调用这个ticker

8.ticker内部执行你的更新逻辑(计时、配方推进、发消息、同步等)

9.下一tick重复步骤 5-8

 

结构关系图(简化)

Block (方块类型)

├─ newBlockEntity(…) -> 创建 BlockEntity

└─ getTicker(…) -> 提供/不提供 每tick回调

BlockEntity (方块实体数据)

├─ 保存自定义数据 (NBT)

└─ 被ticker每tick驱动更新

 

服务端/客户端双侧视角

Server Level: getTicker -> 通常返回 server ticker -> 跑影响游戏状态的逻辑

Client Level: getTicker -> 常返回 null(或仅动画 ticker)-> 避免重复逻辑

© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容