aboutsummaryrefslogtreecommitdiff
path: root/pkg/messages
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-12 20:53:09 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-16 21:39:42 +0300
commit82871ba1bac1d62f69e1933b66659e62d2e5e063 (patch)
treea906310fba89b670bcfda9625a6d776553d482f6 /pkg/messages
parentnet/svc messages finally getting parsed correctly (diff)
downloadsdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.tar.gz
sdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.tar.bz2
sdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.zip
another rewrite, v1.0.0
Diffstat (limited to '')
-rw-r--r--pkg/messages/messages.go87
-rw-r--r--pkg/messages/types/netDisconnect.go (renamed from packets/messages/types/NetDisconnect.go)6
-rw-r--r--pkg/messages/types/netFile.go (renamed from packets/messages/types/NetFile.go)6
-rw-r--r--pkg/messages/types/netNop.go9
-rw-r--r--pkg/messages/types/netSetConVar.go (renamed from packets/messages/types/NetSetConVar.go)17
-rw-r--r--pkg/messages/types/netSignOnState.go26
-rw-r--r--pkg/messages/types/netSplitScreenUser.go (renamed from packets/messages/types/NetSplitScreenUser.go)6
-rw-r--r--pkg/messages/types/netStringCmd.go (renamed from packets/messages/types/NetStringCmd.go)2
-rw-r--r--pkg/messages/types/netTick.go17
-rw-r--r--pkg/messages/types/svcBspDecal.go61
-rw-r--r--pkg/messages/types/svcClassInfo.go40
-rw-r--r--pkg/messages/types/svcCmdKeyValues.go16
-rw-r--r--pkg/messages/types/svcCreateStringTable.go36
-rw-r--r--pkg/messages/types/svcCrosshairAngle.go (renamed from packets/messages/types/SvcCrosshairAngle.go)8
-rw-r--r--pkg/messages/types/svcEntityMessage.go20
-rw-r--r--pkg/messages/types/svcFixAngle.go15
-rw-r--r--pkg/messages/types/svcGameEvent.go16
-rw-r--r--pkg/messages/types/svcGameEventList.go21
-rw-r--r--pkg/messages/types/svcGetCvarValue.go (renamed from packets/messages/types/SvcGetCvarValue.go)7
-rw-r--r--pkg/messages/types/svcMenu.go18
-rw-r--r--pkg/messages/types/svcPacketEntities.go30
-rw-r--r--pkg/messages/types/svcPaintmapData.go16
-rw-r--r--pkg/messages/types/svcPrefetch.go (renamed from packets/messages/types/SvcPrefetch.go)2
-rw-r--r--pkg/messages/types/svcPrint.go (renamed from packets/messages/types/SvcPrint.go)2
-rw-r--r--pkg/messages/types/svcSendTable.go17
-rw-r--r--pkg/messages/types/svcServerInfo.go43
-rw-r--r--pkg/messages/types/svcSetPause.go (renamed from packets/messages/types/SvcSetPause.go)10
-rw-r--r--pkg/messages/types/svcSetView.go (renamed from packets/messages/types/SvcSetView.go)2
-rw-r--r--pkg/messages/types/svcSounds.go25
-rw-r--r--pkg/messages/types/svcSplitScreen.go18
-rw-r--r--pkg/messages/types/svcTempEntities.go18
-rw-r--r--pkg/messages/types/svcUpdateStringTable.go22
-rw-r--r--pkg/messages/types/svcUserMessage.go18
-rw-r--r--pkg/messages/types/svcVoiceData.go20
-rw-r--r--pkg/messages/types/svcVoiceInit.go (renamed from packets/messages/types/SvcVoiceInit.go)12
35 files changed, 650 insertions, 39 deletions
diff --git a/pkg/messages/messages.go b/pkg/messages/messages.go
new file mode 100644
index 0000000..39f89e9
--- /dev/null
+++ b/pkg/messages/messages.go
@@ -0,0 +1,87 @@
1package messages
2
3import (
4 "fmt"
5 "reflect"
6
7 "github.com/pektezol/bitreader"
8 messages "github.com/pektezol/demoparser/pkg/messages/types"
9)
10
11func ParseMessages(messageType int, reader *bitreader.ReaderType) any {
12 var messageData any
13 switch messageType {
14 case 0:
15 messageData = messages.ParseNetNop(reader)
16 case 1:
17 messageData = messages.ParseNetDisconnect(reader)
18 case 2:
19 messageData = messages.ParseNetFile(reader)
20 case 3:
21 messageData = messages.ParseNetSplitScreenUser(reader)
22 case 4:
23 messageData = messages.ParseNetTick(reader)
24 case 5:
25 messageData = messages.ParseNetStringCmd(reader)
26 case 6:
27 messageData = messages.ParseNetSetConVar(reader)
28 case 7:
29 messageData = messages.ParseNetSignOnState(reader)
30 case 8:
31 messageData = messages.ParseSvcServerInfo(reader)
32 case 9:
33 messageData = messages.ParseSvcSendTable(reader)
34 case 10:
35 messageData = messages.ParseSvcClassInfo(reader)
36 case 11:
37 messageData = messages.ParseSvcSetPause(reader)
38 case 12:
39 messageData = messages.ParseSvcCreateStringTable(reader)
40 case 13:
41 messageData = messages.ParseSvcUpdateStringTable(reader)
42 case 14:
43 messageData = messages.ParseSvcVoiceInit(reader)
44 case 15:
45 messageData = messages.ParseSvcVoiceData(reader)
46 case 16:
47 messageData = messages.ParseSvcPrint(reader)
48 case 17:
49 messageData = messages.ParseSvcSounds(reader)
50 case 18:
51 messageData = messages.ParseSvcSetView(reader)
52 case 19:
53 messageData = messages.ParseSvcFixAngle(reader)
54 case 20:
55 messageData = messages.ParseSvcCrosshairAngle(reader)
56 case 21:
57 messageData = messages.ParseSvcBspDecal(reader)
58 case 22:
59 messageData = messages.ParseSvcSplitScreen(reader)
60 case 23:
61 messageData = messages.ParseSvcUserMessage(reader)
62 case 24:
63 messageData = messages.ParseSvcEntityMessage(reader)
64 case 25:
65 messageData = messages.ParseSvcGameEvent(reader)
66 case 26:
67 messageData = messages.ParseSvcPacketEntities(reader)
68 case 27:
69 messageData = messages.ParseSvcTempEntities(reader)
70 case 28:
71 messageData = messages.ParseSvcPrefetch(reader)
72 case 29:
73 messageData = messages.ParseSvcMenu(reader)
74 case 30:
75 messageData = messages.ParseSvcGameEventList(reader)
76 case 31:
77 messageData = messages.ParseSvcGetCvarValue(reader)
78 case 32:
79 messageData = messages.ParseSvcCmdKeyValues(reader)
80 case 33:
81 messageData = messages.ParseSvcPaintmapData(reader)
82 default:
83 return nil
84 }
85 fmt.Printf("\t\t(%d) %s:\n\t\t\t%+v\n", messageType, reflect.ValueOf(messageData).Type(), messageData)
86 return messageData
87}
diff --git a/packets/messages/types/NetDisconnect.go b/pkg/messages/types/netDisconnect.go
index 8b65568..69d4a67 100644
--- a/packets/messages/types/NetDisconnect.go
+++ b/pkg/messages/types/netDisconnect.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
@@ -7,5 +7,7 @@ type NetDisconnect struct {
7} 7}
8 8
9func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect { 9func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect {
10 return NetDisconnect{Text: reader.TryReadString()} 10 return NetDisconnect{
11 Text: reader.TryReadString(),
12 }
11} 13}
diff --git a/packets/messages/types/NetFile.go b/pkg/messages/types/netFile.go
index c65873d..a41a0cf 100644
--- a/packets/messages/types/NetFile.go
+++ b/pkg/messages/types/netFile.go
@@ -1,16 +1,16 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
5type NetFile struct { 5type NetFile struct {
6 TransferId uint32 6 TransferId int32
7 FileName string 7 FileName string
8 FileRequested bool 8 FileRequested bool
9} 9}
10 10
11func ParseNetFile(reader *bitreader.ReaderType) NetFile { 11func ParseNetFile(reader *bitreader.ReaderType) NetFile {
12 return NetFile{ 12 return NetFile{
13 TransferId: reader.TryReadInt32(), 13 TransferId: int32(reader.TryReadBits(32)),
14 FileName: reader.TryReadString(), 14 FileName: reader.TryReadString(),
15 FileRequested: reader.TryReadBool(), 15 FileRequested: reader.TryReadBool(),
16 } 16 }
diff --git a/pkg/messages/types/netNop.go b/pkg/messages/types/netNop.go
new file mode 100644
index 0000000..33f8e25
--- /dev/null
+++ b/pkg/messages/types/netNop.go
@@ -0,0 +1,9 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type NetNop struct{}
6
7func ParseNetNop(reader *bitreader.ReaderType) NetNop {
8 return NetNop{}
9}
diff --git a/packets/messages/types/NetSetConVar.go b/pkg/messages/types/netSetConVar.go
index eca05e0..08042ae 100644
--- a/packets/messages/types/NetSetConVar.go
+++ b/pkg/messages/types/netSetConVar.go
@@ -1,26 +1,29 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
5type NetSetConVar struct { 5type NetSetConVar struct {
6 ConVars []ConVar 6 Length int8
7 ConVars []conVar
7} 8}
8 9
9type ConVar struct { 10type conVar struct {
10 Name string 11 Name string
11 Value string 12 Value string
12} 13}
13 14
14func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar { 15func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar {
15 length := reader.TryReadInt8() 16 length := reader.TryReadBits(8)
16 convars := make([]ConVar, length) 17 convars := []conVar{}
17 for i := 0; i < int(length); i++ { 18 for count := 0; count < int(length); count++ {
18 convars[i] = ConVar{ 19 convar := conVar{
19 Name: reader.TryReadString(), 20 Name: reader.TryReadString(),
20 Value: reader.TryReadString(), 21 Value: reader.TryReadString(),
21 } 22 }
23 convars = append(convars, convar)
22 } 24 }
23 return NetSetConVar{ 25 return NetSetConVar{
26 Length: int8(length),
24 ConVars: convars, 27 ConVars: convars,
25 } 28 }
26} 29}
diff --git a/pkg/messages/types/netSignOnState.go b/pkg/messages/types/netSignOnState.go
new file mode 100644
index 0000000..4609ff2
--- /dev/null
+++ b/pkg/messages/types/netSignOnState.go
@@ -0,0 +1,26 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type NetSignOnState struct {
6 SignOnState int8
7 SpawnCount int32
8 NumServerPlayers int32
9 IdsLength int32
10 PlayersNetworksIds []byte
11 MapNameLength int32
12 MapName string
13}
14
15func ParseNetSignOnState(reader *bitreader.ReaderType) NetSignOnState {
16 netSignOnState := NetSignOnState{
17 SignOnState: int8(reader.TryReadBits(8)),
18 SpawnCount: int32(reader.TryReadBits(32)),
19 NumServerPlayers: int32(reader.TryReadBits(32)),
20 IdsLength: int32(reader.TryReadBits(32)),
21 }
22 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(int(netSignOnState.IdsLength))
23 netSignOnState.MapNameLength = int32(reader.TryReadBits(32))
24 netSignOnState.MapName = reader.TryReadStringLen(int(netSignOnState.MapNameLength))
25 return netSignOnState
26}
diff --git a/packets/messages/types/NetSplitScreenUser.go b/pkg/messages/types/netSplitScreenUser.go
index d4d04b5..65e85f3 100644
--- a/packets/messages/types/NetSplitScreenUser.go
+++ b/pkg/messages/types/netSplitScreenUser.go
@@ -1,13 +1,13 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
5type NetSplitScreenUser struct { 5type NetSplitScreenUser struct {
6 PlayerSlot bool 6 Unknown bool
7} 7}
8 8
9func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser { 9func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser {
10 return NetSplitScreenUser{ 10 return NetSplitScreenUser{
11 PlayerSlot: reader.TryReadBool(), 11 Unknown: reader.TryReadBool(),
12 } 12 }
13} 13}
diff --git a/packets/messages/types/NetStringCmd.go b/pkg/messages/types/netStringCmd.go
index 1ee9f67..158658e 100644
--- a/packets/messages/types/NetStringCmd.go
+++ b/pkg/messages/types/netStringCmd.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
diff --git a/pkg/messages/types/netTick.go b/pkg/messages/types/netTick.go
new file mode 100644
index 0000000..e14f259
--- /dev/null
+++ b/pkg/messages/types/netTick.go
@@ -0,0 +1,17 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type NetTick struct {
6 Tick int32
7 HostFrameTime int16
8 HostFrameTimeStdDeviation int16
9}
10
11func ParseNetTick(reader *bitreader.ReaderType) NetTick {
12 return NetTick{
13 Tick: int32(reader.TryReadBits(32)),
14 HostFrameTime: int16(reader.TryReadBits(16) / 10e5),
15 HostFrameTimeStdDeviation: int16(reader.TryReadBits(16) / 10e5),
16 }
17}
diff --git a/pkg/messages/types/svcBspDecal.go b/pkg/messages/types/svcBspDecal.go
new file mode 100644
index 0000000..484497f
--- /dev/null
+++ b/pkg/messages/types/svcBspDecal.go
@@ -0,0 +1,61 @@
1package messages
2
3import (
4 "github.com/pektezol/bitreader"
5)
6
7type SvcBspDecal struct {
8 Pos []vectorCoord
9 DecalTextureIndex int16
10 EntityIndex int16
11 ModelIndex int16
12 LowPriority int8
13}
14
15type vectorCoord struct {
16 Value float32
17 Valid bool
18}
19
20func ParseSvcBspDecal(reader *bitreader.ReaderType) SvcBspDecal {
21 svcBspDecal := SvcBspDecal{
22 Pos: readVectorCoords(reader),
23 DecalTextureIndex: int16(reader.TryReadBits(9)),
24 }
25 if reader.TryReadBool() {
26 svcBspDecal.EntityIndex = int16(reader.TryReadBits(11))
27 svcBspDecal.ModelIndex = int16(reader.TryReadBits(11))
28 }
29 svcBspDecal.LowPriority = int8(reader.TryReadBits(1))
30 return svcBspDecal
31}
32
33func readVectorCoords(reader *bitreader.ReaderType) []vectorCoord {
34 const COORD_INTEGER_BITS uint8 = 14
35 const COORD_FRACTIONAL_BITS uint8 = 5
36 const COORD_DENOMINATOR uint8 = 1 << COORD_FRACTIONAL_BITS
37 const COORD_RESOLUTION float32 = 1.0 / float32(COORD_DENOMINATOR)
38 readVectorCoord := func() float32 {
39 value := float32(0)
40 integer := reader.TryReadBits(1)
41 fraction := reader.TryReadBits(1)
42 if integer != 0 || fraction != 0 {
43 sign := reader.TryReadBits(1)
44 if integer != 0 {
45 integer = reader.TryReadBits(int(COORD_INTEGER_BITS)) + 1
46 }
47 if fraction != 0 {
48 fraction = reader.TryReadBits(int(COORD_FRACTIONAL_BITS))
49 }
50 value = float32(integer) + float32(fraction)*COORD_RESOLUTION
51 if sign != 0 {
52 value = -value
53 }
54 }
55 return value
56 }
57 x := reader.TryReadBits(1)
58 y := reader.TryReadBits(1)
59 z := reader.TryReadBits(1)
60 return []vectorCoord{{Value: readVectorCoord(), Valid: x != 0}, {Value: readVectorCoord(), Valid: y != 0}, {Value: readVectorCoord(), Valid: z != 0}}
61}
diff --git a/pkg/messages/types/svcClassInfo.go b/pkg/messages/types/svcClassInfo.go
new file mode 100644
index 0000000..9f367d3
--- /dev/null
+++ b/pkg/messages/types/svcClassInfo.go
@@ -0,0 +1,40 @@
1package messages
2
3import (
4 "fmt"
5 "math"
6
7 "github.com/pektezol/bitreader"
8)
9
10type SvcClassInfo struct {
11 Length int16
12 CreateOnClient bool
13 ServerClasses []serverClass
14}
15
16type serverClass struct {
17 ClassId int16
18 ClassName string
19 DataTableName string
20}
21
22func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo {
23 svcClassInfo := SvcClassInfo{
24 Length: int16(reader.TryReadBits(16)),
25 CreateOnClient: reader.TryReadBool(),
26 }
27 classes := []serverClass{}
28 if !svcClassInfo.CreateOnClient {
29 for count := 0; count < int(svcClassInfo.Length); count++ {
30 fmt.Println(classes)
31 classes = append(classes, serverClass{
32 ClassId: int16(reader.TryReadBits(int(math.Log2(float64(svcClassInfo.Length)) + 1))),
33 ClassName: reader.TryReadString(),
34 DataTableName: reader.TryReadString(),
35 })
36 }
37 }
38 svcClassInfo.ServerClasses = classes
39 return svcClassInfo
40}
diff --git a/pkg/messages/types/svcCmdKeyValues.go b/pkg/messages/types/svcCmdKeyValues.go
new file mode 100644
index 0000000..1c4d819
--- /dev/null
+++ b/pkg/messages/types/svcCmdKeyValues.go
@@ -0,0 +1,16 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcCmdKeyValues struct {
6 Length int32
7 Data []byte
8}
9
10func ParseSvcCmdKeyValues(reader *bitreader.ReaderType) SvcCmdKeyValues {
11 svcCmdKeyValues := SvcCmdKeyValues{
12 Length: int32(reader.TryReadBits(32)),
13 }
14 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(int(svcCmdKeyValues.Length))
15 return svcCmdKeyValues
16}
diff --git a/pkg/messages/types/svcCreateStringTable.go b/pkg/messages/types/svcCreateStringTable.go
new file mode 100644
index 0000000..ed9e477
--- /dev/null
+++ b/pkg/messages/types/svcCreateStringTable.go
@@ -0,0 +1,36 @@
1package messages
2
3import (
4 "math"
5
6 "github.com/pektezol/bitreader"
7)
8
9type SvcCreateStringTable struct {
10 Name string
11 MaxEntries int16
12 NumEntries int8
13 Length int32
14 UserDataFixedSize bool
15 UserDataSize int16
16 UserDataSizeBits int8
17 Flags int8
18 StringData int
19}
20
21func ParseSvcCreateStringTable(reader *bitreader.ReaderType) SvcCreateStringTable {
22 svcCreateStringTable := SvcCreateStringTable{
23 Name: reader.TryReadString(),
24 MaxEntries: int16(reader.TryReadBits(16)),
25 }
26 svcCreateStringTable.NumEntries = int8(reader.TryReadBits(int(math.Log2(float64(svcCreateStringTable.MaxEntries))) + 1))
27 svcCreateStringTable.Length = int32(reader.TryReadBits(20))
28 svcCreateStringTable.UserDataFixedSize = reader.TryReadBool()
29 if svcCreateStringTable.UserDataFixedSize {
30 svcCreateStringTable.UserDataSize = int16(reader.TryReadBits(12))
31 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4))
32 }
33 svcCreateStringTable.Flags = int8(reader.TryReadBits(2))
34 reader.SkipBits(int(svcCreateStringTable.Length)) // TODO: StringTable parsing
35 return svcCreateStringTable
36}
diff --git a/packets/messages/types/SvcCrosshairAngle.go b/pkg/messages/types/svcCrosshairAngle.go
index 6584426..cf18212 100644
--- a/packets/messages/types/SvcCrosshairAngle.go
+++ b/pkg/messages/types/svcCrosshairAngle.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
@@ -8,10 +8,6 @@ type SvcCrosshairAngle struct {
8 8
9func ParseSvcCrosshairAngle(reader *bitreader.ReaderType) SvcCrosshairAngle { 9func ParseSvcCrosshairAngle(reader *bitreader.ReaderType) SvcCrosshairAngle {
10 return SvcCrosshairAngle{ 10 return SvcCrosshairAngle{
11 Angle: []int16{ 11 Angle: []int16{int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16))},
12 int16(reader.TryReadInt16()),
13 int16(reader.TryReadInt16()),
14 int16(reader.TryReadInt16()),
15 },
16 } 12 }
17} 13}
diff --git a/pkg/messages/types/svcEntityMessage.go b/pkg/messages/types/svcEntityMessage.go
new file mode 100644
index 0000000..9726ced
--- /dev/null
+++ b/pkg/messages/types/svcEntityMessage.go
@@ -0,0 +1,20 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcEntityMessage struct {
6 EntityIndex int16
7 ClassId int16
8 Length int16
9 Data []byte
10}
11
12func ParseSvcEntityMessage(reader *bitreader.ReaderType) SvcEntityMessage {
13 svcEntityMessage := SvcEntityMessage{
14 EntityIndex: int16(reader.TryReadBits(11)),
15 ClassId: int16(reader.TryReadBits(9)),
16 Length: int16(reader.TryReadBits(11)),
17 }
18 svcEntityMessage.Data = reader.TryReadBitsToSlice(int(svcEntityMessage.Length))
19 return svcEntityMessage
20}
diff --git a/pkg/messages/types/svcFixAngle.go b/pkg/messages/types/svcFixAngle.go
new file mode 100644
index 0000000..56acf04
--- /dev/null
+++ b/pkg/messages/types/svcFixAngle.go
@@ -0,0 +1,15 @@
1package messages
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 return SvcFixAngle{
12 Relative: reader.TryReadBool(),
13 Angle: []int16{int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16))},
14 }
15}
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go
new file mode 100644
index 0000000..6ee4d01
--- /dev/null
+++ b/pkg/messages/types/svcGameEvent.go
@@ -0,0 +1,16 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcGameEvent struct {
6 Length int16
7 Data []byte // TODO: GameEvent[]
8}
9
10func ParseSvcGameEvent(reader *bitreader.ReaderType) SvcGameEvent {
11 svcGameEvent := SvcGameEvent{
12 Length: int16(reader.TryReadBits(11)),
13 }
14 svcGameEvent.Data = reader.TryReadBitsToSlice(int(svcGameEvent.Length))
15 return svcGameEvent
16}
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go
new file mode 100644
index 0000000..b99ce28
--- /dev/null
+++ b/pkg/messages/types/svcGameEventList.go
@@ -0,0 +1,21 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcGameEventList struct {
6 Events int16
7 Length int32
8 GameEventDescriptor []gameEventDescriptor
9}
10
11type gameEventDescriptor struct {
12}
13
14func ParseSvcGameEventList(reader *bitreader.ReaderType) SvcGameEventList {
15 svcGameEventList := SvcGameEventList{
16 Events: int16(reader.TryReadBits(9)),
17 Length: int32(reader.TryReadBits(20)),
18 }
19 reader.TryReadBitsToSlice(int(svcGameEventList.Length))
20 return svcGameEventList
21}
diff --git a/packets/messages/types/SvcGetCvarValue.go b/pkg/messages/types/svcGetCvarValue.go
index 2925da5..aef5c8e 100644
--- a/packets/messages/types/SvcGetCvarValue.go
+++ b/pkg/messages/types/svcGetCvarValue.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
@@ -8,8 +8,9 @@ type SvcGetCvarValue struct {
8} 8}
9 9
10func ParseSvcGetCvarValue(reader *bitreader.ReaderType) SvcGetCvarValue { 10func ParseSvcGetCvarValue(reader *bitreader.ReaderType) SvcGetCvarValue {
11 return SvcGetCvarValue{ 11 svcGetCvarValue := SvcGetCvarValue{
12 Cookie: reader.TryReadStringLen(32), 12 Cookie: reader.TryReadStringLen(4),
13 CvarName: reader.TryReadString(), 13 CvarName: reader.TryReadString(),
14 } 14 }
15 return svcGetCvarValue
15} 16}
diff --git a/pkg/messages/types/svcMenu.go b/pkg/messages/types/svcMenu.go
new file mode 100644
index 0000000..d89f52c
--- /dev/null
+++ b/pkg/messages/types/svcMenu.go
@@ -0,0 +1,18 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcMenu struct {
6 MenuType int16
7 Length int32
8 Data []byte
9}
10
11func ParseSvcMenu(reader *bitreader.ReaderType) SvcMenu {
12 svcMenu := SvcMenu{
13 MenuType: int16(reader.TryReadBits(16)),
14 Length: int32(reader.TryReadBits(32)),
15 }
16 svcMenu.Data = reader.TryReadBitsToSlice(int(svcMenu.Length))
17 return svcMenu
18}
diff --git a/pkg/messages/types/svcPacketEntities.go b/pkg/messages/types/svcPacketEntities.go
new file mode 100644
index 0000000..b1c23e5
--- /dev/null
+++ b/pkg/messages/types/svcPacketEntities.go
@@ -0,0 +1,30 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcPacketEntities struct {
6 MaxEntries int16
7 IsDelta bool
8 DeltaFrom int32
9 BaseLine bool
10 UpdatedEntries int16
11 Length int32
12 UpdatedBaseline bool
13 Data []byte
14}
15
16func ParseSvcPacketEntities(reader *bitreader.ReaderType) SvcPacketEntities {
17 svcPacketEntities := SvcPacketEntities{
18 MaxEntries: int16(reader.TryReadBits(11)),
19 IsDelta: reader.TryReadBool(),
20 }
21 if svcPacketEntities.IsDelta {
22 svcPacketEntities.DeltaFrom = int32(reader.TryReadBits(32))
23 }
24 svcPacketEntities.BaseLine = reader.TryReadBool()
25 svcPacketEntities.UpdatedEntries = int16(reader.TryReadBits(11))
26 svcPacketEntities.Length = int32(reader.TryReadBits(20))
27 svcPacketEntities.UpdatedBaseline = reader.TryReadBool()
28 svcPacketEntities.Data = reader.TryReadBitsToSlice(int(svcPacketEntities.Length))
29 return svcPacketEntities
30}
diff --git a/pkg/messages/types/svcPaintmapData.go b/pkg/messages/types/svcPaintmapData.go
new file mode 100644
index 0000000..6b041da
--- /dev/null
+++ b/pkg/messages/types/svcPaintmapData.go
@@ -0,0 +1,16 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcPaintmapData struct {
6 Length int32
7 Data []byte
8}
9
10func ParseSvcPaintmapData(reader *bitreader.ReaderType) SvcPaintmapData {
11 svcPaintmapData := SvcPaintmapData{
12 Length: int32(reader.TryReadBits(32)),
13 }
14 svcPaintmapData.Data = reader.TryReadBitsToSlice(int(svcPaintmapData.Length))
15 return svcPaintmapData
16}
diff --git a/packets/messages/types/SvcPrefetch.go b/pkg/messages/types/svcPrefetch.go
index b277252..549f926 100644
--- a/packets/messages/types/SvcPrefetch.go
+++ b/pkg/messages/types/svcPrefetch.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
diff --git a/packets/messages/types/SvcPrint.go b/pkg/messages/types/svcPrint.go
index c6d91ac..8aff927 100644
--- a/packets/messages/types/SvcPrint.go
+++ b/pkg/messages/types/svcPrint.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
diff --git a/pkg/messages/types/svcSendTable.go b/pkg/messages/types/svcSendTable.go
new file mode 100644
index 0000000..ae8960b
--- /dev/null
+++ b/pkg/messages/types/svcSendTable.go
@@ -0,0 +1,17 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcSendTable struct {
6 NeedsDecoder int8
7 Length int8
8 Props int32
9}
10
11func ParseSvcSendTable(reader *bitreader.ReaderType) SvcSendTable {
12 return SvcSendTable{
13 NeedsDecoder: int8(reader.TryReadBits(8)),
14 Length: int8(reader.TryReadBits(8)),
15 Props: int32(reader.TryReadBits(32)),
16 }
17}
diff --git a/pkg/messages/types/svcServerInfo.go b/pkg/messages/types/svcServerInfo.go
new file mode 100644
index 0000000..b8bb308
--- /dev/null
+++ b/pkg/messages/types/svcServerInfo.go
@@ -0,0 +1,43 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcServerInfo struct {
6 Protocol int16
7 ServerCount int32
8 IsHltv bool
9 IsDedicated bool
10 ClientCrc int32
11 MaxClasses int16
12 MapCrc int32
13 PlayerSlot int8
14 MaxClients int8
15 Unk int32
16 TickInterval int32
17 COs int8
18 GameDir string
19 MapName string
20 SkyName string
21 HostName string
22}
23
24func ParseSvcServerInfo(reader *bitreader.ReaderType) SvcServerInfo {
25 return SvcServerInfo{
26 Protocol: int16(reader.TryReadBits(16)),
27 ServerCount: int32(reader.TryReadBits(32)),
28 IsHltv: reader.TryReadBool(),
29 IsDedicated: reader.TryReadBool(),
30 ClientCrc: int32(reader.TryReadBits(32)),
31 MaxClasses: int16(reader.TryReadBits(16)),
32 MapCrc: int32(reader.TryReadBits(32)),
33 PlayerSlot: int8(reader.TryReadBits(8)),
34 MaxClients: int8(reader.TryReadBits(8)),
35 Unk: int32(reader.TryReadBits(32)),
36 TickInterval: int32(reader.TryReadBits(32)),
37 COs: int8(reader.TryReadBits(8)),
38 GameDir: reader.TryReadString(),
39 MapName: reader.TryReadString(),
40 SkyName: reader.TryReadString(),
41 HostName: reader.TryReadString(),
42 }
43}
diff --git a/packets/messages/types/SvcSetPause.go b/pkg/messages/types/svcSetPause.go
index c71485c..94303b7 100644
--- a/packets/messages/types/SvcSetPause.go
+++ b/pkg/messages/types/svcSetPause.go
@@ -1,13 +1,13 @@
1package types 1package messages
2 2
3import ( 3import "github.com/pektezol/bitreader"
4 "github.com/pektezol/bitreader"
5)
6 4
7type SvcSetPause struct { 5type SvcSetPause struct {
8 Paused bool 6 Paused bool
9} 7}
10 8
11func ParseSvcSetPause(reader *bitreader.ReaderType) SvcSetPause { 9func ParseSvcSetPause(reader *bitreader.ReaderType) SvcSetPause {
12 return SvcSetPause{Paused: reader.TryReadBool()} 10 return SvcSetPause{
11 Paused: reader.TryReadBool(),
12 }
13} 13}
diff --git a/packets/messages/types/SvcSetView.go b/pkg/messages/types/svcSetView.go
index 5507eae..70d1e2b 100644
--- a/packets/messages/types/SvcSetView.go
+++ b/pkg/messages/types/svcSetView.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
diff --git a/pkg/messages/types/svcSounds.go b/pkg/messages/types/svcSounds.go
new file mode 100644
index 0000000..e87d584
--- /dev/null
+++ b/pkg/messages/types/svcSounds.go
@@ -0,0 +1,25 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcSounds struct {
6 ReliableSound bool
7 Size int8
8 Length int16
9 Data []byte
10}
11
12func ParseSvcSounds(reader *bitreader.ReaderType) SvcSounds {
13 svcSounds := SvcSounds{
14 ReliableSound: reader.TryReadBool(),
15 }
16 if svcSounds.ReliableSound {
17 svcSounds.Size = 1
18 svcSounds.Length = int16(reader.TryReadBits(8))
19 } else {
20 svcSounds.Size = int8(reader.TryReadBits(8))
21 svcSounds.Length = int16(reader.TryReadBits(16))
22 }
23 svcSounds.Data = reader.TryReadBitsToSlice(int(svcSounds.Length))
24 return svcSounds
25}
diff --git a/pkg/messages/types/svcSplitScreen.go b/pkg/messages/types/svcSplitScreen.go
new file mode 100644
index 0000000..9c808bc
--- /dev/null
+++ b/pkg/messages/types/svcSplitScreen.go
@@ -0,0 +1,18 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcSplitScreen struct {
6 Unk bool
7 Length int16
8 Data []byte
9}
10
11func ParseSvcSplitScreen(reader *bitreader.ReaderType) SvcSplitScreen {
12 svcSplitScreen := SvcSplitScreen{
13 Unk: reader.TryReadBool(),
14 Length: int16(reader.TryReadBits(11)),
15 }
16 svcSplitScreen.Data = reader.TryReadBitsToSlice(int(svcSplitScreen.Length))
17 return svcSplitScreen
18}
diff --git a/pkg/messages/types/svcTempEntities.go b/pkg/messages/types/svcTempEntities.go
new file mode 100644
index 0000000..d22423d
--- /dev/null
+++ b/pkg/messages/types/svcTempEntities.go
@@ -0,0 +1,18 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcTempEntities struct {
6 NumEntries int8
7 Length int32
8 Data []byte
9}
10
11func ParseSvcTempEntities(reader *bitreader.ReaderType) SvcTempEntities {
12 svcTempEntities := SvcTempEntities{
13 NumEntries: int8(reader.TryReadBits(8)),
14 Length: int32(reader.TryReadBits(17)),
15 }
16 svcTempEntities.Data = reader.TryReadBitsToSlice(int(svcTempEntities.Length))
17 return svcTempEntities
18}
diff --git a/pkg/messages/types/svcUpdateStringTable.go b/pkg/messages/types/svcUpdateStringTable.go
new file mode 100644
index 0000000..2840482
--- /dev/null
+++ b/pkg/messages/types/svcUpdateStringTable.go
@@ -0,0 +1,22 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcUpdateStringTable struct {
6 TableId int8
7 NumChangedEntries int16
8 Length int32
9 Data []byte
10}
11
12func ParseSvcUpdateStringTable(reader *bitreader.ReaderType) SvcUpdateStringTable {
13 svcUpdateStringTable := SvcUpdateStringTable{
14 TableId: int8(reader.TryReadBits(5)),
15 }
16 if reader.TryReadBool() {
17 svcUpdateStringTable.NumChangedEntries = int16(reader.TryReadBits(16))
18 }
19 svcUpdateStringTable.Length = int32(reader.TryReadBits(20))
20 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(int(svcUpdateStringTable.Length))
21 return svcUpdateStringTable
22}
diff --git a/pkg/messages/types/svcUserMessage.go b/pkg/messages/types/svcUserMessage.go
new file mode 100644
index 0000000..b53c7c0
--- /dev/null
+++ b/pkg/messages/types/svcUserMessage.go
@@ -0,0 +1,18 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcUserMessage struct {
6 MsgType int8
7 Length int16
8 Data []byte
9}
10
11func ParseSvcUserMessage(reader *bitreader.ReaderType) SvcUserMessage {
12 svcUserMessage := SvcUserMessage{
13 MsgType: int8(reader.TryReadBits(8)),
14 Length: int16(reader.TryReadBits(12)),
15 }
16 svcUserMessage.Data = reader.TryReadBitsToSlice(int(svcUserMessage.Length))
17 return svcUserMessage
18}
diff --git a/pkg/messages/types/svcVoiceData.go b/pkg/messages/types/svcVoiceData.go
new file mode 100644
index 0000000..b6c81d4
--- /dev/null
+++ b/pkg/messages/types/svcVoiceData.go
@@ -0,0 +1,20 @@
1package messages
2
3import "github.com/pektezol/bitreader"
4
5type SvcVoiceData struct {
6 Client int8
7 Proximity int8
8 Length int16
9 Data []byte
10}
11
12func ParseSvcVoiceData(reader *bitreader.ReaderType) SvcVoiceData {
13 svcVoiceData := SvcVoiceData{
14 Client: int8(reader.TryReadBits(8)),
15 Proximity: int8(reader.TryReadBits(8)),
16 Length: int16(reader.TryReadBits(16)),
17 }
18 svcVoiceData.Data = reader.TryReadBitsToSlice(int(svcVoiceData.Length))
19 return svcVoiceData
20}
diff --git a/packets/messages/types/SvcVoiceInit.go b/pkg/messages/types/svcVoiceInit.go
index 3e18a7b..4c95aab 100644
--- a/packets/messages/types/SvcVoiceInit.go
+++ b/pkg/messages/types/svcVoiceInit.go
@@ -1,4 +1,4 @@
1package types 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import "github.com/pektezol/bitreader"
4 4
@@ -9,12 +9,12 @@ type SvcVoiceInit struct {
9} 9}
10 10
11func ParseSvcVoiceInit(reader *bitreader.ReaderType) SvcVoiceInit { 11func ParseSvcVoiceInit(reader *bitreader.ReaderType) SvcVoiceInit {
12 svcvoiceinit := SvcVoiceInit{ 12 svcVoiceInit := SvcVoiceInit{
13 Codec: reader.TryReadString(), 13 Codec: reader.TryReadString(),
14 Quality: reader.TryReadInt8(), 14 Quality: uint8(reader.TryReadBits(8)),
15 } 15 }
16 if svcvoiceinit.Quality == 255 { 16 if svcVoiceInit.Quality == 0b11111111 {
17 svcvoiceinit.Unk = reader.TryReadFloat32() 17 svcVoiceInit.Unk = reader.TryReadFloat32()
18 } 18 }
19 return svcvoiceinit 19 return svcVoiceInit
20} 20}