From 0f030c86a7dd2908a1b011aa0ba4fabb0f98c717 Mon Sep 17 00:00:00 2001 From: EnZaXD <60033407+FlorianMichael@users.noreply.github.com> Date: Tue, 24 Oct 2023 02:03:32 +0200 Subject: [PATCH] Implement size var int in all chunk types correctly (#3495) --- .../api/type/types/chunk/ChunkType1_13.java | 9 --------- .../api/type/types/chunk/ChunkType1_14.java | 18 ++++-------------- .../api/type/types/chunk/ChunkType1_15.java | 15 +++------------ .../api/type/types/chunk/ChunkType1_16.java | 15 +++------------ .../api/type/types/chunk/ChunkType1_16_2.java | 15 +++------------ .../api/type/types/chunk/ChunkType1_17.java | 15 +++------------ .../api/type/types/chunk/ChunkType1_18.java | 3 --- .../api/type/types/chunk/ChunkType1_9_1.java | 11 +++++------ .../api/type/types/chunk/ChunkType1_9_3.java | 19 +++++-------------- 9 files changed, 26 insertions(+), 94 deletions(-) diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_13.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_13.java index 87bf0d81d..64e2c6b47 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_13.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_13.java @@ -85,15 +85,6 @@ public class ChunkType1_13 extends Type { } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, false, primaryBitmask, sections, biomeData, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_14.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_14.java index 3ea2c261f..4233136eb 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_14.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_14.java @@ -50,16 +50,15 @@ public class ChunkType1_14 extends Type { boolean fullChunk = input.readBoolean(); int primaryBitmask = Type.VAR_INT.readPrimitive(input); CompoundTag heightMap = Type.NAMED_COMPOUND_TAG.read(input); - - Type.VAR_INT.readPrimitive(input); + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[16]; for (int i = 0; i < 16; i++) { if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set - short nonAirBlocksCount = input.readShort(); - ChunkSection section = Types1_13.CHUNK_SECTION.read(input); + short nonAirBlocksCount = data.readShort(); + ChunkSection section = Types1_13.CHUNK_SECTION.read(data); section.setNonAirBlocksCount(nonAirBlocksCount); sections[i] = section; } @@ -67,20 +66,11 @@ public class ChunkType1_14 extends Type { int[] biomeData = fullChunk ? new int[256] : null; if (fullChunk) { for (int i = 0; i < 256; i++) { - biomeData[i] = input.readInt(); + biomeData[i] = data.readInt(); } } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, false, primaryBitmask, sections, biomeData, heightMap, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_15.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_15.java index 580927399..6b1b2c552 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_15.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_15.java @@ -58,29 +58,20 @@ public class ChunkType1_15 extends Type { } } - Type.VAR_INT.readPrimitive(input); // data size in bytes + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[16]; for (int i = 0; i < 16; i++) { if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set - short nonAirBlocksCount = input.readShort(); - ChunkSection section = Types1_13.CHUNK_SECTION.read(input); + short nonAirBlocksCount = data.readShort(); + ChunkSection section = Types1_13.CHUNK_SECTION.read(data); section.setNonAirBlocksCount(nonAirBlocksCount); sections[i] = section; } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, false, primaryBitmask, sections, biomeData, heightMap, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16.java index 1f7c5b794..890cc7c6f 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16.java @@ -59,29 +59,20 @@ public class ChunkType1_16 extends Type { } } - Type.VAR_INT.readPrimitive(input); // data size in bytes + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[16]; for (int i = 0; i < 16; i++) { if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set - short nonAirBlocksCount = input.readShort(); - ChunkSection section = Types1_16.CHUNK_SECTION.read(input); + short nonAirBlocksCount = data.readShort(); + ChunkSection section = Types1_16.CHUNK_SECTION.read(data); section.setNonAirBlocksCount(nonAirBlocksCount); sections[i] = section; } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, ignoreOldLightData, primaryBitmask, sections, biomeData, heightMap, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16_2.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16_2.java index 659e3ed34..dd08eff45 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16_2.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_16_2.java @@ -56,29 +56,20 @@ public class ChunkType1_16_2 extends Type { biomeData = Type.VAR_INT_ARRAY_PRIMITIVE.read(input); } - Type.VAR_INT.readPrimitive(input); // data size in bytes + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[16]; for (int i = 0; i < 16; i++) { if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set - short nonAirBlocksCount = input.readShort(); - ChunkSection section = Types1_16.CHUNK_SECTION.read(input); + short nonAirBlocksCount = data.readShort(); + ChunkSection section = Types1_16.CHUNK_SECTION.read(data); section.setNonAirBlocksCount(nonAirBlocksCount); sections[i] = section; } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, false, primaryBitmask, sections, biomeData, heightMap, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_17.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_17.java index a4f221bc8..913405244 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_17.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_17.java @@ -56,29 +56,20 @@ public final class ChunkType1_17 extends Type { int[] biomeData = Type.VAR_INT_ARRAY_PRIMITIVE.read(input); - Type.VAR_INT.readPrimitive(input); // data size in bytes + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[ySectionCount]; for (int i = 0; i < ySectionCount; i++) { if (!sectionsMask.get(i)) continue; // Section not set - short nonAirBlocksCount = input.readShort(); - ChunkSection section = Types1_16.CHUNK_SECTION.read(input); + short nonAirBlocksCount = data.readShort(); + ChunkSection section = Types1_16.CHUNK_SECTION.read(data); section.setNonAirBlocksCount(nonAirBlocksCount); sections[i] = section; } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, true, false, sectionsMask, sections, biomeData, heightMap, nbtData); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_18.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_18.java index 12ea6f578..c5aa7b6e4 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_18.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_18.java @@ -58,9 +58,6 @@ public final class ChunkType1_18 extends Type { sections[i] = sectionType.read(sectionsBuf); } } finally { - /*if (sectionsBuf.readableBytes() > 0 && Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + sectionsBuf.readableBytes() + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - }*/ sectionsBuf.release(); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_1.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_1.java index 18c29df0d..77b110319 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_1.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_1.java @@ -54,8 +54,7 @@ public class ChunkType1_9_1 extends Type { boolean groundUp = input.readBoolean(); int primaryBitmask = Type.VAR_INT.readPrimitive(input); - // Size (unused) - Type.VAR_INT.readPrimitive(input); + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); BitSet usedSections = new BitSet(16); ChunkSection[] sections = new ChunkSection[16]; @@ -69,18 +68,18 @@ public class ChunkType1_9_1 extends Type { // Read sections for (int i = 0; i < 16; i++) { if (!usedSections.get(i)) continue; // Section not set - ChunkSection section = Types1_9.CHUNK_SECTION.read(input); + ChunkSection section = Types1_9.CHUNK_SECTION.read(data); sections[i] = section; - section.getLight().readBlockLight(input); + section.getLight().readBlockLight(data); if (hasSkyLight) { - section.getLight().readSkyLight(input); + section.getLight().readSkyLight(data); } } int[] biomeData = groundUp ? new int[256] : null; if (groundUp) { for (int i = 0; i < 256; i++) { - biomeData[i] = input.readByte() & 0xFF; + biomeData[i] = data.readByte() & 0xFF; } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_3.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_3.java index 5048e30b9..ad4da233f 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_3.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/chunk/ChunkType1_9_3.java @@ -57,38 +57,29 @@ public class ChunkType1_9_3 extends Type { boolean fullChunk = input.readBoolean(); int primaryBitmask = Type.VAR_INT.readPrimitive(input); - Type.VAR_INT.readPrimitive(input); + ByteBuf data = input.readSlice(Type.VAR_INT.readPrimitive(input)); // Read sections ChunkSection[] sections = new ChunkSection[16]; for (int i = 0; i < 16; i++) { if ((primaryBitmask & (1 << i)) == 0) continue; // Section not set - ChunkSection section = Types1_9.CHUNK_SECTION.read(input); + ChunkSection section = Types1_9.CHUNK_SECTION.read(data); sections[i] = section; - section.getLight().readBlockLight(input); + section.getLight().readBlockLight(data); if (hasSkyLight) { - section.getLight().readSkyLight(input); + section.getLight().readSkyLight(data); } } int[] biomeData = fullChunk ? new int[256] : null; if (fullChunk) { for (int i = 0; i < 256; i++) { - biomeData[i] = input.readByte() & 0xFF; + biomeData[i] = data.readByte() & 0xFF; } } List nbtData = new ArrayList<>(Arrays.asList(Type.NAMED_COMPOUND_TAG_ARRAY.read(input))); - - // Read all the remaining bytes (workaround for #681) - if (input.readableBytes() > 0) { - byte[] array = Type.REMAINING_BYTES.read(input); - if (Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Found " + array.length + " more bytes than expected while reading the chunk: " + chunkX + "/" + chunkZ); - } - } - return new BaseChunk(chunkX, chunkZ, fullChunk, false, primaryBitmask, sections, biomeData, nbtData); }