broken-arrow

Untitled

Dec 15th, 2021 (edited)
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.75 KB | None | 0 0
  1. package net.minecraft.network.protocol.game;
  2.  
  3. import com.google.common.collect.Lists;
  4. import io.netty.buffer.ByteBuf;
  5. import io.netty.buffer.Unpooled;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map.Entry;
  9. import java.util.function.Consumer;
  10. import javax.annotation.Nullable;
  11. import net.minecraft.core.BlockPos;
  12. import net.minecraft.core.Registry;
  13. import net.minecraft.core.SectionPos;
  14. import net.minecraft.core.BlockPos.MutableBlockPos;
  15. import net.minecraft.nbt.CompoundTag;
  16. import net.minecraft.nbt.LongArrayTag;
  17. import net.minecraft.network.FriendlyByteBuf;
  18. import net.minecraft.world.level.block.entity.BlockEntity;
  19. import net.minecraft.world.level.block.entity.BlockEntityType;
  20. import net.minecraft.world.level.chunk.LevelChunk;
  21. import net.minecraft.world.level.chunk.LevelChunkSection;
  22. import net.minecraft.world.level.levelgen.Heightmap;
  23. import net.minecraft.world.level.levelgen.Heightmap.Types;
  24.  
  25. public class ClientboundLevelChunkPacketData {
  26.     private static final int TWO_MEGABYTES = 2097152;
  27.     private final CompoundTag heightmaps;
  28.     private final byte[] buffer;
  29.     private final List<ClientboundLevelChunkPacketData.BlockEntityInfo> blockEntitiesData;
  30.  
  31.     public ClientboundLevelChunkPacketData(LevelChunk var0) {
  32.         this.heightmaps = new CompoundTag();
  33.         Iterator var2 = var0.getHeightmaps().iterator();
  34.  
  35.         Entry var2;
  36.         while(var2.hasNext()) {
  37.             var2 = (Entry)var2.next();
  38.             if (((Types)var2.getKey()).sendToClient()) {
  39.                 this.heightmaps.put(((Types)var2.getKey()).getSerializationKey(), new LongArrayTag(((Heightmap)var2.getValue()).getRawData()));
  40.             }
  41.         }
  42.  
  43.         this.buffer = new byte[calculateChunkSize(var0)];
  44.         extractChunkData(new FriendlyByteBuf(this.getWriteBuffer()), var0);
  45.         this.blockEntitiesData = Lists.newArrayList();
  46.         var2 = var0.getBlockEntities().entrySet().iterator();
  47.  
  48.         while(var2.hasNext()) {
  49.             var2 = (Entry)var2.next();
  50.             this.blockEntitiesData.add(ClientboundLevelChunkPacketData.BlockEntityInfo.create((BlockEntity)var2.getValue()));
  51.         }
  52.  
  53.     }
  54.  
  55.     public ClientboundLevelChunkPacketData(FriendlyByteBuf var0, int var1, int var2) {
  56.         this.heightmaps = var0.readNbt();
  57.         if (this.heightmaps == null) {
  58.             throw new RuntimeException("Can't read heightmap in packet for [" + var1 + ", " + var2 + "]");
  59.         } else {
  60.             int var3 = var0.readVarInt();
  61.             if (var3 > 2097152) {
  62.                 throw new RuntimeException("Chunk Packet trying to allocate too much memory on read.");
  63.             } else {
  64.                 this.buffer = new byte[var3];
  65.                 var0.readBytes(this.buffer);
  66.                 this.blockEntitiesData = var0.readList(ClientboundLevelChunkPacketData.BlockEntityInfo::new);
  67.             }
  68.         }
  69.     }
  70.  
  71.     public void write(FriendlyByteBuf var0) {
  72.         var0.writeNbt(this.heightmaps);
  73.         var0.writeVarInt(this.buffer.length);
  74.         var0.writeBytes(this.buffer);
  75.         var0.writeCollection(this.blockEntitiesData, (var0x, var1) -> {
  76.             var1.write(var0x);
  77.         });
  78.     }
  79.  
  80.     private static int calculateChunkSize(LevelChunk var0) {
  81.         int var1 = 0;
  82.         LevelChunkSection[] var2 = var0.getSections();
  83.         int var3 = var2.length;
  84.  
  85.         for(int var4 = 0; var4 < var3; ++var4) {
  86.             LevelChunkSection var5 = var2[var4];
  87.             var1 += var5.getSerializedSize();
  88.         }
  89.  
  90.         return var1;
  91.     }
  92.  
  93.     private ByteBuf getWriteBuffer() {
  94.         ByteBuf var0 = Unpooled.wrappedBuffer(this.buffer);
  95.         var0.writerIndex(0);
  96.         return var0;
  97.     }
  98.  
  99.     public static void extractChunkData(FriendlyByteBuf var0, LevelChunk var1) {
  100.         LevelChunkSection[] var2 = var1.getSections();
  101.         int var3 = var2.length;
  102.  
  103.         for(int var4 = 0; var4 < var3; ++var4) {
  104.             LevelChunkSection var5 = var2[var4];
  105.             var5.write(var0);
  106.         }
  107.  
  108.     }
  109.  
  110.     public Consumer<ClientboundLevelChunkPacketData.BlockEntityTagOutput> getBlockEntitiesTagsConsumer(int var0, int var1) {
  111.         return (var2) -> {
  112.             this.getBlockEntitiesTags(var2, var0, var1);
  113.         };
  114.     }
  115.  
  116.     private void getBlockEntitiesTags(ClientboundLevelChunkPacketData.BlockEntityTagOutput var0, int var1, int var2) {
  117.         int var3 = 16 * var1;
  118.         int var4 = 16 * var2;
  119.         MutableBlockPos var5 = new MutableBlockPos();
  120.         Iterator var7 = this.blockEntitiesData.iterator();
  121.  
  122.         while(var7.hasNext()) {
  123.             ClientboundLevelChunkPacketData.BlockEntityInfo var7 = (ClientboundLevelChunkPacketData.BlockEntityInfo)var7.next();
  124.             int var8 = var3 + SectionPos.sectionRelative(var7.packedXZ >> 4);
  125.             int var9 = var4 + SectionPos.sectionRelative(var7.packedXZ);
  126.             var5.set(var8, var7.y, var9);
  127.             var0.accept(var5, var7.type, var7.tag);
  128.         }
  129.  
  130.     }
  131.  
  132.     public FriendlyByteBuf getReadBuffer() {
  133.         return new FriendlyByteBuf(Unpooled.wrappedBuffer(this.buffer));
  134.     }
  135.  
  136.     public CompoundTag getHeightmaps() {
  137.         return this.heightmaps;
  138.     }
  139.  
  140.     private static class BlockEntityInfo {
  141.         final int packedXZ;
  142.         final int y;
  143.         final BlockEntityType<?> type;
  144.         @Nullable
  145.         final CompoundTag tag;
  146.  
  147.         private BlockEntityInfo(int var0, int var1, BlockEntityType<?> var2, @Nullable CompoundTag var3) {
  148.             this.packedXZ = var0;
  149.             this.y = var1;
  150.             this.type = var2;
  151.             this.tag = var3;
  152.         }
  153.  
  154.         private BlockEntityInfo(FriendlyByteBuf var0) {
  155.             this.packedXZ = var0.readByte();
  156.             this.y = var0.readShort();
  157.             int var1 = var0.readVarInt();
  158.             this.type = (BlockEntityType)Registry.BLOCK_ENTITY_TYPE.byId(var1);
  159.             this.tag = var0.readNbt();
  160.         }
  161.  
  162.         void write(FriendlyByteBuf var0) {
  163.             var0.writeByte(this.packedXZ);
  164.             var0.writeShort(this.y);
  165.             var0.writeVarInt(Registry.BLOCK_ENTITY_TYPE.getId(this.type));
  166.             var0.writeNbt(this.tag);
  167.         }
  168.  
  169.         static ClientboundLevelChunkPacketData.BlockEntityInfo create(BlockEntity var0) {
  170.             CompoundTag var1 = var0.getUpdateTag();
  171.             BlockPos var2 = var0.getBlockPos();
  172.             int var3 = SectionPos.sectionRelative(var2.getX()) << 4 | SectionPos.sectionRelative(var2.getZ());
  173.             return new ClientboundLevelChunkPacketData.BlockEntityInfo(var3, var2.getY(), var0.getType(), var1.isEmpty() ? null : var1);
  174.         }
  175.     }
  176.  
  177.     @FunctionalInterface
  178.     public interface BlockEntityTagOutput {
  179.         void accept(BlockPos var1, BlockEntityType<?> var2, @Nullable CompoundTag var3);
  180.     }
  181. }
  182.  
Add Comment
Please, Sign In to add comment