本篇教程参考为的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:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







暂无评论内容