aboutsummaryrefslogtreecommitdiff
path: root/packets
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2022-11-08 22:48:20 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-16 21:39:39 +0300
commit833a46544df2ed2a7afdba08ebfe02ed7741d86a (patch)
tree2432f14b449761086d773fb8cd072797d23006f1 /packets
parentput class type into individual files (diff)
downloadsdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.tar.gz
sdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.tar.bz2
sdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.zip
net/svc messages
Diffstat (limited to 'packets')
-rw-r--r--packets/messages/message.go50
-rw-r--r--packets/messages/types/NetDisconnect.go11
-rw-r--r--packets/messages/types/NetFile.go17
-rw-r--r--packets/messages/types/NetNop.go3
-rw-r--r--packets/messages/types/NetSetConVar.go28
-rw-r--r--packets/messages/types/NetSignOnState.go31
-rw-r--r--packets/messages/types/NetSplitScreenUser.go13
-rw-r--r--packets/messages/types/NetStringCmd.go13
-rw-r--r--packets/messages/types/NetTick.go17
-rw-r--r--packets/messages/types/SvcClassInfo.go42
-rw-r--r--packets/messages/types/SvcSendTable.go17
-rw-r--r--packets/messages/types/SvcServerInfo.go43
-rw-r--r--packets/messages/types/SvcSetPause.go11
-rw-r--r--packets/packet.go (renamed from packets/message.go)7
-rw-r--r--packets/types.go9
15 files changed, 306 insertions, 6 deletions
diff --git a/packets/messages/message.go b/packets/messages/message.go
new file mode 100644
index 0000000..c508bfa
--- /dev/null
+++ b/packets/messages/message.go
@@ -0,0 +1,50 @@
1package messages
2
3import (
4 "bytes"
5
6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/packets/messages/types"
8)
9
10func ParseMessage(data []byte) []Message {
11 reader := bitreader.Reader(bytes.NewReader(data), true)
12 var messages []Message
13 for {
14 messageType, err := reader.ReadBits(6)
15 if err != nil {
16 break
17 }
18 switch messageType {
19 case 0x00:
20 messages = append(messages, Message{Data: types.NetNop{}})
21 case 0x01:
22 messages = append(messages, Message{Data: types.ParseNetDisconnect(reader)})
23 case 0x02:
24 messages = append(messages, Message{Data: types.ParseNetFile(reader)})
25 case 0x03:
26 messages = append(messages, Message{Data: types.ParseNetSplitScreenUser(reader)})
27 case 0x04:
28 messages = append(messages, Message{Data: types.ParseNetTick(reader)})
29 case 0x05:
30 messages = append(messages, Message{Data: types.ParseNetStringCmd(reader)})
31 case 0x06:
32 messages = append(messages, Message{Data: types.ParseNetSetConVar(reader)})
33 case 0x07:
34 messages = append(messages, Message{Data: types.ParseNetSignOnState(reader)})
35 case 0x08:
36 messages = append(messages, Message{Data: types.ParseSvcServerInfo(reader)})
37 case 0x09:
38 messages = append(messages, Message{Data: types.ParseSvcSendTable(reader)})
39 case 0x10:
40 messages = append(messages, Message{Data: types.ParseSvcClassInfo(reader)})
41 case 0x11:
42 messages = append(messages, Message{Data: types.ParseSvcSetPause(reader)})
43 }
44 }
45 return messages
46}
47
48type Message struct {
49 Data any
50}
diff --git a/packets/messages/types/NetDisconnect.go b/packets/messages/types/NetDisconnect.go
new file mode 100644
index 0000000..8b65568
--- /dev/null
+++ b/packets/messages/types/NetDisconnect.go
@@ -0,0 +1,11 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetDisconnect struct {
6 Text string
7}
8
9func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect {
10 return NetDisconnect{Text: reader.TryReadString()}
11}
diff --git a/packets/messages/types/NetFile.go b/packets/messages/types/NetFile.go
new file mode 100644
index 0000000..c65873d
--- /dev/null
+++ b/packets/messages/types/NetFile.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetFile struct {
6 TransferId uint32
7 FileName string
8 FileRequested bool
9}
10
11func ParseNetFile(reader *bitreader.ReaderType) NetFile {
12 return NetFile{
13 TransferId: reader.TryReadInt32(),
14 FileName: reader.TryReadString(),
15 FileRequested: reader.TryReadBool(),
16 }
17}
diff --git a/packets/messages/types/NetNop.go b/packets/messages/types/NetNop.go
new file mode 100644
index 0000000..d0a1f7a
--- /dev/null
+++ b/packets/messages/types/NetNop.go
@@ -0,0 +1,3 @@
1package types
2
3type NetNop struct{}
diff --git a/packets/messages/types/NetSetConVar.go b/packets/messages/types/NetSetConVar.go
new file mode 100644
index 0000000..b502953
--- /dev/null
+++ b/packets/messages/types/NetSetConVar.go
@@ -0,0 +1,28 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetSetConVar struct {
6 Length uint8
7 ConVars []ConVar
8}
9
10type ConVar struct {
11 Name string
12 Value string
13}
14
15func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar {
16 var convars []ConVar
17 netsetconvar := NetSetConVar{
18 Length: reader.TryReadInt8(),
19 }
20 for i := 0; i < int(netsetconvar.Length); i++ {
21 convars = append(convars, ConVar{
22 Name: reader.TryReadString(),
23 Value: reader.TryReadString(),
24 })
25 }
26 netsetconvar.ConVars = convars
27 return netsetconvar
28}
diff --git a/packets/messages/types/NetSignOnState.go b/packets/messages/types/NetSignOnState.go
new file mode 100644
index 0000000..3d02e91
--- /dev/null
+++ b/packets/messages/types/NetSignOnState.go
@@ -0,0 +1,31 @@
1package types
2
3import (
4 "fmt"
5
6 "github.com/pektezol/bitreader"
7)
8
9type NetSignOnState struct {
10 SignonState int8
11 SpawnCount uint32
12 NumServerPlayers uint32
13 IdsLength uint32
14 PlayersNetworkIds []byte
15 MapNameLength uint32
16 MapName string
17}
18
19func ParseNetSignOnState(reader *bitreader.ReaderType) NetSignOnState {
20 netsignonstate := NetSignOnState{
21 SignonState: int8(reader.TryReadInt8()),
22 SpawnCount: reader.TryReadInt32(),
23 NumServerPlayers: reader.TryReadInt32(),
24 IdsLength: reader.TryReadInt32(),
25 }
26 fmt.Println(netsignonstate.IdsLength)
27 netsignonstate.PlayersNetworkIds = reader.TryReadBytesToSlice(int(netsignonstate.IdsLength))
28 netsignonstate.MapNameLength = reader.TryReadInt32()
29 netsignonstate.MapName = reader.TryReadStringLen(int(netsignonstate.MapNameLength))
30 return netsignonstate
31}
diff --git a/packets/messages/types/NetSplitScreenUser.go b/packets/messages/types/NetSplitScreenUser.go
new file mode 100644
index 0000000..66a7c85
--- /dev/null
+++ b/packets/messages/types/NetSplitScreenUser.go
@@ -0,0 +1,13 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetSplitScreenUser struct {
6 Unknown bool
7}
8
9func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser {
10 return NetSplitScreenUser{
11 Unknown: reader.TryReadBool(),
12 }
13}
diff --git a/packets/messages/types/NetStringCmd.go b/packets/messages/types/NetStringCmd.go
new file mode 100644
index 0000000..1ee9f67
--- /dev/null
+++ b/packets/messages/types/NetStringCmd.go
@@ -0,0 +1,13 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetStringCmd struct {
6 Command string
7}
8
9func ParseNetStringCmd(reader *bitreader.ReaderType) NetStringCmd {
10 return NetStringCmd{
11 Command: reader.TryReadString(),
12 }
13}
diff --git a/packets/messages/types/NetTick.go b/packets/messages/types/NetTick.go
new file mode 100644
index 0000000..9dae14b
--- /dev/null
+++ b/packets/messages/types/NetTick.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type NetTick struct {
6 Tick uint32
7 HostFrameTime float32
8 HostFrameTimeStdDeviation float32
9}
10
11func ParseNetTick(reader *bitreader.ReaderType) NetTick {
12 return NetTick{
13 Tick: reader.TryReadInt32(),
14 HostFrameTime: float32(reader.TryReadInt16()) / 1e5,
15 HostFrameTimeStdDeviation: float32(reader.TryReadInt16()) / 1e5,
16 }
17}
diff --git a/packets/messages/types/SvcClassInfo.go b/packets/messages/types/SvcClassInfo.go
new file mode 100644
index 0000000..58e43b7
--- /dev/null
+++ b/packets/messages/types/SvcClassInfo.go
@@ -0,0 +1,42 @@
1package types
2
3import (
4 "math"
5
6 "github.com/pektezol/bitreader"
7)
8
9type SvcClassInfo struct {
10 Length uint16
11 CreateOnClient bool
12 ServerClasses []ServerClass
13}
14
15type ServerClass struct {
16 ClassId int32
17 ClassName string
18 DataTableName string
19}
20
21func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo {
22 var serverclasses []ServerClass
23 svcclassinfo := SvcClassInfo{
24 Length: reader.TryReadInt16(),
25 CreateOnClient: reader.TryReadBool(),
26 }
27 if svcclassinfo.CreateOnClient {
28 for i := 0; i < int(svcclassinfo.Length); i++ {
29 id, err := reader.ReadBits(int(math.Log2(float64(svcclassinfo.Length))) + 1)
30 if err != nil {
31 panic(err)
32 }
33 serverclasses = append(serverclasses, ServerClass{
34 ClassId: int32(id),
35 ClassName: reader.TryReadString(),
36 DataTableName: reader.TryReadString(),
37 })
38 }
39 }
40 svcclassinfo.ServerClasses = serverclasses
41 return svcclassinfo
42}
diff --git a/packets/messages/types/SvcSendTable.go b/packets/messages/types/SvcSendTable.go
new file mode 100644
index 0000000..f76aadb
--- /dev/null
+++ b/packets/messages/types/SvcSendTable.go
@@ -0,0 +1,17 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcSendTable struct {
6 NeedsDecoder bool
7 Length uint8
8 Props int32
9}
10
11func ParseSvcSendTable(reader *bitreader.ReaderType) SvcSendTable {
12 return SvcSendTable{
13 NeedsDecoder: reader.TryReadBool(),
14 Length: reader.TryReadInt8(),
15 }
16 // No one cares about SvcSendTable
17}
diff --git a/packets/messages/types/SvcServerInfo.go b/packets/messages/types/SvcServerInfo.go
new file mode 100644
index 0000000..9d2648b
--- /dev/null
+++ b/packets/messages/types/SvcServerInfo.go
@@ -0,0 +1,43 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcServerInfo struct {
6 Protocol uint16
7 ServerCount uint32
8 IsHltv bool
9 IsDedicated bool
10 ClientCrc int32
11 MaxClasses uint16
12 MapCrc uint32
13 PlayerSlot uint8
14 MaxClients uint8
15 Unk uint32
16 TickInterval float32
17 COs byte
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: reader.TryReadInt16(),
27 ServerCount: reader.TryReadInt32(),
28 IsHltv: reader.TryReadBool(),
29 IsDedicated: reader.TryReadBool(),
30 ClientCrc: int32(reader.TryReadInt32()),
31 MaxClasses: reader.TryReadInt16(),
32 MapCrc: reader.TryReadInt32(),
33 PlayerSlot: reader.TryReadInt8(),
34 MaxClients: reader.TryReadInt8(),
35 Unk: reader.TryReadInt32(),
36 TickInterval: reader.TryReadFloat32(),
37 COs: reader.TryReadInt8(),
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/packets/messages/types/SvcSetPause.go
new file mode 100644
index 0000000..040fb6a
--- /dev/null
+++ b/packets/messages/types/SvcSetPause.go
@@ -0,0 +1,11 @@
1package types
2
3import "github.com/pektezol/bitreader"
4
5type SvcSetPause struct {
6 Paused bool
7}
8
9func ParseSvcSetPause(reader *bitreader.ReaderType) SvcSetPause {
10 return SvcSetPause{Paused: reader.TryReadBool()}
11}
diff --git a/packets/message.go b/packets/packet.go
index 922f918..23a21e6 100644
--- a/packets/message.go
+++ b/packets/packet.go
@@ -5,11 +5,12 @@ import (
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/packets/classes" 7 "github.com/pektezol/demoparser/packets/classes"
8 "github.com/pektezol/demoparser/packets/messages"
8) 9)
9 10
10const MSSC = 2 11const MSSC = 2
11 12
12func ParseMessage(reader *bitreader.ReaderType) (status int) { 13func ParsePacket(reader *bitreader.ReaderType) (status int) {
13 messageType := reader.TryReadInt8() 14 messageType := reader.TryReadInt8()
14 messageTick := reader.TryReadInt32() 15 messageTick := reader.TryReadInt32()
15 messageSlot := reader.TryReadInt8() 16 messageSlot := reader.TryReadInt8()
@@ -31,8 +32,8 @@ func ParseMessage(reader *bitreader.ReaderType) (status int) {
31 OutSequence: int32(reader.TryReadInt32()), 32 OutSequence: int32(reader.TryReadInt32()),
32 Size: int32(reader.TryReadInt32()), 33 Size: int32(reader.TryReadInt32()),
33 } 34 }
34 reader.SkipBytes(int(packet.Size)) 35 packet.Data = messages.ParseMessage(reader.TryReadBytesToSlice(int(packet.Size)))
35 //fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet) 36 fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet)
36 return 2 37 return 2
37 case 0x03: 38 case 0x03:
38 syncTick := SyncTick{} 39 syncTick := SyncTick{}
diff --git a/packets/types.go b/packets/types.go
index 2a4cf4b..9a1f667 100644
--- a/packets/types.go
+++ b/packets/types.go
@@ -1,6 +1,9 @@
1package packets 1package packets
2 2
3import "github.com/pektezol/demoparser/packets/classes" 3import (
4 "github.com/pektezol/demoparser/packets/classes"
5 "github.com/pektezol/demoparser/packets/messages"
6)
4 7
5type Header struct { 8type Header struct {
6 DemoFileStamp string 9 DemoFileStamp string
@@ -21,7 +24,7 @@ type SignOn struct {
21 InSequence int32 24 InSequence int32
22 OutSequence int32 25 OutSequence int32
23 Size int32 26 Size int32
24 Data []byte 27 Data []messages.Message
25} 28}
26 29
27type Packet struct { 30type Packet struct {
@@ -29,7 +32,7 @@ type Packet struct {
29 InSequence int32 32 InSequence int32
30 OutSequence int32 33 OutSequence int32
31 Size int32 34 Size int32
32 Data []byte 35 Data []messages.Message
33} 36}
34 37
35type SyncTick struct{} 38type SyncTick struct{}