aboutsummaryrefslogtreecommitdiff
path: root/pkg/packets
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-16 20:39:02 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-16 21:39:43 +0300
commit81f365e99636104ff81151370048a51e8ae8027a (patch)
tree0bd2781ad73fdc982abdcb70f9f44c551ac76bcf /pkg/packets
parentupdate CI workflow for go 1.21.0 (diff)
downloadsdp.go-81f365e99636104ff81151370048a51e8ae8027a.tar.gz
sdp.go-81f365e99636104ff81151370048a51e8ae8027a.tar.bz2
sdp.go-81f365e99636104ff81151370048a51e8ae8027a.zip
feat: parsing sar custom data (#4)
Diffstat (limited to 'pkg/packets')
-rw-r--r--pkg/packets/headers.go20
-rw-r--r--pkg/packets/packets.go57
2 files changed, 42 insertions, 35 deletions
diff --git a/pkg/packets/headers.go b/pkg/packets/headers.go
index 543476b..dbeab87 100644
--- a/pkg/packets/headers.go
+++ b/pkg/packets/headers.go
@@ -20,19 +20,19 @@ type Headers struct {
20 SignOnLength int32 20 SignOnLength int32
21} 21}
22 22
23func ParseHeaders(reader *bitreader.ReaderType) Headers { 23func ParseHeaders(reader *bitreader.Reader) Headers {
24 headers := Headers{ 24 headers := Headers{
25 DemoFileStamp: reader.TryReadString(), 25 DemoFileStamp: reader.TryReadString(),
26 DemoProtocol: int32(reader.TryReadInt32()), 26 DemoProtocol: int32(reader.TryReadSInt32()),
27 NetworkProtocol: int32(reader.TryReadInt32()), 27 NetworkProtocol: int32(reader.TryReadSInt32()),
28 ServerName: reader.TryReadStringLen(260), 28 ServerName: reader.TryReadStringLength(260),
29 ClientName: reader.TryReadStringLen(260), 29 ClientName: reader.TryReadStringLength(260),
30 MapName: reader.TryReadStringLen(260), 30 MapName: reader.TryReadStringLength(260),
31 GameDirectory: reader.TryReadStringLen(260), 31 GameDirectory: reader.TryReadStringLength(260),
32 PlaybackTime: reader.TryReadFloat32(), 32 PlaybackTime: reader.TryReadFloat32(),
33 PlaybackTicks: int32(reader.TryReadInt32()), 33 PlaybackTicks: int32(reader.TryReadSInt32()),
34 PlaybackFrames: int32(reader.TryReadInt32()), 34 PlaybackFrames: int32(reader.TryReadSInt32()),
35 SignOnLength: int32(reader.TryReadInt32()), 35 SignOnLength: int32(reader.TryReadSInt32()),
36 } 36 }
37 if headers.DemoFileStamp != "HL2DEMO" { 37 if headers.DemoFileStamp != "HL2DEMO" {
38 panic("invalid demo file stamp") 38 panic("invalid demo file stamp")
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
index a84da21..fd5a14b 100644
--- a/pkg/packets/packets.go
+++ b/pkg/packets/packets.go
@@ -1,8 +1,6 @@
1package packets 1package packets
2 2
3import ( 3import (
4 "bytes"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/classes" 5 "github.com/pektezol/demoparser/pkg/classes"
8 "github.com/pektezol/demoparser/pkg/messages" 6 "github.com/pektezol/demoparser/pkg/messages"
@@ -15,9 +13,9 @@ type PacketMessageInfo struct {
15 Data any 13 Data any
16} 14}
17 15
18const MSSC = 2 16const MSSC int = 2
19 17
20func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo { 18func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
21 packetType := reader.TryReadBits(8) 19 packetType := reader.TryReadBits(8)
22 tickNumber := reader.TryReadBits(32) 20 tickNumber := reader.TryReadBits(32)
23 slotNumber := reader.TryReadBits(8) 21 slotNumber := reader.TryReadBits(8)
@@ -30,9 +28,9 @@ func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
30 } 28 }
31 signOn.InSequence = int32(reader.TryReadBits(32)) 29 signOn.InSequence = int32(reader.TryReadBits(32))
32 signOn.OutSequence = int32(reader.TryReadBits(32)) 30 signOn.OutSequence = int32(reader.TryReadBits(32))
33 signOn.Size = int32(reader.TryReadInt32()) 31 signOn.Size = int32(reader.TryReadSInt32())
34 data := reader.TryReadBytesToSlice(int(signOn.Size)) 32 data := reader.TryReadBytesToSlice(uint64(signOn.Size))
35 packetReader := bitreader.Reader(bytes.NewReader(data), true) 33 packetReader := bitreader.NewReaderFromBytes(data, true)
36 for { 34 for {
37 messageType, err := packetReader.ReadBits(6) 35 messageType, err := packetReader.ReadBits(6)
38 if err != nil { 36 if err != nil {
@@ -48,9 +46,9 @@ func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
48 } 46 }
49 packet.InSequence = int32(reader.TryReadBits(32)) 47 packet.InSequence = int32(reader.TryReadBits(32))
50 packet.OutSequence = int32(reader.TryReadBits(32)) 48 packet.OutSequence = int32(reader.TryReadBits(32))
51 packet.Size = int32(reader.TryReadInt32()) 49 packet.Size = int32(reader.TryReadSInt32())
52 data := reader.TryReadBytesToSlice(int(packet.Size)) 50 data := reader.TryReadBytesToSlice(uint64(packet.Size))
53 packetReader := bitreader.Reader(bytes.NewReader(data), true) 51 packetReader := bitreader.NewReaderFromBytes(data, true)
54 for { 52 for {
55 messageType, err := packetReader.ReadBits(6) 53 messageType, err := packetReader.ReadBits(6)
56 if err != nil { 54 if err != nil {
@@ -63,24 +61,24 @@ func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
63 syncTick := SyncTick{} 61 syncTick := SyncTick{}
64 packetData = syncTick 62 packetData = syncTick
65 case 4: // ConsoleCmd 63 case 4: // ConsoleCmd
66 size := reader.TryReadInt32() 64 size := reader.TryReadSInt32()
67 consoleCmd := ConsoleCmd{ 65 consoleCmd := ConsoleCmd{
68 Size: int32(size), 66 Size: int32(size),
69 Data: reader.TryReadStringLen(int(size)), 67 Data: reader.TryReadStringLength(uint64(size)),
70 } 68 }
71 packetData = consoleCmd 69 packetData = consoleCmd
72 case 5: // UserCmd 70 case 5: // UserCmd
73 userCmd := UserCmd{} 71 userCmd := UserCmd{}
74 userCmd.Cmd = int32(reader.TryReadInt32()) 72 userCmd.Cmd = int32(reader.TryReadSInt32())
75 userCmd.Size = int32(reader.TryReadInt32()) 73 userCmd.Size = int32(reader.TryReadSInt32())
76 data := reader.TryReadBytesToSlice(int(userCmd.Size)) 74 data := reader.TryReadBytesToSlice(uint64(userCmd.Size))
77 userCmd.Data = classes.ParseUserCmdInfo(data) 75 userCmd.Data = classes.ParseUserCmdInfo(data)
78 packetData = userCmd 76 packetData = userCmd
79 case 6: // DataTables 77 case 6: // DataTables
80 dataTables := DataTables{} 78 dataTables := DataTables{}
81 dataTables.Size = int32(reader.TryReadInt32()) 79 dataTables.Size = int32(reader.TryReadSInt32())
82 data := reader.TryReadBytesToSlice(int(dataTables.Size)) 80 data := reader.TryReadBytesToSlice(uint64(dataTables.Size))
83 dataTableReader := bitreader.Reader(bytes.NewReader(data), true) 81 dataTableReader := bitreader.NewReaderFromBytes(data, true)
84 count := 0 82 count := 0
85 for dataTableReader.TryReadBool() { 83 for dataTableReader.TryReadBool() {
86 count++ 84 count++
@@ -94,8 +92,7 @@ func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
94 case 7: // Stop 92 case 7: // Stop
95 stop := Stop{} 93 stop := Stop{}
96 if reader.TryReadBool() { 94 if reader.TryReadBool() {
97 // read remaining data 95 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits()))
98 stop.RemainingData = []byte{}
99 } 96 }
100 packetData = stop 97 packetData = stop
101 case 8: // CustomData 98 case 8: // CustomData
@@ -103,14 +100,24 @@ func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
103 Unknown: int32(reader.TryReadBits(32)), 100 Unknown: int32(reader.TryReadBits(32)),
104 Size: int32(reader.TryReadBits(32)), 101 Size: int32(reader.TryReadBits(32)),
105 } 102 }
106 customData.Data = string(reader.TryReadBytesToSlice(int(customData.Size))) 103 if customData.Unknown != 0 || customData.Size == 8 {
107 packetData = customData 104 // Not SAR data
105 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size)))
106 packetData = customData
107 break
108 }
109 // SAR data
110 sarData := classes.SarData{}
111 data := reader.TryReadBytesToSlice(uint64(customData.Size))
112 sarReader := bitreader.NewReaderFromBytes(data, true)
113 sarData.ParseSarData(sarReader)
114 packetData = sarData
108 case 9: // StringTables 115 case 9: // StringTables
109 stringTables := StringTables{ 116 stringTables := StringTables{
110 Size: int32(reader.TryReadInt32()), 117 Size: int32(reader.TryReadSInt32()),
111 } 118 }
112 data := reader.TryReadBytesToSlice(int(stringTables.Size)) 119 data := reader.TryReadBytesToSlice(uint64(stringTables.Size))
113 stringTableReader := bitreader.Reader(bytes.NewReader(data), true) 120 stringTableReader := bitreader.NewReaderFromBytes(data, true)
114 stringTables.Data = classes.ParseStringTables(stringTableReader) 121 stringTables.Data = classes.ParseStringTables(stringTableReader)
115 packetData = stringTables 122 packetData = stringTables
116 default: // invalid 123 default: // invalid