diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-16 20:39:02 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-16 21:39:43 +0300 |
| commit | 81f365e99636104ff81151370048a51e8ae8027a (patch) | |
| tree | 0bd2781ad73fdc982abdcb70f9f44c551ac76bcf /pkg/packets | |
| parent | update CI workflow for go 1.21.0 (diff) | |
| download | sdp.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.go | 20 | ||||
| -rw-r--r-- | pkg/packets/packets.go | 57 |
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 | ||
| 23 | func ParseHeaders(reader *bitreader.ReaderType) Headers { | 23 | func 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 @@ | |||
| 1 | package packets | 1 | package packets |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 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 | ||
| 18 | const MSSC = 2 | 16 | const MSSC int = 2 |
| 19 | 17 | ||
| 20 | func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo { | 18 | func 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 |