summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java')
-rw-r--r--src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java60
1 files changed, 45 insertions, 15 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java b/src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java
index 4303c60b..cfd9715f 100644
--- a/src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java
+++ b/src/main/java/org/bukkit/craftbukkit/ChunkCompressionThread.java
@@ -8,6 +8,7 @@ import java.util.zip.Deflater;
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.Packet;
import net.minecraft.server.Packet51MapChunk;
+import net.minecraft.server.Packet56MapChunkBulk;
public final class ChunkCompressionThread implements Runnable {
@@ -46,29 +47,56 @@ public final class ChunkCompressionThread implements Runnable {
private void handleQueuedPacket(QueuedPacket queuedPacket) {
addToPlayerQueueSize(queuedPacket.player, -1);
- // Compress the packet if necessary.
- if (queuedPacket.compress) {
- handleMapChunk(queuedPacket);
+
+ // Compress the packet if necessary
+ if (queuedPacket.compress == 1) {
+ handleMapChunk((Packet51MapChunk) queuedPacket.packet);
+ } else if (queuedPacket.compress == 2) {
+ handleMapChunkBulk((Packet56MapChunkBulk) queuedPacket.packet);
}
+
sendToNetworkQueue(queuedPacket);
}
- private void handleMapChunk(QueuedPacket queuedPacket) {
- Packet51MapChunk packet = (Packet51MapChunk) queuedPacket.packet;
+ private void handleMapChunkBulk(Packet56MapChunkBulk packet) {
+ if (packet.buffer != null) {
+ return;
+ }
- // If 'packet.g' is set then this packet has already been compressed.
+ int dataSize = packet.buildBuffer.length;
+ if (deflateBuffer.length < dataSize + 100) {
+ deflateBuffer = new byte[dataSize + 100];
+ }
+
+ deflater.reset();
+ deflater.setLevel(dataSize < REDUCED_DEFLATE_THRESHOLD ? DEFLATE_LEVEL_PARTS : DEFLATE_LEVEL_CHUNKS);
+ deflater.setInput(packet.buildBuffer);
+ deflater.finish();
+ int size = deflater.deflate(deflateBuffer);
+ if (size == 0) {
+ size = deflater.deflate(deflateBuffer);
+ }
+
+ // copy compressed data to packet
+ packet.buffer = new byte[size];
+ packet.size = size;
+ System.arraycopy(deflateBuffer, 0, packet.buffer, 0, size);
+ }
+
+ private void handleMapChunk(Packet51MapChunk packet) {
+ // If 'packet.buffer' is set then this packet has already been compressed.
if (packet.buffer != null) {
return;
}
- int dataSize = packet.rawData.length;
+ int dataSize = packet.inflatedBuffer.length;
if (deflateBuffer.length < dataSize + 100) {
deflateBuffer = new byte[dataSize + 100];
}
deflater.reset();
deflater.setLevel(dataSize < REDUCED_DEFLATE_THRESHOLD ? DEFLATE_LEVEL_PARTS : DEFLATE_LEVEL_CHUNKS);
- deflater.setInput(packet.rawData);
+ deflater.setInput(packet.inflatedBuffer);
deflater.finish();
int size = deflater.deflate(deflateBuffer);
if (size == 0) {
@@ -86,13 +114,15 @@ public final class ChunkCompressionThread implements Runnable {
}
public static void sendPacket(EntityPlayer player, Packet packet) {
+ int compressType = 0;
+
if (packet instanceof Packet51MapChunk) {
- // MapChunk Packets need compressing.
- instance.addQueuedPacket(new QueuedPacket(player, packet, true));
- } else {
- // Other Packets don't.
- instance.addQueuedPacket(new QueuedPacket(player, packet, false));
+ compressType = 1;
+ } else if (packet instanceof Packet56MapChunkBulk) {
+ compressType = 2;
}
+
+ instance.addQueuedPacket(new QueuedPacket(player, packet, compressType));
}
private void addToPlayerQueueSize(EntityPlayer player, int amount) {
@@ -129,9 +159,9 @@ public final class ChunkCompressionThread implements Runnable {
private static class QueuedPacket {
final EntityPlayer player;
final Packet packet;
- final boolean compress;
+ final int compress;
- QueuedPacket(EntityPlayer player, Packet packet, boolean compress) {
+ QueuedPacket(EntityPlayer player, Packet packet, int compress) {
this.player = player;
this.packet = packet;
this.compress = compress;