diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java index a167a261d..ff414c7df 100644 --- a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java +++ b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java @@ -1,38 +1,4 @@ package us.myles.ViaVersion.api.minecraft.chunks; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; - -@RequiredArgsConstructor -@Getter -@ToString -public class Chunk { - private final int x; - private final int z; - private final boolean groundUp; - private final int primaryBitmask; - private final ChunkSection[] sections; - private final byte[] biomeData; - private boolean unloadPacket = false; - - /** - * Chunk unload. - * - * @param x coord - * @param z coord - */ - public Chunk(int x, int z) { - this(x, z, true, 0, new ChunkSection[16], null); - this.unloadPacket = true; - } - - /** - * Does this chunk have biome data - * - * @return True if the chunk has biome data - */ - public boolean hasBiomeData() { - return biomeData != null && groundUp; - } +public interface Chunk { } diff --git a/src/main/java/us/myles/ViaVersion/api/type/Type.java b/src/main/java/us/myles/ViaVersion/api/type/Type.java index 33f89bb63..2bd3ffdce 100644 --- a/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -70,7 +70,6 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { /* Actual Class */ private final Class outputClass; - private final Set> compatibilities; private final String typeName; public Type(Class outputClass) { @@ -80,7 +79,6 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public Type(String typeName, Class outputClass) { this.outputClass = outputClass; this.typeName = typeName; - this.compatibilities = new HashSet<>(); } public Class getBaseClass() { diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java b/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java new file mode 100644 index 000000000..51097d646 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java @@ -0,0 +1,19 @@ +package us.myles.ViaVersion.api.type.types.minecraft; + +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; +import us.myles.ViaVersion.api.type.Type; + +public abstract class BaseChunkType extends Type { + public BaseChunkType() { + super(Chunk.class); + } + + public BaseChunkType(String typeName) { + super(typeName, Chunk.class); + } + + @Override + public Class getBaseClass() { + return BaseChunkType.class; + } +} diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java b/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java index 78e5f1eec..a0205a8b5 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java @@ -17,9 +17,9 @@ public class ViaPacketHandler extends MessageToMessageEncoder { @Override protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { - // Split chunk bulk packet up in to single chunk packets before it reached the encoder. - // This will prevent issues with several plugins and other protocol handlers due to the chunk being sent twice. - // It also sends the chunk in the right order possible resolving some issues with added chunk/block/entity data. + // Split chunks bulk packet up in to single chunks packets before it reached the encoder. + // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. + // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. if (!(o instanceof ByteBuf)) { info.setLastPacket(o); /* This transformer is more for fixing issues which we find hard at packet level :) */ diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/BlockEntity.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/BlockEntity.java index 2394b82a8..e4c674930 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/BlockEntity.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/BlockEntity.java @@ -52,8 +52,6 @@ public class BlockEntity { Position pos = new Position((long) x, (long) y, (long) z); - //Sorry, the PacketWrapper class wil handle this in the future - //TODO let the packetwrapper class handle it if (newId != 9) { updateBlockEntity(pos, (short) newId, tag, connection); } else { diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java index aa6d6a2ad..309429473 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java @@ -3,12 +3,13 @@ package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4; import lombok.AllArgsConstructor; import lombok.Data; import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import java.util.List; @Data @AllArgsConstructor -public class Chunk1_9_3_4 { +public class Chunk1_9_3_4 implements Chunk { private int x; private int z; private boolean groundUp; diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java index eed280e50..668011548 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java @@ -2,18 +2,20 @@ package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4; import io.netty.buffer.ByteBuf; import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; import java.util.ArrayList; import java.util.List; -public class Chunk1_9_3_4Type extends Type { +public class Chunk1_9_3_4Type extends BaseChunkType { public Chunk1_9_3_4Type() { - super("1.9.3 Chunk", Chunk1_9_3_4.class); + super("1.9.3 Chunk"); } @Override - public Chunk1_9_3_4 read(ByteBuf input) throws Exception { + public Chunk read(ByteBuf input) throws Exception { int chunkX = input.readInt(); int chunkZ = input.readInt(); @@ -33,7 +35,11 @@ public class Chunk1_9_3_4Type extends Type { } @Override - public void write(ByteBuf buffer, Chunk1_9_3_4 chunk) throws Exception { + public void write(ByteBuf buffer, Chunk input) throws Exception { + if (!(input instanceof Chunk1_9_3_4)) + throw new Exception("Tried to send the wrong chunk type from 1.9.3-4 chunk: " + input.getClass()); + Chunk1_9_3_4 chunk = (Chunk1_9_3_4) input; + buffer.writeInt(chunk.getX()); buffer.writeInt(chunk.getZ()); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java index 51649a0b1..dd97ba530 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java @@ -4,6 +4,7 @@ import org.spacehq.opennbt.tag.builtin.CompoundTag; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -11,7 +12,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; public class Protocol1_9_1_2TO1_9_3_4 extends Protocol { - public static Type CHUNK = new Chunk1_9_3_4Type(); + public static Type CHUNK = new Chunk1_9_3_4Type(); @Override protected void registerPackets() { @@ -56,8 +57,8 @@ public class Protocol1_9_1_2TO1_9_3_4 extends Protocol { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { - Chunk1_9_3_4 chunk = wrapper.passthrough(CHUNK); - BlockEntity.handle(chunk.getBlockEntities(), wrapper.user()); + Chunk chunk = wrapper.passthrough(CHUNK); + BlockEntity.handle(((Chunk1_9_3_4) chunk).getBlockEntities(), wrapper.user()); } }); } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2.java new file mode 100644 index 000000000..dc9171f4e --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; + +import java.util.List; + +@Data +@AllArgsConstructor +public class Chunk1_9_1_2 implements Chunk { + private int x; + private int z; + private boolean groundUp; + private int bitmask; + private byte[] sections; + List blockEntities; + +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java new file mode 100644 index 000000000..a14a1e260 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java @@ -0,0 +1,54 @@ +package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2; + +import io.netty.buffer.ByteBuf; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; + +import java.util.ArrayList; +import java.util.List; + +public class Chunk1_9_1_2Type extends BaseChunkType { + public Chunk1_9_1_2Type() { + super("1.9.1/2 Chunk"); + } + + @Override + public Chunk read(ByteBuf input) throws Exception { + int chunkX = input.readInt(); + int chunkZ = input.readInt(); + + boolean groundUp = input.readBoolean(); + int primaryBitmask = Type.VAR_INT.read(input); + int size = Type.VAR_INT.read(input); + + byte[] sections = new byte[size]; + input.readBytes(sections); + + int blockEntities = Type.VAR_INT.read(input); + List nbtData = new ArrayList<>(); + for (int i = 0; i < blockEntities; i++) { + nbtData.add(Type.NBT.read(input)); + } + return new Chunk1_9_1_2(chunkX, chunkZ, groundUp, primaryBitmask, sections, nbtData); + } + + @Override + public void write(ByteBuf buffer, Chunk input) throws Exception { + if (!(input instanceof Chunk1_9_1_2)) + throw new Exception("Tried to send the wrong chunk type from 1.9.3-4 chunk: " + input.getClass()); + Chunk1_9_1_2 chunk = (Chunk1_9_1_2) input; + + buffer.writeInt(chunk.getX()); + buffer.writeInt(chunk.getZ()); + + buffer.writeBoolean(chunk.isGroundUp()); + Type.VAR_INT.write(buffer, chunk.getBitmask()); + + Type.VAR_INT.write(buffer, chunk.getSections().length); + buffer.writeBytes(chunk.getSections()); + + // no block entities as it's earlier + } +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java index 96801a622..d7ad35bb2 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java @@ -60,6 +60,7 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { } }); + // Chunk packet registerOutgoing(State.PLAY, 0x20, 0x20, new PacketRemapper() { @Override public void registerMap() { diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java new file mode 100644 index 000000000..f994cf18a --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java @@ -0,0 +1,39 @@ +package us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; + +@RequiredArgsConstructor +@Getter +@ToString +public class Chunk1_9to1_8 implements Chunk { + private final int x; + private final int z; + private final boolean groundUp; + private final int primaryBitmask; + private final ChunkSection1_9to1_8[] sections; + private final byte[] biomeData; + private boolean unloadPacket = false; + + /** + * Chunk unload. + * + * @param x coord + * @param z coord + */ + public Chunk1_9to1_8(int x, int z) { + this(x, z, true, 0, new ChunkSection1_9to1_8[16], null); + this.unloadPacket = true; + } + + /** + * Does this chunks have biome data + * + * @return True if the chunks has biome data + */ + public boolean hasBiomeData() { + return biomeData != null && groundUp; + } +} diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java similarity index 91% rename from src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java rename to src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java index 4478da01f..cc7921d04 100644 --- a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java @@ -1,15 +1,16 @@ -package us.myles.ViaVersion.api.minecraft.chunks; +package us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks; import com.google.common.collect.Lists; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import us.myles.ViaVersion.api.minecraft.chunks.NibbleArray; import us.myles.ViaVersion.api.type.Type; import java.util.List; -public class ChunkSection { +public class ChunkSection1_9to1_8 { /** - * Size (dimensions) of blocks in a chunk section. + * Size (dimensions) of blocks in a chunks section. */ public static final int SIZE = 16 * 16 * 16; // width * depth * height /** @@ -25,14 +26,14 @@ public class ChunkSection { private final NibbleArray blockLight; private NibbleArray skyLight; - public ChunkSection() { + public ChunkSection1_9to1_8() { this.blocks = new int[SIZE]; this.blockLight = new NibbleArray(SIZE); palette.add(0); // AIR } /** - * Set a block in the chunk + * Set a block in the chunks * * @param x Block X * @param y Block Y @@ -44,8 +45,13 @@ public class ChunkSection { setBlock(index(x, y, z), type, data); } + public int getBlockId(int x, int y, int z){ + int index = blocks[index(x, y, z)]; + return palette.indexOf(index) >> 4; + } + /** - * Set a block in the chunk based on the index + * Set a block in the chunks based on the index * * @param idx Index * @param type The type of the block @@ -154,7 +160,7 @@ public class ChunkSection { } /** - * Get expected size of this chunk section. + * Get expected size of this chunks section. * * @return Amount of bytes sent by this section * @throws Exception If it failed to calculate bits properly diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index d36bc35ff..a9add7c8d 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -6,7 +6,6 @@ import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.minecraft.Position; -import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; @@ -16,6 +15,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.Chunk1_9to1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.Effect; import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.SoundEffect; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; @@ -115,7 +115,7 @@ public class WorldPackets { @Override public void handle(PacketWrapper wrapper) throws Exception { ClientChunks clientChunks = wrapper.user().get(ClientChunks.class); - Chunk chunk = wrapper.passthrough(new ChunkType(clientChunks)); + Chunk1_9to1_8 chunk = (Chunk1_9to1_8) wrapper.passthrough(new ChunkType(clientChunks)); if (chunk.isUnloadPacket()) wrapper.setId(0x1D); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index f22051818..bc2147b05 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -29,7 +29,7 @@ public class ClientChunks extends StoredObject { obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, ReflectionUtil.nms("World")); worldRef = ReflectionUtil.nms("World"); } catch (Exception e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to initialise chunk reflection", e); + Bukkit.getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); } } @@ -81,7 +81,7 @@ public class ClientChunks extends StoredObject { list.add(chunkPacket); } } catch (Exception e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to transform chunk bulk", e); + Bukkit.getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); } return list; } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java index 871ffd663..693d3cbad 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java @@ -4,9 +4,11 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.bukkit.Bukkit; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; -import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.type.PartialType; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.Chunk1_9to1_8; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.ChunkSection1_9to1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; import java.nio.ByteBuffer; @@ -17,11 +19,11 @@ import java.util.logging.Level; public class ChunkType extends PartialType { /** - * Amount of sections in a chunk. + * Amount of sections in a chunks. */ private static final int SECTION_COUNT = 16; /** - * size of each chunk section (16x16x16). + * size of each chunks section (16x16x16). */ private static final int SECTION_SIZE = 16; /** @@ -37,6 +39,11 @@ public class ChunkType extends PartialType { return ((long) msw << 32) + lsw - -2147483648L; } + @Override + public Class getBaseClass() { + return BaseChunkType.class; + } + @Override public Chunk read(ByteBuf input, ClientChunks param) throws Exception { int chunkX = input.readInt(); @@ -48,7 +55,7 @@ public class ChunkType extends PartialType { // Data to be read BitSet usedSections = new BitSet(16); - ChunkSection[] sections = new ChunkSection[16]; + ChunkSection1_9to1_8[] sections = new ChunkSection1_9to1_8[16]; byte[] biomeData = null; // Calculate section count from bitmask @@ -59,30 +66,30 @@ public class ChunkType extends PartialType { } int sectionCount = usedSections.cardinality(); // the amount of sections set - // If the chunk is from a chunk bulk, it is never an unload packet + // If the chunks is from a chunks bulk, it is never an unload packet // Other wise, if it has no data, it is :) boolean isBulkPacket = param.getBulkChunks().remove(chunkHash); if (sectionCount == 0 && groundUp && !isBulkPacket && param.getLoadedChunks().contains(chunkHash)) { - // This is a chunk unload packet + // This is a chunks unload packet param.getLoadedChunks().remove(chunkHash); - return new Chunk(chunkX, chunkZ); + return new Chunk1_9to1_8(chunkX, chunkZ); } int startIndex = input.readerIndex(); - param.getLoadedChunks().add(chunkHash); // mark chunk as loaded + param.getLoadedChunks().add(chunkHash); // mark chunks as loaded // Read blocks for (int i = 0; i < SECTION_COUNT; i++) { if (!usedSections.get(i)) continue; // Section not set - ChunkSection section = new ChunkSection(); + ChunkSection1_9to1_8 section = new ChunkSection1_9to1_8(); sections[i] = section; // Read block data and convert to short buffer - byte[] blockData = new byte[ChunkSection.SIZE * 2]; + byte[] blockData = new byte[ChunkSection1_9to1_8.SIZE * 2]; input.readBytes(blockData); ShortBuffer blockBuf = ByteBuffer.wrap(blockData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); - for (int j = 0; j < ChunkSection.SIZE; j++) { + for (int j = 0; j < ChunkSection1_9to1_8.SIZE; j++) { int mask = blockBuf.get(); int type = mask >> 4; int data = mask & 0xF; @@ -93,20 +100,20 @@ public class ChunkType extends PartialType { // Read block light for (int i = 0; i < SECTION_COUNT; i++) { if (!usedSections.get(i)) continue; // Section not set, has no light - byte[] blockLightArray = new byte[ChunkSection.LIGHT_LENGTH]; + byte[] blockLightArray = new byte[ChunkSection1_9to1_8.LIGHT_LENGTH]; input.readBytes(blockLightArray); sections[i].setBlockLight(blockLightArray); } // Read sky light int bytesLeft = dataLength - (input.readerIndex() - startIndex); - if (bytesLeft >= ChunkSection.LIGHT_LENGTH) { + if (bytesLeft >= ChunkSection1_9to1_8.LIGHT_LENGTH) { for (int i = 0; i < SECTION_COUNT; i++) { if (!usedSections.get(i)) continue; // Section not set, has no light - byte[] skyLightArray = new byte[ChunkSection.LIGHT_LENGTH]; + byte[] skyLightArray = new byte[ChunkSection1_9to1_8.LIGHT_LENGTH]; input.readBytes(skyLightArray); sections[i].setSkyLight(skyLightArray); - bytesLeft -= ChunkSection.LIGHT_LENGTH; + bytesLeft -= ChunkSection1_9to1_8.LIGHT_LENGTH; } } @@ -119,15 +126,18 @@ public class ChunkType extends PartialType { // Check remaining bytes if (bytesLeft > 0) { - Bukkit.getLogger().log(Level.WARNING, bytesLeft + " Bytes left after reading chunk! (" + groundUp + ")"); + Bukkit.getLogger().log(Level.WARNING, bytesLeft + " Bytes left after reading chunks! (" + groundUp + ")"); } - // Return chunk - return new Chunk(chunkX, chunkZ, groundUp, bitmask, sections, biomeData); + // Return chunks + return new Chunk1_9to1_8(chunkX, chunkZ, groundUp, bitmask, sections, biomeData); } @Override - public void write(ByteBuf output, ClientChunks param, Chunk chunk) throws Exception { + public void write(ByteBuf output, ClientChunks param, Chunk input) throws Exception { + if (!(input instanceof Chunk1_9to1_8)) throw new Exception("Incompatible chunk, " + input.getClass()); + + Chunk1_9to1_8 chunk = (Chunk1_9to1_8) input; // Write primary info output.writeInt(chunk.getX()); output.writeInt(chunk.getZ()); @@ -137,7 +147,7 @@ public class ChunkType extends PartialType { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < SECTION_COUNT; i++) { - ChunkSection section = chunk.getSections()[i]; + ChunkSection1_9to1_8 section = chunk.getSections()[i]; if (section == null) continue; // Section not set section.writeBlocks(buf); section.writeBlockLight(buf); @@ -154,4 +164,6 @@ public class ChunkType extends PartialType { output.writeBytes(chunk.getBiomeData()); } } + + }