package net.minecraft.network.protocol.game; import java.util.Collection; import java.util.List; import java.util.Optional; 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.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jetbrains.annotations.Nullable; public record ClientboundMapItemDataPacket( MapId mapId, byte scale, boolean locked, Optional> decorations, Optional colorPatch ) implements Packet { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( MapId.STREAM_CODEC, ClientboundMapItemDataPacket::mapId, ByteBufCodecs.BYTE, ClientboundMapItemDataPacket::scale, ByteBufCodecs.BOOL, ClientboundMapItemDataPacket::locked, MapDecoration.STREAM_CODEC.apply(ByteBufCodecs.list()).apply(ByteBufCodecs::optional), ClientboundMapItemDataPacket::decorations, MapItemSavedData.MapPatch.STREAM_CODEC, ClientboundMapItemDataPacket::colorPatch, ClientboundMapItemDataPacket::new ); public ClientboundMapItemDataPacket( MapId mapId, byte scale, boolean locked, @Nullable Collection decorations, @Nullable MapItemSavedData.MapPatch colorPatch ) { this(mapId, scale, locked, decorations != null ? Optional.of(List.copyOf(decorations)) : Optional.empty(), Optional.ofNullable(colorPatch)); } @Override public PacketType type() { return GamePacketTypes.CLIENTBOUND_MAP_ITEM_DATA; } /** * Passes this Packet on to the NetHandler for processing. */ public void handle(ClientGamePacketListener handler) { handler.handleMapItemData(this); } /** * Sets new MapData from the packet to given MapData param */ public void applyToMap(MapItemSavedData mapData) { this.decorations.ifPresent(mapData::addClientSideDecorations); this.colorPatch.ifPresent(mapPatch -> mapPatch.applyToMap(mapData)); } }