IMessage в месте с CompressedStreamTools#writeCompressed

Версия Minecraft
1.12.2
3,005
192
592
У меня есть NBTTagCompound, который должен передаваться между клиентом и сервером.
Есть лимит пакета, 32к.

Вопрос: как заюзать CompressedStreamTools#writeCompressed для NBTTagCompound и PacketBuff?

Данный код был взят из мода AE2, в котором все корректно работает.
Код:
@Override
public void fromBytes(ByteBuf buf) {
    final ByteArrayInputStream bytes = this.getPacketByteArray( buf );
    bytes.skip( buf.readerIndex() );
    try {
        tag = CompressedStreamTools.readCompressed( bytes );
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void toBytes(ByteBuf buf) {
    final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    final DataOutputStream outputStream = new DataOutputStream( bytes );
    try {
        CompressedStreamTools.writeCompressed( tag, outputStream );
    } catch (IOException e) {
        e.printStackTrace();
    }
    buf.writeBytes( bytes.toByteArray() );
    buf.capacity( buf.readableBytes() );
}

public ByteArrayInputStream getPacketByteArray( ByteBuf stream )
{
    return this.getPacketByteArray( stream, 0, stream.readableBytes() );
}

public ByteArrayInputStream getPacketByteArray( ByteBuf stream, int readerIndex, int readableBytes )
{
    final ByteArrayInputStream bytes;
    if( stream.hasArray() )
    {
        bytes = new ByteArrayInputStream( stream.array(), readerIndex, readableBytes );
    }
    else
    {
        byte[] data = new byte[stream.capacity()];
        stream.getBytes( readerIndex, data, 0, readableBytes );
        bytes = new ByteArrayInputStream( data );
    }
    return bytes;
}

Но, у при копипасте получаю ошибку в чтении:
Код:
java.util.zip.ZipException: Not in GZIP format
     at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:165)
     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:79)
     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91)
     at net.minecraft.nbt.CompressedStreamTools.readCompressed(CompressedStreamTools.java:29)

P.S. Это вроде не считается "помощь в декомпилировании" и тому подобное. Хотя бы потому что делаю аддон к AE2.
 
3,005
192
592
Омг, спустя меньше полу часа вопроса на форуме, нашел ответ..

Код:
@Override
public void fromBytes(ByteBuf buf) {
    PacketBuffer pb = new PacketBuffer(buf);
    int i = pb.readerIndex();
    byte b0 = pb.readByte();

    if (b0 == 0) {
        tag = null;
    } else {
        pb.readerIndex(i);

        try {
            tag = CompressedStreamTools.readCompressed(new ByteBufInputStream(pb));
        } catch (IOException ioexception) {
            throw new EncoderException(ioexception);
        }
    }
}

@Override
public void toBytes(ByteBuf buf) {
    PacketBuffer pb = new PacketBuffer(buf);
    if (tag == null) {
        pb.writeByte(0);
    } else {
        try {
            CompressedStreamTools.writeCompressed(tag, new ByteBufOutputStream(pb));
        } catch (IOException ioexception) {
            throw new EncoderException(ioexception);
        }
    }
}
 
1,159
38
544
А что такое вообще CompressedStreamTools? Позволяет сжимать пакеты?
 

timaxa007

Модератор
5,831
409
672
@RareScrap, типа сжимает NBT данные (ключи и значения) для файла и так-же обратно из фала виде кода.
Типа из десятичной в шестеричную систему и на оборот из шестеричный в десятичную.
Вроде как для пакетов используют BufUtils (или как-то так), для NBT, String и ещё что-то.
 
Сверху