diff options
Diffstat (limited to 'src/main/java/net/minecraft/server/Packet51MapChunk.java')
-rw-r--r-- | src/main/java/net/minecraft/server/Packet51MapChunk.java | 221 |
1 files changed, 109 insertions, 112 deletions
diff --git a/src/main/java/net/minecraft/server/Packet51MapChunk.java b/src/main/java/net/minecraft/server/Packet51MapChunk.java index a054615e..b3bb3a8c 100644 --- a/src/main/java/net/minecraft/server/Packet51MapChunk.java +++ b/src/main/java/net/minecraft/server/Packet51MapChunk.java @@ -4,7 +4,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.zip.DataFormatException; -// import java.util.zip.Deflater; // CraftBukkit +import java.util.zip.Deflater; import java.util.zip.Inflater; public class Packet51MapChunk extends Packet { @@ -13,11 +13,13 @@ public class Packet51MapChunk extends Packet { public int b; public int c; public int d; + // CraftBukkit start - private -> public public byte[] buffer; - public boolean f; - public int size; // CraftBukkit - private -> public - private int h; - public byte[] rawData = new byte[0]; // CraftBukkit + public byte[] inflatedBuffer; + public boolean e; + public int size; + // CraftBukkit end + private static byte[] buildBuffer = new byte[196864]; public Packet51MapChunk() { this.lowPriority = true; @@ -27,124 +29,40 @@ public class Packet51MapChunk extends Packet { this.lowPriority = true; this.a = chunk.x; this.b = chunk.z; - this.f = flag; - if (flag) { - i = '\uffff'; - chunk.seenByPlayer = true; - } + this.e = flag; + ChunkMap chunkmap = a(chunk, flag, i); + // Deflater deflater = new Deflater(-1); // CraftBukkit - ChunkSection[] achunksection = chunk.h(); - int j = 0; - int k = 0; - - int l; - - for (l = 0; l < achunksection.length; ++l) { - if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { - this.c |= 1 << l; - ++j; - if (achunksection[l].h() != null) { - this.d |= 1 << l; - ++k; - } - } - } - - l = 2048 * (5 * j + k); - if (flag) { - l += 256; - } - - if (rawData.length < l) { - rawData = new byte[l]; - } - - byte[] abyte = rawData; - int i1 = 0; - - int j1; - - for (j1 = 0; j1 < achunksection.length; ++j1) { - if (achunksection[j1] != null && (!flag || !achunksection[j1].a()) && (i & 1 << j1) != 0) { - byte[] abyte1 = achunksection[j1].g(); - - System.arraycopy(abyte1, 0, abyte, i1, abyte1.length); - i1 += abyte1.length; - } - } - - NibbleArray nibblearray; - - for (j1 = 0; j1 < achunksection.length; ++j1) { - if (achunksection[j1] != null && (!flag || !achunksection[j1].a()) && (i & 1 << j1) != 0) { - nibblearray = achunksection[j1].i(); - System.arraycopy(nibblearray.a, 0, abyte, i1, nibblearray.a.length); - i1 += nibblearray.a.length; - } - } - - for (j1 = 0; j1 < achunksection.length; ++j1) { - if (achunksection[j1] != null && (!flag || !achunksection[j1].a()) && (i & 1 << j1) != 0) { - nibblearray = achunksection[j1].j(); - System.arraycopy(nibblearray.a, 0, abyte, i1, nibblearray.a.length); - i1 += nibblearray.a.length; - } - } - - for (j1 = 0; j1 < achunksection.length; ++j1) { - if (achunksection[j1] != null && (!flag || !achunksection[j1].a()) && (i & 1 << j1) != 0) { - nibblearray = achunksection[j1].k(); - System.arraycopy(nibblearray.a, 0, abyte, i1, nibblearray.a.length); - i1 += nibblearray.a.length; - } - } - - if (k > 0) { - for (j1 = 0; j1 < achunksection.length; ++j1) { - if (achunksection[j1] != null && (!flag || !achunksection[j1].a()) && achunksection[j1].h() != null && (i & 1 << j1) != 0) { - nibblearray = achunksection[j1].h(); - System.arraycopy(nibblearray.a, 0, abyte, i1, nibblearray.a.length); - i1 += nibblearray.a.length; - } - } - } - - if (flag) { - byte[] abyte2 = chunk.l(); - - System.arraycopy(abyte2, 0, abyte, i1, abyte2.length); - i1 += abyte2.length; - } - - /* CraftBukkit start - Moved compression into its own method. - byte[] abyte = data; // CraftBukkit - uses data from above constructor - Deflater deflater = new Deflater(-1); + this.d = chunkmap.c; + this.c = chunkmap.b; + /* CraftBukkit start - compression moved to new thread try { - deflater.setInput(abyte, 0, i1); + this.inflatedBuffer = chunkmap.a; + deflater.setInput(chunkmap.a, 0, chunkmap.a.length); deflater.finish(); - this.buffer = new byte[i1]; + this.buffer = new byte[chunkmap.a.length]; this.size = deflater.deflate(this.buffer); } finally { deflater.end(); - } */ - this.rawData = abyte; + } + */ + this.inflatedBuffer = chunkmap.a; // CraftBukkit end } - public void a(DataInputStream datainputstream) throws IOException { // CraftBukkit - throws IOEXception + public void a(DataInputStream datainputstream) throws IOException { this.a = datainputstream.readInt(); this.b = datainputstream.readInt(); - this.f = datainputstream.readBoolean(); + this.e = datainputstream.readBoolean(); this.c = datainputstream.readShort(); this.d = datainputstream.readShort(); this.size = datainputstream.readInt(); - this.h = datainputstream.readInt(); - if (rawData.length < this.size) { - rawData = new byte[this.size]; + if (buildBuffer.length < this.size) { + buildBuffer = new byte[this.size]; } - datainputstream.readFully(rawData, 0, this.size); + datainputstream.readFully(buildBuffer, 0, this.size); int i = 0; int j; @@ -154,17 +72,17 @@ public class Packet51MapChunk extends Packet { } j = 12288 * i; - if (this.f) { + if (this.e) { j += 256; } - this.buffer = new byte[j]; + this.inflatedBuffer = new byte[j]; Inflater inflater = new Inflater(); - inflater.setInput(rawData, 0, this.size); + inflater.setInput(buildBuffer, 0, this.size); try { - inflater.inflate(this.buffer); + inflater.inflate(this.inflatedBuffer); } catch (DataFormatException dataformatexception) { throw new IOException("Bad compressed data format"); } finally { @@ -175,11 +93,10 @@ public class Packet51MapChunk extends Packet { public void a(DataOutputStream dataoutputstream) throws IOException { // CraftBukkit - throws IOException dataoutputstream.writeInt(this.a); dataoutputstream.writeInt(this.b); - dataoutputstream.writeBoolean(this.f); + dataoutputstream.writeBoolean(this.e); dataoutputstream.writeShort((short) (this.c & '\uffff')); dataoutputstream.writeShort((short) (this.d & '\uffff')); dataoutputstream.writeInt(this.size); - dataoutputstream.writeInt(this.h); dataoutputstream.write(this.buffer, 0, this.size); } @@ -190,4 +107,84 @@ public class Packet51MapChunk extends Packet { public int a() { return 17 + this.size; } + + public static ChunkMap a(Chunk chunk, boolean flag, int i) { + int j = 0; + ChunkSection[] achunksection = chunk.i(); + int k = 0; + ChunkMap chunkmap = new ChunkMap(); + byte[] abyte = buildBuffer; + + if (flag) { + chunk.seenByPlayer = true; + } + + int l; + + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + chunkmap.b |= 1 << l; + if (achunksection[l].i() != null) { + chunkmap.c |= 1 << l; + ++k; + } + } + } + + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + byte[] abyte1 = achunksection[l].g(); + + System.arraycopy(abyte1, 0, abyte, j, abyte1.length); + j += abyte1.length; + } + } + + NibbleArray nibblearray; + + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + nibblearray = achunksection[l].j(); + System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); + j += nibblearray.a.length; + } + } + + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + nibblearray = achunksection[l].k(); + System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); + j += nibblearray.a.length; + } + } + + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + nibblearray = achunksection[l].l(); + System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); + j += nibblearray.a.length; + } + } + + if (k > 0) { + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && achunksection[l].i() != null && (i & 1 << l) != 0) { + nibblearray = achunksection[l].i(); + System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); + j += nibblearray.a.length; + } + } + } + + if (flag) { + byte[] abyte2 = chunk.m(); + + System.arraycopy(abyte2, 0, abyte, j, abyte2.length); + j += abyte2.length; + } + + chunkmap.a = new byte[j]; + System.arraycopy(abyte, 0, chunkmap.a, 0, j); + return chunkmap; + } } |