1
0
EQ2Emu/internal/packets/compression.go

65 lines
1.0 KiB
Go

package packets
import (
"bytes"
"compress/zlib"
"io"
)
type EQ2Compressor struct {
level int
}
func NewEQ2Compressor() *EQ2Compressor {
return &EQ2Compressor{level: zlib.DefaultCompression}
}
func (c *EQ2Compressor) Compress(data []byte) ([]byte, error) {
if len(data) == 0 {
return data, nil
}
var buf bytes.Buffer
writer, err := zlib.NewWriterLevel(&buf, c.level)
if err != nil {
return nil, err
}
_, err = writer.Write(data)
if err != nil {
writer.Close()
return nil, err
}
err = writer.Close()
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func (c *EQ2Compressor) Decompress(data []byte) ([]byte, error) {
if len(data) == 0 {
return data, nil
}
reader, err := zlib.NewReader(bytes.NewReader(data))
if err != nil {
return nil, err
}
defer reader.Close()
var buf bytes.Buffer
_, err = io.Copy(&buf, reader)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func (c *EQ2Compressor) ShouldCompress(data []byte) bool {
return len(data) > 100 // EQ2 compression threshold
}