package net.minecraft.network.protocol.game; import java.util.function.BiFunction; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; public class ClientboundBlockEntityDataPacket implements Packet { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( BlockPos.STREAM_CODEC, ClientboundBlockEntityDataPacket::getPos, ByteBufCodecs.registry(Registries.BLOCK_ENTITY_TYPE), ClientboundBlockEntityDataPacket::getType, ByteBufCodecs.TRUSTED_COMPOUND_TAG, ClientboundBlockEntityDataPacket::getTag, ClientboundBlockEntityDataPacket::new ); private final BlockPos pos; /** * Used only for vanilla block entities */ private final BlockEntityType type; private final CompoundTag tag; public static ClientboundBlockEntityDataPacket create(BlockEntity blockEntity, BiFunction dataGetter) { RegistryAccess registryAccess = blockEntity.getLevel().registryAccess(); return new ClientboundBlockEntityDataPacket(blockEntity.getBlockPos(), blockEntity.getType(), (CompoundTag)dataGetter.apply(blockEntity, registryAccess)); } public static ClientboundBlockEntityDataPacket create(BlockEntity blockEntity) { return create(blockEntity, BlockEntity::getUpdateTag); } private ClientboundBlockEntityDataPacket(BlockPos pos, BlockEntityType type, CompoundTag tag) { this.pos = pos; this.type = type; this.tag = tag; } @Override public PacketType type() { return GamePacketTypes.CLIENTBOUND_BLOCK_ENTITY_DATA; } /** * Passes this Packet on to the NetHandler for processing. */ public void handle(ClientGamePacketListener handler) { handler.handleBlockEntityData(this); } public BlockPos getPos() { return this.pos; } public BlockEntityType getType() { return this.type; } public CompoundTag getTag() { return this.tag; } }