aboutsummaryrefslogtreecommitdiff
path: root/pkg/packets
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/packets')
-rw-r--r--pkg/packets/packets.go125
-rw-r--r--pkg/packets/types.go53
2 files changed, 21 insertions, 157 deletions
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
index 33350d5..b1d6a40 100644
--- a/pkg/packets/packets.go
+++ b/pkg/packets/packets.go
@@ -3,7 +3,6 @@ package packets
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/classes" 5 "github.com/pektezol/demoparser/pkg/classes"
6 "github.com/pektezol/demoparser/pkg/messages"
7 "github.com/pektezol/demoparser/pkg/writer" 6 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
@@ -11,130 +10,49 @@ type PacketMessageInfo struct {
11 PacketType uint8 10 PacketType uint8
12 TickNumber int32 11 TickNumber int32
13 SlotNumber uint8 12 SlotNumber uint8
14 Data any
15} 13}
16 14
17const MSSC int = 2
18
19func ParsePackets(reader *bitreader.Reader) PacketMessageInfo { 15func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
20 packetType := reader.TryReadUInt8() 16 packetType := reader.TryReadUInt8()
21 tickNumber := reader.TryReadSInt32() 17 tickNumber := reader.TryReadSInt32()
22 slotNumber := reader.TryReadUInt8() 18 slotNumber := reader.TryReadUInt8()
23 var packetData any
24 switch packetType { 19 switch packetType {
25 case 1: // SignOn 20 case 1: // SignOn
26 signOn := SignOn{}
27 writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType) 21 writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType)
28 for count := 0; count < MSSC; count++ { 22 signOn := classes.SignOn{}
29 signOn.PacketInfo = append(signOn.PacketInfo, classes.ParseCmdInfo(reader)) 23 signOn.ParseSignOn(reader)
30 }
31 signOn.InSequence = int32(reader.TryReadBits(32))
32 signOn.OutSequence = int32(reader.TryReadBits(32))
33 signOn.Size = int32(reader.TryReadSInt32())
34 data := reader.TryReadBytesToSlice(uint64(signOn.Size))
35 packetReader := bitreader.NewReaderFromBytes(data, true)
36 for {
37 messageType, err := packetReader.ReadBits(6)
38 if err != nil {
39 break
40 }
41 signOn.Data = append(signOn.Data, messages.ParseMessages(int(messageType), packetReader))
42 }
43 packetData = signOn
44 case 2: // Packet 24 case 2: // Packet
45 packet := Packet{}
46 writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType) 25 writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType)
47 for count := 0; count < MSSC; count++ { 26 packet := classes.Packet{}
48 packet.PacketInfo = append(packet.PacketInfo, classes.ParseCmdInfo(reader)) 27 packet.ParsePacket(reader)
49 }
50 packet.InSequence = int32(reader.TryReadBits(32))
51 packet.OutSequence = int32(reader.TryReadBits(32))
52 packet.Size = int32(reader.TryReadSInt32())
53 data := reader.TryReadBytesToSlice(uint64(packet.Size))
54 packetReader := bitreader.NewReaderFromBytes(data, true)
55 for {
56 messageType, err := packetReader.ReadBits(6)
57 if err != nil {
58 break
59 }
60 packet.Data = append(packet.Data, messages.ParseMessages(int(messageType), packetReader))
61 }
62 packetData = packet
63 case 3: // SyncTick 28 case 3: // SyncTick
64 syncTick := SyncTick{}
65 writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType) 29 writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType)
66 packetData = syncTick 30 syncTick := classes.SyncTick{}
31 syncTick.ParseSyncTick()
67 case 4: // ConsoleCmd 32 case 4: // ConsoleCmd
68 consoleCmd := ConsoleCmd{}
69 writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType) 33 writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType)
70 consoleCmd.Size = reader.TryReadSInt32() 34 consoleCmd := classes.ConsoleCmd{}
71 consoleCmd.Data = reader.TryReadStringLength(uint64(consoleCmd.Size)) 35 consoleCmd.ParseConsoleCmd(reader)
72 writer.AppendLine("\t%s", consoleCmd.Data) 36 case 5: // UserCmd
73 packetData = consoleCmd
74 case 5: // UserCmd TODO: usercmdinfo refactor
75 userCmd := UserCmd{}
76 writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType) 37 writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType)
77 userCmd.Cmd = int32(reader.TryReadSInt32()) 38 userCmd := classes.UserCmd{}
78 userCmd.Size = int32(reader.TryReadSInt32()) 39 userCmd.ParseUserCmd(reader)
79 data := reader.TryReadBytesToSlice(uint64(userCmd.Size)) 40 case 6: // DataTables
80 userCmd.Data = classes.ParseUserCmdInfo(data)
81 packetData = userCmd
82 case 6: // DataTables TODO: prop stuff
83 dataTables := DataTables{}
84 writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType) 41 writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType)
85 dataTables.Size = int32(reader.TryReadSInt32()) 42 dataTables := classes.DataTables{}
86 data := reader.TryReadBytesToSlice(uint64(dataTables.Size)) 43 dataTables.ParseDataTables(reader)
87 dataTableReader := bitreader.NewReaderFromBytes(data, true)
88 count := 0
89 for dataTableReader.TryReadBool() {
90 count++
91 dataTables.SendTable = append(dataTables.SendTable, classes.ParseSendTable(dataTableReader))
92 }
93 writer.AppendLine("\t%d Send Tables:", count)
94 writer.AppendOutputFromTemp()
95 numOfClasses := dataTableReader.TryReadBits(16)
96 for count = 0; count < int(numOfClasses); count++ {
97 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, classes.ParseServerClassInfo(dataTableReader, count, int(numOfClasses)))
98 }
99 writer.AppendLine("\t%d Classes:", count)
100 writer.AppendOutputFromTemp()
101 packetData = dataTables
102 case 7: // Stop 44 case 7: // Stop
103 stop := Stop{}
104 writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType) 45 writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType)
105 if reader.TryReadBool() { 46 stop := classes.Stop{}
106 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits())) 47 stop.ParseStop(reader)
107 writer.AppendLine("\tRemaining Data: %v", stop.RemainingData)
108 }
109 packetData = stop
110 case 8: // CustomData TODO: not sar data 48 case 8: // CustomData TODO: not sar data
111 customData := CustomData{} 49 customData := classes.CustomData{}
112 customData.Type = reader.TryReadSInt32() 50 customData.ParseCustomData(reader, tickNumber, packetType)
113 customData.Size = reader.TryReadSInt32()
114 if customData.Type != 0 || customData.Size == 8 {
115 // Not SAR data
116 writer.AppendLine("[%d] %s (%d):", tickNumber, "CUSTOMDATA", packetType)
117 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size)))
118 writer.AppendLine("\t%s", customData.Data)
119 packetData = customData
120 break
121 }
122 // SAR data
123 sarData := classes.SarData{}
124 writer.AppendLine("[%d] %s (%d):", tickNumber, "SARDATA", packetType)
125 data := reader.TryReadBytesToSlice(uint64(customData.Size))
126 sarReader := bitreader.NewReaderFromBytes(data, true)
127 sarData.ParseSarData(sarReader)
128 packetData = sarData
129 case 9: // StringTables TODO: parsing string table data 51 case 9: // StringTables TODO: parsing string table data
130 stringTables := StringTables{}
131 writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType) 52 writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType)
132 stringTables.Size = reader.TryReadSInt32() 53 stringTables := classes.StringTables{}
133 data := reader.TryReadBytesToSlice(uint64(stringTables.Size)) 54 stringTables.ParseStringTables(reader)
134 stringTableReader := bitreader.NewReaderFromBytes(data, true) 55 default: // Invalid
135 stringTables.Data = classes.ParseStringTables(stringTableReader)
136 packetData = stringTables
137 default: // invalid
138 writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType) 56 writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType)
139 panic("invalid packet type") 57 panic("invalid packet type")
140 } 58 }
@@ -142,6 +60,5 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
142 PacketType: packetType, 60 PacketType: packetType,
143 TickNumber: tickNumber, 61 TickNumber: tickNumber,
144 SlotNumber: slotNumber, 62 SlotNumber: slotNumber,
145 Data: packetData,
146 } 63 }
147} 64}
diff --git a/pkg/packets/types.go b/pkg/packets/types.go
deleted file mode 100644
index a2fb78f..0000000
--- a/pkg/packets/types.go
+++ /dev/null
@@ -1,53 +0,0 @@
1package packets
2
3import "github.com/pektezol/demoparser/pkg/classes"
4
5type SignOn struct {
6 PacketInfo []classes.CmdInfo
7 InSequence int32
8 OutSequence int32
9 Size int32
10 Data []any
11}
12
13type Packet struct {
14 PacketInfo []classes.CmdInfo
15 InSequence int32
16 OutSequence int32
17 Size int32
18 Data []any
19}
20
21type SyncTick struct{}
22
23type ConsoleCmd struct {
24 Size int32
25 Data string
26}
27
28type UserCmd struct {
29 Cmd int32
30 Size int32
31 Data classes.UserCmdInfo
32}
33
34type DataTables struct {
35 Size int32
36 SendTable []classes.SendTable
37 ServerClassInfo []classes.ServerClassInfo
38}
39
40type Stop struct {
41 RemainingData []byte
42}
43
44type CustomData struct {
45 Type int32
46 Size int32
47 Data string
48}
49
50type StringTables struct {
51 Size int32
52 Data []classes.StringTable
53}