跳到主要内容

方块实体的数据同步

方块实体自带的数据同步是从逻辑服务端发向逻辑客户端

  • 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();
}

//省略
//……
}