aboutsummaryrefslogtreecommitdiff
path: root/packets
diff options
context:
space:
mode:
Diffstat (limited to 'packets')
-rw-r--r--packets/messages/message.go44
-rw-r--r--packets/messages/types/SvcClassInfo.go11
-rw-r--r--packets/messages/types/SvcCmdKeyValues.go14
-rw-r--r--packets/messages/types/SvcCreateStringTable.go32
-rw-r--r--packets/messages/types/SvcCrosshairAngle.go17
-rw-r--r--packets/messages/types/SvcEntityMessage.go20
-rw-r--r--packets/messages/types/SvcFixAngle.go21
-rw-r--r--packets/messages/types/SvcGameEventList.go17
-rw-r--r--packets/messages/types/SvcGetCvarValue.go15
-rw-r--r--packets/messages/types/SvcMenu.go17
-rw-r--r--packets/messages/types/SvcPacketEntities.go39
-rw-r--r--packets/messages/types/SvcPaintmapData.go14
-rw-r--r--packets/messages/types/SvcPrefetch.go13
-rw-r--r--packets/messages/types/SvcPrint.go13
-rw-r--r--packets/messages/types/SvcSetView.go13
-rw-r--r--packets/messages/types/SvcSounds.go31
-rw-r--r--packets/messages/types/SvcSplitScreen.go17
-rw-r--r--packets/messages/types/SvcTempEntities.go17
-rw-r--r--packets/messages/types/SvcUpdateStringTable.go21
-rw-r--r--packets/messages/types/SvcUserMessage.go17
-rw-r--r--packets/messages/types/SvcVoiceData.go19
-rw-r--r--packets/messages/types/SvcVoiceInit.go20
-rw-r--r--packets/packet.go2
23 files changed, 440 insertions, 4 deletions
diff --git a/packets/messages/message.go b/packets/messages/message.go
index c508bfa..05690cc 100644
--- a/packets/messages/message.go
+++ b/packets/messages/message.go
@@ -40,6 +40,50 @@ func ParseMessage(data []byte) []Message {
40 messages = append(messages, Message{Data: types.ParseSvcClassInfo(reader)}) 40 messages = append(messages, Message{Data: types.ParseSvcClassInfo(reader)})
41 case 0x11: 41 case 0x11:
42 messages = append(messages, Message{Data: types.ParseSvcSetPause(reader)}) 42 messages = append(messages, Message{Data: types.ParseSvcSetPause(reader)})
43 case 0x12:
44 messages = append(messages, Message{Data: types.ParseSvcCreateStringTable(reader)})
45 case 0x13:
46 messages = append(messages, Message{Data: types.ParseSvcUpdateStringTable(reader)})
47 case 0x14:
48 messages = append(messages, Message{Data: types.ParseSvcVoiceInit(reader)})
49 case 0x15:
50 messages = append(messages, Message{Data: types.ParseSvcVoiceData(reader)})
51 case 0x16:
52 messages = append(messages, Message{Data: types.ParseSvcPrint(reader)})
53 case 0x17:
54 messages = append(messages, Message{Data: types.ParseSvcSounds(reader)})
55 case 0x18:
56 messages = append(messages, Message{Data: types.ParseSvcSetView(reader)})
57 case 0x19:
58 messages = append(messages, Message{Data: types.ParseSvcFixAngle(reader)})
59 case 0x20:
60 messages = append(messages, Message{Data: types.ParseSvcCrosshairAngle(reader)})
61 case 0x21:
62 // TODO: SvcBspDecal
63 case 0x22:
64 messages = append(messages, Message{Data: types.ParseSvcSplitScreen(reader)})
65 case 0x23:
66 messages = append(messages, Message{Data: types.ParseSvcUserMessage(reader)})
67 case 0x24:
68 messages = append(messages, Message{Data: types.ParseSvcEntityMessage(reader)})
69 case 0x25:
70 // TODO: SvcGameEvent
71 case 0x26:
72 messages = append(messages, Message{Data: types.ParseSvcPacketEntities(reader)})
73 case 0x27:
74 messages = append(messages, Message{Data: types.ParseSvcTempEntities(reader)})
75 case 0x28:
76 messages = append(messages, Message{Data: types.ParseSvcPrefetch(reader)})
77 case 0x29:
78 messages = append(messages, Message{Data: types.ParseSvcMenu(reader)})
79 case 0x30:
80 messages = append(messages, Message{Data: types.ParseSvcGameEventList(reader)})
81 case 0x31:
82 messages = append(messages, Message{Data: types.ParseSvcGetCvarValue(reader)})
83 case 0x32:
84 messages = append(messages, Message{Data: types.ParseSvcCmdKeyValues(reader)})
85 case 0x33:
86 messages = append(messages, Message{Data: types.ParseSvcPaintmapData(reader)})
43 } 87 }
44 } 88 }
45 return messages 89 return messages
diff --git a/packets/messages/types/SvcClassInfo.go b/packets/messages/types/SvcClassInfo.go
index fb9dbd8..d41723d 100644
--- a/packets/messages/types/SvcClassInfo.go
+++ b/packets/messages/types/SvcClassInfo.go
@@ -1,8 +1,6 @@
1package types 1package types
2 2
3import ( 3import (
4 "math"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7) 5)
8 6
@@ -24,7 +22,7 @@ func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo {
24 if createonclient { 22 if createonclient {
25 serverclasses := make([]ServerClass, length) 23 serverclasses := make([]ServerClass, length)
26 for i := 0; i < int(length); i++ { 24 for i := 0; i < int(length); i++ {
27 id, err := reader.ReadBits(int(math.Log2(float64(length))) + 1) 25 id, err := reader.ReadBits(HighestBitIndex(uint(length)) + 1)
28 if err != nil { 26 if err != nil {
29 panic(err) 27 panic(err)
30 } 28 }
@@ -40,3 +38,10 @@ func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo {
40 ServerClasses: serverclasses, 38 ServerClasses: serverclasses,
41 } 39 }
42} 40}
41
42func HighestBitIndex(i uint) int {
43 var j int
44 for j = 31; j >= 0 && (i&(1<<j)) == 0; j-- {
45 }
46 return j
47}
diff --git a/packets/messages/types/SvcCmdKeyValues.go b/packets/messages/types/SvcCmdKeyValues.go
new file mode 100644
index 0000000..06504a2
--- /dev/null
+++ b/packets/messages/types/SvcCmdKeyValues.go
@@ -0,0 +1,14 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcCmdKeyValues struct {
6 Data []byte
7}
8
9func ParseSvcCmdKeyValues(reader *bitreader.ReaderType) SvcCmdKeyValues {
10 length := reader.TryReadInt32()
11 return SvcCmdKeyValues{
12 Data: reader.TryReadBytesToSlice(int(length)),
13 }
14}
diff --git a/packets/messages/types/SvcCreateStringTable.go b/packets/messages/types/SvcCreateStringTable.go
new file mode 100644
index 0000000..6e97ea7
--- /dev/null
+++ b/packets/messages/types/SvcCreateStringTable.go
@@ -0,0 +1,32 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcCreateStringTable struct {
6 Name string
7 MaxEntries uint16
8 NumEntries uint8
9 UserDataFixedSize bool
10 UserDataSize uint16
11 UserDataSizeBits uint8
12 Flags uint8
13 StringData int
14}
15
16func ParseSvcCreateStringTable(reader *bitreader.ReaderType) SvcCreateStringTable {
17 svccreatestringtable := SvcCreateStringTable{
18 Name: reader.TryReadString(),
19 MaxEntries: reader.TryReadInt16(),
20 }
21 svccreatestringtable.NumEntries = uint8(reader.TryReadBits(HighestBitIndex(uint(svccreatestringtable.MaxEntries)) + 1))
22 length := reader.TryReadBits(20)
23 svccreatestringtable.UserDataFixedSize = reader.TryReadBool()
24 if svccreatestringtable.UserDataFixedSize {
25 svccreatestringtable.UserDataSize = uint16(reader.TryReadBits(12))
26 svccreatestringtable.UserDataSizeBits = uint8(reader.TryReadBits(4))
27 }
28 svccreatestringtable.Flags = uint8(reader.TryReadBits(2))
29 svccreatestringtable.StringData = int(reader.TryReadBits(int(length / 8)))
30 return svccreatestringtable
31
32}
diff --git a/packets/messages/types/SvcCrosshairAngle.go b/packets/messages/types/SvcCrosshairAngle.go
new file mode 100644
index 0000000..6584426
--- /dev/null
+++ b/packets/messages/types/SvcCrosshairAngle.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcCrosshairAngle struct {
6 Angle []int16
7}
8
9func ParseSvcCrosshairAngle(reader *bitreader.ReaderType) SvcCrosshairAngle {
10 return SvcCrosshairAngle{
11 Angle: []int16{
12 int16(reader.TryReadInt16()),
13 int16(reader.TryReadInt16()),
14 int16(reader.TryReadInt16()),
15 },
16 }
17}
diff --git a/packets/messages/types/SvcEntityMessage.go b/packets/messages/types/SvcEntityMessage.go
new file mode 100644
index 0000000..f4fb518
--- /dev/null
+++ b/packets/messages/types/SvcEntityMessage.go
@@ -0,0 +1,20 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcEntityMessage struct {
6 EntityIndex int16
7 ClassId int16
8 Data []byte
9}
10
11func ParseSvcEntityMessage(reader *bitreader.ReaderType) SvcEntityMessage {
12 entityindex := reader.TryReadBits(11)
13 classid := reader.TryReadBits(9)
14 length := reader.TryReadBits(11)
15 return SvcEntityMessage{
16 EntityIndex: int16(entityindex),
17 ClassId: int16(classid),
18 Data: reader.TryReadBytesToSlice(int(length / 8)),
19 }
20}
diff --git a/packets/messages/types/SvcFixAngle.go b/packets/messages/types/SvcFixAngle.go
new file mode 100644
index 0000000..d98dedd
--- /dev/null
+++ b/packets/messages/types/SvcFixAngle.go
@@ -0,0 +1,21 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcFixAngle struct {
6 Relative bool
7 Angle []int16
8}
9
10func ParseSvcFixAngle(reader *bitreader.ReaderType) SvcFixAngle {
11 relative := reader.TryReadBool()
12 angles := []int16{
13 int16(reader.TryReadInt16()),
14 int16(reader.TryReadInt16()),
15 int16(reader.TryReadInt16()),
16 }
17 return SvcFixAngle{
18 Relative: relative,
19 Angle: angles,
20 }
21}
diff --git a/packets/messages/types/SvcGameEventList.go b/packets/messages/types/SvcGameEventList.go
new file mode 100644
index 0000000..bdba161
--- /dev/null
+++ b/packets/messages/types/SvcGameEventList.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcGameEventList struct {
6 Events int16
7 Data []byte
8}
9
10func ParseSvcGameEventList(reader *bitreader.ReaderType) SvcGameEventList {
11 events := reader.TryReadBits(9)
12 length := reader.TryReadBits(20)
13 return SvcGameEventList{
14 Events: int16(events),
15 Data: reader.TryReadBytesToSlice(int(length)),
16 }
17}
diff --git a/packets/messages/types/SvcGetCvarValue.go b/packets/messages/types/SvcGetCvarValue.go
new file mode 100644
index 0000000..2925da5
--- /dev/null
+++ b/packets/messages/types/SvcGetCvarValue.go
@@ -0,0 +1,15 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcGetCvarValue struct {
6 Cookie string
7 CvarName string
8}
9
10func ParseSvcGetCvarValue(reader *bitreader.ReaderType) SvcGetCvarValue {
11 return SvcGetCvarValue{
12 Cookie: reader.TryReadStringLen(32),
13 CvarName: reader.TryReadString(),
14 }
15}
diff --git a/packets/messages/types/SvcMenu.go b/packets/messages/types/SvcMenu.go
new file mode 100644
index 0000000..312115a
--- /dev/null
+++ b/packets/messages/types/SvcMenu.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcMenu struct {
6 MenuType int16
7 Data []byte
8}
9
10func ParseSvcMenu(reader *bitreader.ReaderType) SvcMenu {
11 menutype := reader.TryReadInt16()
12 length := reader.TryReadInt32()
13 return SvcMenu{
14 MenuType: int16(menutype),
15 Data: reader.TryReadBytesToSlice(int(length / 8)),
16 }
17}
diff --git a/packets/messages/types/SvcPacketEntities.go b/packets/messages/types/SvcPacketEntities.go
new file mode 100644
index 0000000..bc4c41a
--- /dev/null
+++ b/packets/messages/types/SvcPacketEntities.go
@@ -0,0 +1,39 @@
1package types
2
3import (
4 "fmt"
5
6 "github.com/pektezol/bitreader"
7)
8
9type SvcPacketEntities struct {
10 MaxEntries uint16
11 IsDelta bool
12 DeltaFrom int32
13 BaseLine bool
14 UpdatedEntries uint16
15 UpdateBaseline bool
16 Data []byte
17}
18
19func ParseSvcPacketEntities(reader *bitreader.ReaderType) SvcPacketEntities {
20 maxentries := reader.TryReadBits(11)
21 isdelta := reader.TryReadBool()
22 var deltafrom int32
23 if isdelta {
24 deltafrom = int32(reader.TryReadInt32())
25 }
26 baseline := reader.TryReadBool()
27 updatedentries := reader.TryReadBits(11)
28 length := reader.TryReadBits(20)
29 fmt.Println(length)
30 return SvcPacketEntities{
31 MaxEntries: uint16(maxentries),
32 IsDelta: isdelta,
33 DeltaFrom: deltafrom,
34 BaseLine: baseline,
35 UpdatedEntries: uint16(updatedentries),
36 UpdateBaseline: reader.TryReadBool(),
37 Data: reader.TryReadBytesToSlice(int(length / 8)),
38 }
39}
diff --git a/packets/messages/types/SvcPaintmapData.go b/packets/messages/types/SvcPaintmapData.go
new file mode 100644
index 0000000..f3bd1a3
--- /dev/null
+++ b/packets/messages/types/SvcPaintmapData.go
@@ -0,0 +1,14 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcPaintmapData struct {
6 Data []byte
7}
8
9func ParseSvcPaintmapData(reader *bitreader.ReaderType) SvcPaintmapData {
10 length := reader.TryReadInt32()
11 return SvcPaintmapData{
12 Data: reader.TryReadBytesToSlice(int(length / 8)),
13 }
14}
diff --git a/packets/messages/types/SvcPrefetch.go b/packets/messages/types/SvcPrefetch.go
new file mode 100644
index 0000000..b277252
--- /dev/null
+++ b/packets/messages/types/SvcPrefetch.go
@@ -0,0 +1,13 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcPrefetch struct {
6 SoundIndex int16
7}
8
9func ParseSvcPrefetch(reader *bitreader.ReaderType) SvcPrefetch {
10 return SvcPrefetch{
11 SoundIndex: int16(reader.TryReadBits(13)),
12 }
13}
diff --git a/packets/messages/types/SvcPrint.go b/packets/messages/types/SvcPrint.go
new file mode 100644
index 0000000..c6d91ac
--- /dev/null
+++ b/packets/messages/types/SvcPrint.go
@@ -0,0 +1,13 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcPrint struct {
6 Message string
7}
8
9func ParseSvcPrint(reader *bitreader.ReaderType) SvcPrint {
10 return SvcPrint{
11 Message: reader.TryReadString(),
12 }
13}
diff --git a/packets/messages/types/SvcSetView.go b/packets/messages/types/SvcSetView.go
new file mode 100644
index 0000000..5507eae
--- /dev/null
+++ b/packets/messages/types/SvcSetView.go
@@ -0,0 +1,13 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcSetView struct {
6 EntityIndex int16
7}
8
9func ParseSvcSetView(reader *bitreader.ReaderType) SvcSetView {
10 return SvcSetView{
11 EntityIndex: int16(reader.TryReadBits(11)),
12 }
13}
diff --git a/packets/messages/types/SvcSounds.go b/packets/messages/types/SvcSounds.go
new file mode 100644
index 0000000..1f76a03
--- /dev/null
+++ b/packets/messages/types/SvcSounds.go
@@ -0,0 +1,31 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcSounds struct {
6 ReliableSound bool
7 Size int8
8 Data []byte
9}
10
11func ParseSvcSounds(reader *bitreader.ReaderType) SvcSounds {
12 reliablesound := reader.TryReadBool()
13 var size int8
14 var length int16
15 if reliablesound {
16 size = 1
17 } else {
18 size = int8(reader.TryReadInt8())
19 }
20 if reliablesound {
21 length = int16(reader.TryReadInt8())
22 } else {
23 length = int16(reader.TryReadInt16())
24 }
25 data := reader.TryReadBytesToSlice(int(length / 8))
26 return SvcSounds{
27 ReliableSound: reliablesound,
28 Size: size,
29 Data: data,
30 }
31}
diff --git a/packets/messages/types/SvcSplitScreen.go b/packets/messages/types/SvcSplitScreen.go
new file mode 100644
index 0000000..6727558
--- /dev/null
+++ b/packets/messages/types/SvcSplitScreen.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcSplitScreen struct {
6 Unk bool
7 Data []byte
8}
9
10func ParseSvcSplitScreen(reader *bitreader.ReaderType) SvcSplitScreen {
11 unk := reader.TryReadBool()
12 length := reader.TryReadBits(11)
13 return SvcSplitScreen{
14 Unk: unk,
15 Data: reader.TryReadBytesToSlice(int(length / 8)),
16 }
17}
diff --git a/packets/messages/types/SvcTempEntities.go b/packets/messages/types/SvcTempEntities.go
new file mode 100644
index 0000000..cd021a8
--- /dev/null
+++ b/packets/messages/types/SvcTempEntities.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcTempEntities struct {
6 NumEntries uint8
7 Data []byte
8}
9
10func ParseSvcTempEntities(reader *bitreader.ReaderType) SvcTempEntities {
11 numentries := reader.TryReadInt8()
12 length := reader.TryReadBits(17)
13 return SvcTempEntities{
14 NumEntries: numentries,
15 Data: reader.TryReadBytesToSlice(int(length / 8)),
16 }
17}
diff --git a/packets/messages/types/SvcUpdateStringTable.go b/packets/messages/types/SvcUpdateStringTable.go
new file mode 100644
index 0000000..d4a0609
--- /dev/null
+++ b/packets/messages/types/SvcUpdateStringTable.go
@@ -0,0 +1,21 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcUpdateStringTable struct {
6 TableId int8
7 NumChangedEntries int16
8 Data []byte
9}
10
11func ParseSvcUpdateStringTable(reader *bitreader.ReaderType) SvcUpdateStringTable {
12 svcupdatestringtable := SvcUpdateStringTable{
13 TableId: int8(reader.TryReadBits(5)),
14 }
15 if reader.TryReadBool() {
16 svcupdatestringtable.NumChangedEntries = int16(reader.TryReadInt16())
17 }
18 length := reader.TryReadBits(20)
19 svcupdatestringtable.Data = reader.TryReadBytesToSlice(int(length / 8))
20 return svcupdatestringtable
21}
diff --git a/packets/messages/types/SvcUserMessage.go b/packets/messages/types/SvcUserMessage.go
new file mode 100644
index 0000000..2e6f74a
--- /dev/null
+++ b/packets/messages/types/SvcUserMessage.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcUserMessage struct {
6 MsgType uint8
7 Data []byte
8}
9
10func ParseSvcUserMessage(reader *bitreader.ReaderType) SvcUserMessage {
11 msgtype := reader.TryReadInt8()
12 length := reader.TryReadBits(12)
13 return SvcUserMessage{
14 MsgType: msgtype,
15 Data: reader.TryReadBytesToSlice(int(length / 8)),
16 }
17}
diff --git a/packets/messages/types/SvcVoiceData.go b/packets/messages/types/SvcVoiceData.go
new file mode 100644
index 0000000..f99db38
--- /dev/null
+++ b/packets/messages/types/SvcVoiceData.go
@@ -0,0 +1,19 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcVoiceData struct {
6 Client int8
7 Proximity int8
8 Data []byte
9}
10
11func ParseSvcVoiceData(reader *bitreader.ReaderType) SvcVoiceData {
12 svcvoicedata := SvcVoiceData{
13 Client: int8(reader.TryReadInt8()),
14 Proximity: int8(reader.TryReadInt8()),
15 }
16 length := reader.TryReadInt16()
17 svcvoicedata.Data = reader.TryReadBytesToSlice(int(length / 8))
18 return svcvoicedata
19}
diff --git a/packets/messages/types/SvcVoiceInit.go b/packets/messages/types/SvcVoiceInit.go
new file mode 100644
index 0000000..3e18a7b
--- /dev/null
+++ b/packets/messages/types/SvcVoiceInit.go
@@ -0,0 +1,20 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcVoiceInit struct {
6 Codec string
7 Quality uint8
8 Unk float32
9}
10
11func ParseSvcVoiceInit(reader *bitreader.ReaderType) SvcVoiceInit {
12 svcvoiceinit := SvcVoiceInit{
13 Codec: reader.TryReadString(),
14 Quality: reader.TryReadInt8(),
15 }
16 if svcvoiceinit.Quality == 255 {
17 svcvoiceinit.Unk = reader.TryReadFloat32()
18 }
19 return svcvoiceinit
20}
diff --git a/packets/packet.go b/packets/packet.go
index 23a21e6..b27f2e7 100644
--- a/packets/packet.go
+++ b/packets/packet.go
@@ -44,7 +44,7 @@ func ParsePacket(reader *bitreader.ReaderType) (status int) {
44 Size: int32(reader.TryReadInt32()), 44 Size: int32(reader.TryReadInt32()),
45 } 45 }
46 consoleCmd.Data = reader.TryReadStringLen(int(consoleCmd.Size)) 46 consoleCmd.Data = reader.TryReadStringLen(int(consoleCmd.Size))
47 //fmt.Printf("[%d] (%d) ConsoleCmd: %s\n", messageTick, messageType, consoleCmd.Data) 47 fmt.Printf("[%d] (%d) ConsoleCmd: %s\n", messageTick, messageType, consoleCmd.Data)
48 return 4 48 return 4
49 case 0x05: // TODO: UserCmd - Buttons 49 case 0x05: // TODO: UserCmd - Buttons
50 userCmd := UserCmd{ 50 userCmd := UserCmd{