Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save minecrafter/e697efe92bc19098672c63ba8f204e37 to your computer and use it in GitHub Desktop.
Save minecrafter/e697efe92bc19098672c63ba8f204e37 to your computer and use it in GitHub Desktop.
public static McpeBatch CreateBatchPacket(byte[] input, CompressionLevel compressionLevel, bool writeLen = false)
{
return CreateBatchPacket(input, 0, input.Length, compressionLevel, writeLen);
}
public static McpeBatch CreateBatchPacket(byte[] input, int offset, int length, CompressionLevel compressionLevel, bool writeLen = false)
{
var packet = McpeBatch.CreateObject();
using (MemoryStream stream = MiNetServer.MemoryStreamManager.GetStream())
{
stream.WriteByte(0x78);
switch (compressionLevel)
{
case CompressionLevel.Optimal:
stream.WriteByte(0xda);
break;
case CompressionLevel.Fastest:
stream.WriteByte(0x9c);
break;
case CompressionLevel.NoCompression:
stream.WriteByte(0x01);
break;
}
int checksum;
using (var compressStream = new ZLibStream(stream, compressionLevel, true))
{
byte[] lenBytes = BitConverter.GetBytes(input.Length);
Array.Reverse(lenBytes);
if (writeLen) compressStream.Write(lenBytes, 0, lenBytes.Length); // ??
compressStream.Write(input, 0, input.Length);
checksum = compressStream.Checksum;
}
byte[] checksumBytes = BitConverter.GetBytes(checksum);
if (BitConverter.IsLittleEndian)
{
// Adler32 checksum is big-endian
Array.Reverse(checksumBytes);
}
stream.Write(checksumBytes, 0, checksumBytes.Length);
packet.payload = stream.GetBuffer();
packet.payloadSize = (int) stream.Length;
packet.Encode();
}
return packet;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment