-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathminecraft_batch_packet.go
102 lines (79 loc) · 1.84 KB
/
minecraft_batch_packet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package goproxy
import (
"github.com/irmine/binutils"
"github.com/Irmine/GoMine/net/packets"
"bytes"
"compress/zlib"
"io/ioutil"
)
const (
BatchId = 0xFE
)
type MinecraftPacketBatch struct {
*binutils.Stream
rawPackets [][]byte
}
func NewMinecraftPacketBatch() *MinecraftPacketBatch {
var batch = &MinecraftPacketBatch{}
batch.Stream = binutils.NewStream()
return batch
}
func (batch *MinecraftPacketBatch) AddPacket(packet packets.IPacket) {
packet.EncodeHeader()
packet.Encode()
batch.AddRawPacket(packet.GetBuffer())
}
func (batch *MinecraftPacketBatch) AddRawPacket(packet []byte) {
batch.rawPackets = append(batch.rawPackets, packet)
}
func (batch *MinecraftPacketBatch) GetRawPackets() [][]byte {
return batch.rawPackets
}
func (batch *MinecraftPacketBatch) Encode() {
batch.ResetStream()
batch.PutByte(BatchId)
stream := binutils.NewStream()
for _, p := range batch.rawPackets {
stream.PutLengthPrefixedBytes(p)
}
// zlib compression
buffer := bytes.Buffer{}
writer := zlib.NewWriter(&buffer)
writer.Write(stream.Buffer)
writer.Close()
batch.PutBytes(buffer.Bytes())
}
func (batch *MinecraftPacketBatch) Decode() {
defer func() {
if err := recover(); err != nil {
Alert(err)
}
}()
batchId := batch.GetByte()
if batchId != BatchId {
Notice("Packet received is not batch:", batchId)
return
}
data := batch.Buffer[batch.Offset:]
reader := bytes.NewReader(data)
zlibReader, err := zlib.NewReader(reader)
if err != nil {
Alert("Zlib Reader Error:", err)
return
}
if zlibReader == nil {
Alert("Error while reading from zlib")
return
}
zlibReader.Close()
data, err = ioutil.ReadAll(zlibReader)
if err != nil {
Alert("ioutil Error:", err)
return
}
batch.ResetStream()
batch.SetBuffer(data)
for !batch.Feof() {
batch.rawPackets = append(batch.rawPackets, batch.GetLengthPrefixedBytes())
}
}