方块实体的数据同步
方块实体自带的数据同步是从逻辑服务端发向逻辑客户端的
- NBT处理
getUpdateTag
:写数据(序列化)load
:读数据(反序列化)
- 数据包处理
getUpdatePacket
:在方块实体更新时写数据- 大多数子类使用
ClientboundBlockEntityDataPacket.create(this)
从getUpdateTag
获取数据
- 大多数子类使用
handleUpdateTag
:在区块加载时读数据- 默认直接调用
load
处理
- 默认直接调用
- ...
ClientboundBlockEntityDataPacket
package net.minecraft.network.protocol.game;
public class ClientboundBlockEntityDataPacket implements Packet<ClientGamePacketListener> {
private final BlockPos pos;
/** Used only for vanilla block entities */
private final BlockEntityType<?> type;
@Nullable
private final CompoundTag tag;
//如果你有特殊需求可以直接使用这个方法
public static ClientboundBlockEntityDataPacket create(BlockEntity pBlockEntity, Function<BlockEntity, CompoundTag> pTagGetter) {
return new ClientboundBlockEntityDataPacket(pBlockEntity.getBlockPos(), pBlockEntity.getType(), pTagGetter.apply(pBlockEntity));
}
//这就是我们使用的方法
public static ClientboundBlockEntityDataPacket create(BlockEntity pBlockEntity) {
return create(pBlockEntity, BlockEntity::getUpdateTag);
}
private ClientboundBlockEntityDataPacket(BlockPos pPos, BlockEntityType<?> pType, CompoundTag pTag) {
this.pos = pPos;
this.type = pType;
this.tag = pTag.isEmpty() ? null : pTag;
}
public ClientboundBlockEntityDataPacket(FriendlyByteBuf pBuffer) {
this.pos = pBuffer.readBlockPos();
this.type = pBuffer.readById(BuiltInRegistries.BLOCK_ENTITY_TYPE);
this.tag = pBuffer.readNbt();
}
//省略
//……
}