diff --git a/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java b/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java new file mode 100644 index 000000000..0426e79aa --- /dev/null +++ b/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java @@ -0,0 +1,62 @@ +package com.destroystokyo.paper.antixray; + +import io.netty.buffer.ByteBuf; + +public class DataBitsReader { + + private ByteBuf dataBits; // Akarin + private int bitsPerValue; + private int mask; + private int longInDataBitsIndex; + private int bitInLongIndex; + private long current; + + public void setDataBits(ByteBuf dataBits) { // Akarin + this.dataBits = dataBits; + } + + public void setBitsPerValue(int bitsPerValue) { + this.bitsPerValue = bitsPerValue; + mask = (1 << bitsPerValue) - 1; + } + + public void setIndex(int index) { + this.longInDataBitsIndex = index; + bitInLongIndex = 0; + init(); + } + + private void init() { + if (dataBits.capacity() > longInDataBitsIndex + 7) { // Akarin + // Akarin start + dataBits.getLong(longInDataBitsIndex); + /* + current = ((((long) dataBits[longInDataBitsIndex]) << 56) + | (((long) dataBits[longInDataBitsIndex + 1] & 0xff) << 48) + | (((long) dataBits[longInDataBitsIndex + 2] & 0xff) << 40) + | (((long) dataBits[longInDataBitsIndex + 3] & 0xff) << 32) + | (((long) dataBits[longInDataBitsIndex + 4] & 0xff) << 24) + | (((long) dataBits[longInDataBitsIndex + 5] & 0xff) << 16) + | (((long) dataBits[longInDataBitsIndex + 6] & 0xff) << 8) + | (((long) dataBits[longInDataBitsIndex + 7] & 0xff))); + */ // Akarin end + } + } + + public int read() { + int value = (int) (current >>> bitInLongIndex) & mask; + bitInLongIndex += bitsPerValue; + + if (bitInLongIndex > 63) { + bitInLongIndex -= 64; + longInDataBitsIndex += 8; + init(); + + if (bitInLongIndex > 0) { + value |= current << bitsPerValue - bitInLongIndex & mask; + } + } + + return value; + } +} diff --git a/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java b/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java new file mode 100644 index 000000000..724850938 --- /dev/null +++ b/sources/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java @@ -0,0 +1,94 @@ +package com.destroystokyo.paper.antixray; + +import io.netty.buffer.ByteBuf; + +public class DataBitsWriter { + + private ByteBuf dataBits; // Akarin + private int bitsPerValue; + private long mask; + private int longInDataBitsIndex; + private int bitInLongIndex; + private long current; + private boolean dirty; + + public void setDataBits(ByteBuf dataBits) { // Akarin + this.dataBits = dataBits; + } + + public void setBitsPerValue(int bitsPerValue) { + this.bitsPerValue = bitsPerValue; + mask = (1 << bitsPerValue) - 1; + } + + public void setIndex(int index) { + this.longInDataBitsIndex = index; + bitInLongIndex = 0; + init(); + } + + private void init() { + if (dataBits.capacity() > longInDataBitsIndex + 7) { // Akarin + // Akarin start + current = dataBits.getLong(longInDataBitsIndex); + /* + current = ((((long) dataBits[longInDataBitsIndex]) << 56) + | (((long) dataBits[longInDataBitsIndex + 1] & 0xff) << 48) + | (((long) dataBits[longInDataBitsIndex + 2] & 0xff) << 40) + | (((long) dataBits[longInDataBitsIndex + 3] & 0xff) << 32) + | (((long) dataBits[longInDataBitsIndex + 4] & 0xff) << 24) + | (((long) dataBits[longInDataBitsIndex + 5] & 0xff) << 16) + | (((long) dataBits[longInDataBitsIndex + 6] & 0xff) << 8) + | (((long) dataBits[longInDataBitsIndex + 7] & 0xff))); + */ // Akarin end + } + + dirty = false; + } + + public void finish() { + if (dirty && dataBits.capacity() > longInDataBitsIndex + 7) { // Akarin + // Akarin start + dataBits.setLong(longInDataBitsIndex, current); + /* + dataBits[longInDataBitsIndex] = (byte) (current >> 56 & 0xff); + dataBits[longInDataBitsIndex + 1] = (byte) (current >> 48 & 0xff); + dataBits[longInDataBitsIndex + 2] = (byte) (current >> 40 & 0xff); + dataBits[longInDataBitsIndex + 3] = (byte) (current >> 32 & 0xff); + dataBits[longInDataBitsIndex + 4] = (byte) (current >> 24 & 0xff); + dataBits[longInDataBitsIndex + 5] = (byte) (current >> 16 & 0xff); + dataBits[longInDataBitsIndex + 6] = (byte) (current >> 8 & 0xff); + dataBits[longInDataBitsIndex + 7] = (byte) (current & 0xff); + */ // Akarin end + } + } + + public void write(int value) { + current = current & ~(mask << bitInLongIndex) | (value & mask) << bitInLongIndex; + dirty = true; + bitInLongIndex += bitsPerValue; + + if (bitInLongIndex > 63) { + finish(); + bitInLongIndex -= 64; + longInDataBitsIndex += 8; + init(); + + if (bitInLongIndex > 0) { + current = current & ~(mask >>> bitsPerValue - bitInLongIndex) | (value & mask) >>> bitsPerValue - bitInLongIndex; + dirty = true; + } + } + } + + public void skip() { + bitInLongIndex += bitsPerValue; + + if (bitInLongIndex > 63) { + finish(); + bitInLongIndex -= 64; + longInDataBitsIndex += 8; + init(); + } + } +} diff --git a/sources/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java b/sources/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java index d8519224a..6b295a5cb 100644 --- a/sources/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java +++ b/sources/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java @@ -15,7 +15,7 @@ public class PacketPlayOutMapChunkInfo { private final PacketPlayOutMapChunk packetPlayOutMapChunk; private final Chunk chunk; private final int chunkSectionSelector; - private ByteBuf data; // Akarin - byte[] -> ByteBuf + private ByteBuf data; // Akarin private final int[] bitsPerValue = new int[16]; private final DataPalette[] dataPalettes = new DataPalette[16]; private final int[] dataBitsIndexes = new int[16]; @@ -39,11 +39,11 @@ public class PacketPlayOutMapChunkInfo { return chunkSectionSelector; } - public byte[] getData() { - return data.array(); // Akarin + public ByteBuf getData() { // Akarin + return data; } - public void setData(ByteBuf data) { // Akarin - byte[] -> ByteBuf + public void setData(ByteBuf data) { // Akarin this.data = data; } diff --git a/sources/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/sources/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java index 92cfb897c..7a072c1d1 100644 --- a/sources/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java +++ b/sources/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java @@ -105,7 +105,7 @@ public class PacketPlayOutMapChunk implements Packet { packetdataserializer.writeInt(this.b); packetdataserializer.writeBoolean(this.f); packetdataserializer.d(this.c); - packetdataserializer.d(this.d.array().length); // Akarin + packetdataserializer.d(this.d.capacity()); // Akarin packetdataserializer.writeBytes(this.d.array()); // Akarin packetdataserializer.d(this.e.size()); Iterator iterator = this.e.iterator(); @@ -122,9 +122,9 @@ public class PacketPlayOutMapChunk implements Packet { packetlistenerplayout.a(this); } - private ByteBuf allocateBuffer(int expectedCapacity) { return g(expectedCapacity); } // Akarin - OBFHELPER - private ByteBuf g(int expectedCapacity) { // Akarin - added argument - ByteBuf bytebuf = Unpooled.buffer(expectedCapacity); // Akarin + private ByteBuf g() { return allocateBuffer(-1); } // Akarin + private ByteBuf allocateBuffer(int expectedCapacity) { // Akarin - added argument + ByteBuf bytebuf = expectedCapacity == -1 ? Unpooled.buffer() : Unpooled.buffer(expectedCapacity); // Akarin bytebuf.writerIndex(0); return bytebuf;