aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/classes/cmdInfo.go12
-rw-r--r--pkg/classes/sarData.go110
-rw-r--r--pkg/classes/sendTable.go174
-rw-r--r--pkg/classes/serverClassInfo.go5
-rw-r--r--pkg/classes/stringTable.go15
-rw-r--r--pkg/classes/userCmdInfo.go15
-rw-r--r--pkg/messages/messages.go5
-rw-r--r--pkg/messages/types/netDisconnect.go9
-rw-r--r--pkg/messages/types/netFile.go7
-rw-r--r--pkg/messages/types/netNop.go6
-rw-r--r--pkg/messages/types/netSetConVar.go7
-rw-r--r--pkg/messages/types/netSignOnState.go6
-rw-r--r--pkg/messages/types/netSplitScreenUser.go13
-rw-r--r--pkg/messages/types/netStringCmd.go11
-rw-r--r--pkg/messages/types/netTick.go11
-rw-r--r--pkg/messages/types/svcBspDecal.go6
-rw-r--r--pkg/messages/types/svcClassInfo.go6
-rw-r--r--pkg/messages/types/svcCmdKeyValues.go6
-rw-r--r--pkg/messages/types/svcCreateStringTable.go8
-rw-r--r--pkg/messages/types/svcCrosshairAngle.go11
-rw-r--r--pkg/messages/types/svcEntityMessage.go8
-rw-r--r--pkg/messages/types/svcFixAngle.go12
-rw-r--r--pkg/messages/types/svcGameEvent.go6
-rw-r--r--pkg/messages/types/svcGameEventList.go6
-rw-r--r--pkg/messages/types/svcGetCvarValue.go7
-rw-r--r--pkg/messages/types/svcMenu.go7
-rw-r--r--pkg/messages/types/svcPacketEntities.go8
-rw-r--r--pkg/messages/types/svcPaintmapData.go6
-rw-r--r--pkg/messages/types/svcPrefetch.go9
-rw-r--r--pkg/messages/types/svcPrint.go12
-rw-r--r--pkg/messages/types/svcSendTable.go8
-rw-r--r--pkg/messages/types/svcServerInfo.go24
-rw-r--r--pkg/messages/types/svcSetPause.go9
-rw-r--r--pkg/messages/types/svcSetView.go9
-rw-r--r--pkg/messages/types/svcSounds.go8
-rw-r--r--pkg/messages/types/svcSplitScreen.go7
-rw-r--r--pkg/messages/types/svcTempEntities.go7
-rw-r--r--pkg/messages/types/svcUpdateStringTable.go7
-rw-r--r--pkg/messages/types/svcUserMessage.go7
-rw-r--r--pkg/messages/types/svcVoiceData.go8
-rw-r--r--pkg/messages/types/svcVoiceInit.go8
-rw-r--r--pkg/packets/headers.go5
-rw-r--r--pkg/packets/packets.go43
-rw-r--r--pkg/packets/types.go6
-rw-r--r--pkg/writer/writer.go47
45 files changed, 585 insertions, 142 deletions
diff --git a/pkg/classes/cmdInfo.go b/pkg/classes/cmdInfo.go
index 545d14b..eccfe99 100644
--- a/pkg/classes/cmdInfo.go
+++ b/pkg/classes/cmdInfo.go
@@ -4,6 +4,7 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type CmdInfo struct { 10type CmdInfo struct {
@@ -41,7 +42,7 @@ func (cmdInfoFlags CmdInfoFlags) String() string {
41} 42}
42 43
43func ParseCmdInfo(reader *bitreader.Reader) CmdInfo { 44func ParseCmdInfo(reader *bitreader.Reader) CmdInfo {
44 return CmdInfo{ 45 cmdInfo := CmdInfo{
45 Flags: CmdInfoFlags(reader.TryReadUInt32()).String(), 46 Flags: CmdInfoFlags(reader.TryReadUInt32()).String(),
46 ViewOrigin: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 47 ViewOrigin: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
47 ViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 48 ViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
@@ -50,4 +51,13 @@ func ParseCmdInfo(reader *bitreader.Reader) CmdInfo {
50 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 51 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
51 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 52 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
52 } 53 }
54 writer.AppendLine("\tFlags: %s", cmdInfo.Flags)
55 writer.AppendLine("\tView Origin: %v", cmdInfo.ViewOrigin)
56 writer.AppendLine("\tView Angles: %v", cmdInfo.ViewAngles)
57 writer.AppendLine("\tLocal View Angles: %v", cmdInfo.LocalViewAngles)
58 writer.AppendLine("\tView Origin 2: %v", cmdInfo.ViewOrigin2)
59 writer.AppendLine("\tView Angles 2: %v", cmdInfo.ViewAngles2)
60 writer.AppendLine("\tLocal View Angles 2: %v", cmdInfo.LocalViewAngles2)
61 writer.AppendLine("")
62 return cmdInfo
53} 63}
diff --git a/pkg/classes/sarData.go b/pkg/classes/sarData.go
index 35163c3..27e8a64 100644
--- a/pkg/classes/sarData.go
+++ b/pkg/classes/sarData.go
@@ -5,6 +5,7 @@ import (
5 "fmt" 5 "fmt"
6 6
7 "github.com/pektezol/bitreader" 7 "github.com/pektezol/bitreader"
8 "github.com/pektezol/demoparser/pkg/writer"
8) 9)
9 10
10type SarDataType uint8 11type SarDataType uint8
@@ -137,12 +138,12 @@ type SarDataSpeedrunTimeSplits struct {
137} 138}
138 139
139type SarDataTimestamp struct { 140type SarDataTimestamp struct {
140 Year uint16 141 Year uint16
141 Mon uint8 142 Month uint8
142 Day uint8 143 Day uint8
143 Hour uint8 144 Hour uint8
144 Min uint8 145 Minute uint8
145 Sec uint8 146 Second uint8
146} 147}
147 148
148type SarDataFileChecksum struct { 149type SarDataFileChecksum struct {
@@ -163,6 +164,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
163 len = 9 164 len = 9
164 } 165 }
165 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true) 166 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true)
167 writer.AppendLine("\tMessage: %s (%d):", sarData.Type.String(), sarData.Type)
166 switch sarData.Type { 168 switch sarData.Type {
167 case ESarDataTimescaleCheat: 169 case ESarDataTimescaleCheat:
168 sarData.Data, err = parseTimescaleCheatData(dataReader, len) 170 sarData.Data, err = parseTimescaleCheatData(dataReader, len)
@@ -173,6 +175,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
173 sarData.Data = parseInitialCVarData(dataReader) 175 sarData.Data = parseInitialCVarData(dataReader)
174 case ESarDataEntityInputSlot: 176 case ESarDataEntityInputSlot:
175 sarData.Slot = int(dataReader.TryReadBytes(1)) 177 sarData.Slot = int(dataReader.TryReadBytes(1))
178 writer.AppendLine("\t\tSlot: %d", sarData.Slot)
176 case ESarDataEntityInput: 179 case ESarDataEntityInput:
177 sarData.Data = parseEntityInputData(dataReader) 180 sarData.Data = parseEntityInputData(dataReader)
178 case ESarDataChecksum: 181 case ESarDataChecksum:
@@ -198,6 +201,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
198 if err != nil { 201 if err != nil {
199 sarData.Data = nil 202 sarData.Data = nil
200 } 203 }
204 writer.AppendLine("\t\tSlot: %d", sarData.Slot)
201 case ESarDataPause: 205 case ESarDataPause:
202 sarData.Data, err = parsePauseData(dataReader, len) 206 sarData.Data, err = parsePauseData(dataReader, len)
203 if err != nil { 207 if err != nil {
@@ -239,45 +243,60 @@ func parseTimescaleCheatData(reader *bitreader.Reader, length uint64) (SarDataTi
239 if length != 5 { 243 if length != 5 {
240 return SarDataTimescaleCheat{}, errors.New("sar data invalid") 244 return SarDataTimescaleCheat{}, errors.New("sar data invalid")
241 } 245 }
242 return SarDataTimescaleCheat{ 246 sarDataTimescaleCheat := SarDataTimescaleCheat{
243 Timescale: reader.TryReadFloat32(), 247 Timescale: reader.TryReadFloat32(),
244 }, nil 248 }
249 writer.AppendLine("\t\tTimescale: %f", sarDataTimescaleCheat.Timescale)
250 return sarDataTimescaleCheat, nil
245} 251}
246 252
247func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar { 253func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar {
248 return SarDataInitialCVar{ 254 sarDataInitialCvar := SarDataInitialCVar{
249 CVar: reader.TryReadString(), 255 CVar: reader.TryReadString(),
250 Val: reader.TryReadString(), 256 Val: reader.TryReadString(),
251 } 257 }
258 writer.AppendLine("\t\tCvar: \"%s\" = \"%s\"", sarDataInitialCvar.CVar, sarDataInitialCvar.Val)
259 return sarDataInitialCvar
252} 260}
253 261
254func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput { 262func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput {
255 return SarDataEntityInput{ 263 sarDataEntityInput := SarDataEntityInput{
256 TargetName: reader.TryReadString(), 264 TargetName: reader.TryReadString(),
257 ClassName: reader.TryReadString(), 265 ClassName: reader.TryReadString(),
258 InputName: reader.TryReadString(), 266 InputName: reader.TryReadString(),
259 Parameter: reader.TryReadString(), 267 Parameter: reader.TryReadString(),
260 } 268 }
269 writer.AppendLine("\t\tTarget: %s", sarDataEntityInput.TargetName)
270 writer.AppendLine("\t\tClass: %s", sarDataEntityInput.ClassName)
271 writer.AppendLine("\t\tInput: %s", sarDataEntityInput.InputName)
272 writer.AppendLine("\t\tParameter: %s", sarDataEntityInput.Parameter)
273 return sarDataEntityInput
261} 274}
262 275
263func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum, error) { 276func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum, error) {
264 if length != 9 { 277 if length != 9 {
265 return SarDataChecksum{}, errors.New("sar data invalid") 278 return SarDataChecksum{}, errors.New("sar data invalid")
266 } 279 }
267 return SarDataChecksum{ 280 sarDataChecksum := SarDataChecksum{
268 DemoSum: reader.TryReadUInt32(), 281 DemoSum: reader.TryReadUInt32(),
269 SarSum: reader.TryReadUInt32(), 282 SarSum: reader.TryReadUInt32(),
270 }, nil 283 }
284 writer.AppendLine("\t\tDemo Checksum: %d", sarDataChecksum.DemoSum)
285 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksum.SarSum)
286 return sarDataChecksum, nil
271} 287}
272 288
273func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecksumV2, error) { 289func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecksumV2, error) {
274 if length != 69 { 290 if length != 69 {
275 return SarDataChecksumV2{}, errors.New("sar data invalid") 291 return SarDataChecksumV2{}, errors.New("sar data invalid")
276 } 292 }
277 return SarDataChecksumV2{ 293 sarDataChecksumV2 := SarDataChecksumV2{
278 SarSum: reader.TryReadUInt32(), 294 SarSum: reader.TryReadUInt32(),
279 Signature: [64]byte(reader.TryReadBytesToSlice(60)), 295 Signature: [64]byte(reader.TryReadBytesToSlice(60)),
280 }, nil 296 }
297 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksumV2.SarSum)
298 writer.AppendLine("\t\tSignature: %v", sarDataChecksumV2.Signature)
299 return sarDataChecksumV2, nil
281} 300}
282 301
283func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataPortalPlacement, int, error) { 302func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataPortalPlacement, int, error) {
@@ -287,12 +306,17 @@ func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataP
287 slot := int(reader.TryReadBytes(1)) 306 slot := int(reader.TryReadBytes(1))
288 orange := reader.TryReadBool() 307 orange := reader.TryReadBool()
289 reader.SkipBits(7) 308 reader.SkipBits(7)
290 return SarDataPortalPlacement{ 309 sarDataPortalPlacement := SarDataPortalPlacement{
291 Orange: orange, 310 Orange: orange,
292 X: reader.TryReadFloat32(), 311 X: reader.TryReadFloat32(),
293 Y: reader.TryReadFloat32(), 312 Y: reader.TryReadFloat32(),
294 Z: reader.TryReadFloat32(), 313 Z: reader.TryReadFloat32(),
295 }, slot, nil 314 }
315 writer.AppendLine("\t\tOrange: %t", orange)
316 writer.AppendLine("\t\tX: %f", sarDataPortalPlacement.X)
317 writer.AppendLine("\t\tY: %f", sarDataPortalPlacement.Y)
318 writer.AppendLine("\t\tZ: %f", sarDataPortalPlacement.Z)
319 return sarDataPortalPlacement, slot, nil
296} 320}
297 321
298func parseChallengeFlagsCrouchFlyData(reader *bitreader.Reader, length uint64) (int, error) { 322func parseChallengeFlagsCrouchFlyData(reader *bitreader.Reader, length uint64) (int, error) {
@@ -306,29 +330,37 @@ func parsePauseData(reader *bitreader.Reader, length uint64) (SarDataPause, erro
306 if length != 5 { 330 if length != 5 {
307 return SarDataPause{}, errors.New("sar data invalid") 331 return SarDataPause{}, errors.New("sar data invalid")
308 } 332 }
309 return SarDataPause{ 333 sarDataPause := SarDataPause{
310 PauseTicks: reader.TryReadUInt32(), 334 PauseTicks: reader.TryReadUInt32(),
311 }, nil 335 }
336 writer.AppendLine("\t\tPause Ticks: %d", sarDataPause.PauseTicks)
337 return sarDataPause, nil
312} 338}
313 339
314func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun, error) { 340func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun, error) {
315 if length < 6 { 341 if length < 6 {
316 return SarDataWaitRun{}, errors.New("sar data invalid") 342 return SarDataWaitRun{}, errors.New("sar data invalid")
317 } 343 }
318 return SarDataWaitRun{ 344 sarDataWaitRun := SarDataWaitRun{
319 Ticks: int(reader.TryReadUInt32()), 345 Ticks: int(reader.TryReadUInt32()),
320 Cmd: reader.TryReadString(), 346 Cmd: reader.TryReadString(),
321 }, nil 347 }
348 writer.AppendLine("\t\tTicks: %d", sarDataWaitRun.Ticks)
349 writer.AppendLine("\t\tCmd: \"%s\"", sarDataWaitRun.Cmd)
350 return sarDataWaitRun, nil
322} 351}
323 352
324func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun, error) { 353func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun, error) {
325 if length < 6 { 354 if length < 6 {
326 return SarDataHWaitRun{}, errors.New("sar data invalid") 355 return SarDataHWaitRun{}, errors.New("sar data invalid")
327 } 356 }
328 return SarDataHWaitRun{ 357 sarDataHWaitRun := SarDataHWaitRun{
329 Ticks: int(reader.TryReadUInt32()), 358 Ticks: int(reader.TryReadUInt32()),
330 Cmd: reader.TryReadString(), 359 Cmd: reader.TryReadString(),
331 }, nil 360 }
361 writer.AppendLine("\t\tTicks: %d", sarDataHWaitRun.Ticks)
362 writer.AppendLine("\t\tCmd: \"%s\"", sarDataHWaitRun.Cmd)
363 return sarDataHWaitRun, nil
332} 364}
333 365
334func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpeedrunTime, error) { 366func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpeedrunTime, error) {
@@ -340,10 +372,14 @@ func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpee
340 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ { 372 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ {
341 splits[splitCount].Name = reader.TryReadString() 373 splits[splitCount].Name = reader.TryReadString()
342 splits[splitCount].NSegs = reader.TryReadUInt32() 374 splits[splitCount].NSegs = reader.TryReadUInt32()
375 writer.AppendLine("\t\t[%d] Split Name: \"%s\"", splitCount, splits[splitCount].Name)
376 writer.AppendLine("\t\t[%d] Number of Segments: %d", splitCount, splits[splitCount].NSegs)
343 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs) 377 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs)
344 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ { 378 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ {
345 splits[splitCount].Segs[segCount].Name = reader.TryReadString() 379 splits[splitCount].Segs[segCount].Name = reader.TryReadString()
346 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32() 380 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32()
381 writer.AppendLine("\t\t\t[%d] Segment Name: \"%s\"", segCount, splits[splitCount].Segs[segCount].Name)
382 writer.AppendLine("\t\t\t[%d] Segment Ticks: %d", segCount, splits[splitCount].Segs[segCount].Ticks)
347 } 383 }
348 } 384 }
349 return SarDataSpeedrunTime{ 385 return SarDataSpeedrunTime{
@@ -357,22 +393,32 @@ func parseTimestampData(reader *bitreader.Reader, length uint64) (SarDataTimesta
357 return SarDataTimestamp{}, errors.New("sar data invalid") 393 return SarDataTimestamp{}, errors.New("sar data invalid")
358 } 394 }
359 timestamp := reader.TryReadBytesToSlice(7) 395 timestamp := reader.TryReadBytesToSlice(7)
360 return SarDataTimestamp{ 396 sarDataTimeStamp := SarDataTimestamp{
361 Year: uint16(timestamp[0]) | uint16(timestamp[1])<<8, 397 Year: uint16(timestamp[0]) | uint16(timestamp[1])<<8,
362 Mon: timestamp[2] + 1, 398 Month: timestamp[2] + 1,
363 Day: timestamp[3], 399 Day: timestamp[3],
364 Hour: timestamp[4], 400 Hour: timestamp[4],
365 Min: timestamp[5], 401 Minute: timestamp[5],
366 Sec: timestamp[6], 402 Second: timestamp[6],
367 }, nil 403 }
404 writer.AppendLine("\t\tYear: %d", sarDataTimeStamp.Year)
405 writer.AppendLine("\t\tMonth: %d", sarDataTimeStamp.Month)
406 writer.AppendLine("\t\tDay: %d", sarDataTimeStamp.Day)
407 writer.AppendLine("\t\tHour: %d", sarDataTimeStamp.Hour)
408 writer.AppendLine("\t\tMinute: %d", sarDataTimeStamp.Minute)
409 writer.AppendLine("\t\tSecond: %d", sarDataTimeStamp.Second)
410 return sarDataTimeStamp, nil
368} 411}
369 412
370func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFileChecksum, error) { 413func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFileChecksum, error) {
371 if length < 6 { 414 if length < 6 {
372 return SarDataFileChecksum{}, errors.New("sar data invalid") 415 return SarDataFileChecksum{}, errors.New("sar data invalid")
373 } 416 }
374 return SarDataFileChecksum{ 417 sarDataFileChecksum := SarDataFileChecksum{
375 Sum: reader.TryReadUInt32(), 418 Sum: reader.TryReadUInt32(),
376 Path: reader.TryReadString(), 419 Path: reader.TryReadString(),
377 }, nil 420 }
421 writer.AppendLine("\t\tChecksum: %d", sarDataFileChecksum.Sum)
422 writer.AppendLine("\t\tPath: \"%s\"", sarDataFileChecksum.Path)
423 return sarDataFileChecksum, nil
378} 424}
diff --git a/pkg/classes/sendTable.go b/pkg/classes/sendTable.go
index bc36d75..927d967 100644
--- a/pkg/classes/sendTable.go
+++ b/pkg/classes/sendTable.go
@@ -1,7 +1,10 @@
1package classes 1package classes
2 2
3import ( 3import (
4 "fmt"
5
4 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
5) 8)
6 9
7type SendTable struct { 10type SendTable struct {
@@ -12,10 +15,10 @@ type SendTable struct {
12} 15}
13 16
14type prop struct { 17type prop struct {
15 SendPropType int8 18 SendPropType sendPropType
16 SendPropName string 19 SendPropName string
17 SendPropFlags int32 20 SendPropFlags uint32
18 Priority int8 21 Priority uint8
19 ExcludeDtName string 22 ExcludeDtName string
20 LowValue float32 23 LowValue float32
21 HighValue float32 24 HighValue float32
@@ -23,84 +26,169 @@ type prop struct {
23 NumElements int32 26 NumElements int32
24} 27}
25 28
26type sendPropFlag int 29type sendPropType int
27 30
28const ( 31const (
29 Unsigned sendPropFlag = iota 32 ESendPropTypeInt sendPropType = iota
30 Coord 33 ESendPropTypeFloat
31 NoScale 34 ESendPropTypeVector3
32 RoundDown 35 ESendPropTypeVector2
33 RoundUp 36 ESendPropTypeString
34 Normal 37 ESendPropTypeArray
35 Exclude 38 ESendPropTypeDataTable
36 Xyze
37 InsideArray
38 ProxyAlwaysYes
39 IsVectorElem
40 Collapsible
41 CoordMp
42 CoordMpLp // low precision
43 CoordMpInt
44 CellCoord
45 CellCoordLp
46 CellCoordInt
47 ChangesOften
48) 39)
49 40
50type sendPropType int
51
52const ( 41const (
53 Int sendPropType = iota 42 ESendPropFlagUnsigned string = "Unsigned"
54 Float 43 ESendPropFlagCoord string = "Coord"
55 Vector3 44 ESendPropFlagNoScale string = "NoScale"
56 Vector2 45 ESendPropFlagRoundDown string = "RoundDown"
57 String 46 ESendPropFlagRoundUp string = "RoundUp"
58 Array 47 ESendPropFlagNormal string = "Normal"
59 DataTable 48 ESendPropFlagExclude string = "Exclude"
49 ESendPropFlagXyze string = "Xyze"
50 ESendPropFlagInsideArray string = "InsideArray"
51 ESendPropFlagProxyAlwaysYes string = "ProxyAlwaysYes"
52 ESendPropFlagIsVectorElem string = "IsVectorElem"
53 ESendPropFlagCollapsible string = "Collapsible"
54 ESendPropFlagCoordMp string = "CoordMp"
55 ESendPropFlagCoordMpLp string = "CoordMpLp"
56 ESendPropFlagCoordMpInt string = "CoordMpInt"
57 ESendPropFlagCellCoord string = "CellCoord"
58 ESendPropFlagCellCoordLp string = "CellCoordLp"
59 ESendPropFlagCellCoordInt string = "CellCoordInt"
60 ESendPropFlagChangesOften string = "ChangesOften"
60) 61)
61 62
63func (prop prop) GetFlags() []string {
64 flags := []string{}
65 if checkBit(prop.SendPropFlags, 0) {
66 flags = append(flags, ESendPropFlagUnsigned)
67 }
68 if checkBit(prop.SendPropFlags, 1) {
69 flags = append(flags, ESendPropFlagCoord)
70 }
71 if checkBit(prop.SendPropFlags, 2) {
72 flags = append(flags, ESendPropFlagNoScale)
73 }
74 if checkBit(prop.SendPropFlags, 3) {
75 flags = append(flags, ESendPropFlagRoundDown)
76 }
77 if checkBit(prop.SendPropFlags, 4) {
78 flags = append(flags, ESendPropFlagRoundUp)
79 }
80 if checkBit(prop.SendPropFlags, 5) {
81 flags = append(flags, ESendPropFlagNormal)
82 }
83 if checkBit(prop.SendPropFlags, 6) {
84 flags = append(flags, ESendPropFlagExclude)
85 }
86 if checkBit(prop.SendPropFlags, 7) {
87 flags = append(flags, ESendPropFlagXyze)
88 }
89 if checkBit(prop.SendPropFlags, 8) {
90 flags = append(flags, ESendPropFlagInsideArray)
91 }
92 if checkBit(prop.SendPropFlags, 9) {
93 flags = append(flags, ESendPropFlagProxyAlwaysYes)
94 }
95 if checkBit(prop.SendPropFlags, 10) {
96 flags = append(flags, ESendPropFlagIsVectorElem)
97 }
98 if checkBit(prop.SendPropFlags, 11) {
99 flags = append(flags, ESendPropFlagCollapsible)
100 }
101 if checkBit(prop.SendPropFlags, 12) {
102 flags = append(flags, ESendPropFlagCoordMp)
103 }
104 if checkBit(prop.SendPropFlags, 13) {
105 flags = append(flags, ESendPropFlagCoordMpLp)
106 }
107 if checkBit(prop.SendPropFlags, 14) {
108 flags = append(flags, ESendPropFlagCoordMpInt)
109 }
110 if checkBit(prop.SendPropFlags, 15) {
111 flags = append(flags, ESendPropFlagCellCoord)
112 }
113 if checkBit(prop.SendPropFlags, 16) {
114 flags = append(flags, ESendPropFlagCellCoordLp)
115 }
116 if checkBit(prop.SendPropFlags, 17) {
117 flags = append(flags, ESendPropFlagCellCoordInt)
118 }
119 if checkBit(prop.SendPropFlags, 18) {
120 flags = append(flags, ESendPropFlagChangesOften)
121 }
122 return flags
123}
124
125func (sendPropType sendPropType) String() string {
126 switch sendPropType {
127 case ESendPropTypeInt:
128 return "Int"
129 case ESendPropTypeFloat:
130 return "Float"
131 case ESendPropTypeVector3:
132 return "Vector3"
133 case ESendPropTypeVector2:
134 return "Vector2"
135 case ESendPropTypeString:
136 return "String"
137 case ESendPropTypeArray:
138 return "Array"
139 case ESendPropTypeDataTable:
140 return "DataTable"
141 default:
142 return fmt.Sprintf("%d", int(sendPropType))
143 }
144}
145
62func ParseSendTable(reader *bitreader.Reader) SendTable { 146func ParseSendTable(reader *bitreader.Reader) SendTable {
63 sendTable := SendTable{ 147 sendTable := SendTable{
64 NeedsDecoder: reader.TryReadBool(), 148 NeedsDecoder: reader.TryReadBool(),
65 NetTableName: reader.TryReadString(), 149 NetTableName: reader.TryReadString(),
66 NumOfProps: int16(reader.TryReadBits(10)), 150 NumOfProps: int16(reader.TryReadBits(10)),
67 // SendPropType: int8(reader.TryReadBits(5)),
68 // SendPropName: reader.TryReadString(),
69 // SendPropFlags: int16(reader.TryReadBits(16)),
70 } 151 }
71 if sendTable.NumOfProps < 0 { 152 if sendTable.NumOfProps < 0 {
72 return sendTable 153 return sendTable
73 } 154 }
155 writer.TempAppendLine("\t\t%s (%d Props):", sendTable.NetTableName, sendTable.NumOfProps)
74 for count := 0; count < int(sendTable.NumOfProps); count++ { 156 for count := 0; count < int(sendTable.NumOfProps); count++ {
75 propType := int8(reader.TryReadBits(5)) 157 propType := int8(reader.TryReadBits(5))
76 if propType >= int8(7) { 158 if propType >= int8(7) {
77 return sendTable 159 return sendTable
78 } 160 }
79 prop := prop{ 161 prop := prop{
80 SendPropType: propType, 162 SendPropType: sendPropType(propType),
81 SendPropName: reader.TryReadString(), 163 SendPropName: reader.TryReadString(),
82 SendPropFlags: int32(reader.TryReadBits(19)), 164 SendPropFlags: uint32(reader.TryReadBits(19)),
83 Priority: int8(reader.TryReadBits(8)), 165 Priority: reader.TryReadUInt8(),
84 } 166 }
85 if propType == int8(DataTable) || CheckBit(int64(prop.SendPropFlags), int(Exclude)) { 167 writer.TempAppend("\t\t\t%s\t", prop.SendPropType)
168 if propType == int8(ESendPropTypeDataTable) || checkBit(prop.SendPropFlags, 6) {
86 prop.ExcludeDtName = reader.TryReadString() 169 prop.ExcludeDtName = reader.TryReadString()
170 writer.TempAppend(":\t%s\t", prop.ExcludeDtName)
87 } else { 171 } else {
88 switch propType { 172 switch propType {
89 case int8(String), int8(Int), int8(Float), int8(Vector3), int8(Vector2): 173 case int8(ESendPropTypeString), int8(ESendPropTypeInt), int8(ESendPropTypeFloat), int8(ESendPropTypeVector3), int8(ESendPropTypeVector2):
90 prop.LowValue = reader.TryReadFloat32() 174 prop.LowValue = reader.TryReadFloat32()
91 prop.HighValue = reader.TryReadFloat32() 175 prop.HighValue = reader.TryReadFloat32()
92 prop.NumBits = int32(reader.TryReadBits(7)) 176 prop.NumBits = int32(reader.TryReadBits(7))
93 case int8(Array): 177 writer.TempAppend("Low: %f\tHigh: %f\t%d bits\t", prop.LowValue, prop.HighValue, prop.NumBits)
178 case int8(ESendPropTypeArray):
94 prop.NumElements = int32(reader.TryReadBits(10)) 179 prop.NumElements = int32(reader.TryReadBits(10))
180 writer.TempAppend("Elements: %d\t", prop.NumElements)
95 default: 181 default:
182 writer.TempAppend("Unknown Prop Type: %v\t", propType)
96 return sendTable 183 return sendTable
97 } 184 }
98 } 185 }
186 writer.TempAppend("Flags: %v\tPriority: %d\n", prop.GetFlags(), prop.Priority)
99 sendTable.Props = append(sendTable.Props, prop) 187 sendTable.Props = append(sendTable.Props, prop)
100 } 188 }
101 return sendTable 189 return sendTable
102} 190}
103 191
104func CheckBit(val int64, bit int) bool { 192func checkBit(val uint32, bit int) bool {
105 return (val & (int64(1) << bit)) != 0 193 return (val & (uint32(1) << bit)) != 0
106} 194}
diff --git a/pkg/classes/serverClassInfo.go b/pkg/classes/serverClassInfo.go
index 36bd8b8..c0d2a2a 100644
--- a/pkg/classes/serverClassInfo.go
+++ b/pkg/classes/serverClassInfo.go
@@ -2,6 +2,7 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
5) 6)
6 7
7type ServerClassInfo struct { 8type ServerClassInfo struct {
@@ -11,11 +12,13 @@ type ServerClassInfo struct {
11} 12}
12 13
13func ParseServerClassInfo(reader *bitreader.Reader, count int, numOfClasses int) ServerClassInfo { 14func ParseServerClassInfo(reader *bitreader.Reader, count int, numOfClasses int) ServerClassInfo {
14 return ServerClassInfo{ 15 serverClassInfo := ServerClassInfo{
15 ClassId: reader.TryReadUInt16(), 16 ClassId: reader.TryReadUInt16(),
16 ClassName: reader.TryReadString(), 17 ClassName: reader.TryReadString(),
17 DataTableName: reader.TryReadString(), 18 DataTableName: reader.TryReadString(),
18 } 19 }
20 writer.TempAppendLine("\t\t\t[%d] %s (%s)", serverClassInfo.ClassId, serverClassInfo.ClassName, serverClassInfo.DataTableName)
21 return serverClassInfo
19} 22}
20 23
21// func serverClassBits(numOfClasses int) int { 24// func serverClassBits(numOfClasses int) int {
diff --git a/pkg/classes/stringTable.go b/pkg/classes/stringTable.go
index 3983c1f..44d8a73 100644
--- a/pkg/classes/stringTable.go
+++ b/pkg/classes/stringTable.go
@@ -2,6 +2,7 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
5) 6)
6 7
7type StringTable struct { 8type StringTable struct {
@@ -38,6 +39,7 @@ func ParseStringTables(reader *bitreader.Reader) []StringTable {
38func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { 39func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
39 stringTable.Name = reader.TryReadString() 40 stringTable.Name = reader.TryReadString()
40 entryCount := reader.TryReadBits(16) 41 entryCount := reader.TryReadBits(16)
42 writer.AppendLine("\tTable Name: %s", stringTable.Name)
41 stringTable.TableEntries = make([]StringTableEntry, entryCount) 43 stringTable.TableEntries = make([]StringTableEntry, entryCount)
42 44
43 for i := 0; i < int(entryCount); i++ { 45 for i := 0; i < int(entryCount); i++ {
@@ -45,7 +47,12 @@ func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
45 entry.Parse(reader) 47 entry.Parse(reader)
46 stringTable.TableEntries[i] = entry 48 stringTable.TableEntries[i] = entry
47 } 49 }
48 50 if entryCount != 0 {
51 writer.AppendLine("\t\t%d Table Entries:", entryCount)
52 writer.AppendOutputFromTemp()
53 } else {
54 writer.AppendLine("\t\tNo Table Entries")
55 }
49 if reader.TryReadBool() { 56 if reader.TryReadBool() {
50 classCount := reader.TryReadBits(16) 57 classCount := reader.TryReadBits(16)
51 stringTable.Classes = make([]StringTableClass, classCount) 58 stringTable.Classes = make([]StringTableClass, classCount)
@@ -55,6 +62,10 @@ func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
55 class.Parse(reader) 62 class.Parse(reader)
56 stringTable.Classes[i] = class 63 stringTable.Classes[i] = class
57 } 64 }
65 writer.AppendLine("\t\t%d Classes:", classCount)
66 writer.AppendOutputFromTemp()
67 } else {
68 writer.AppendLine("\t\tNo Class Entries")
58 } 69 }
59} 70}
60 71
@@ -73,8 +84,10 @@ func (stringTableEntry *StringTableEntry) Parse(reader *bitreader.Reader) {
73 84
74func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) { 85func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) {
75 stringTableClass.Name = reader.TryReadString() 86 stringTableClass.Name = reader.TryReadString()
87 writer.TempAppendLine("\t\t\tName: %s", stringTableClass.Name)
76 if reader.TryReadBool() { 88 if reader.TryReadBool() {
77 dataLen := reader.TryReadBits(16) 89 dataLen := reader.TryReadBits(16)
78 stringTableClass.Data = reader.TryReadStringLength(dataLen) 90 stringTableClass.Data = reader.TryReadStringLength(dataLen)
91 writer.TempAppendLine("\t\t\tData: %s", stringTableClass.Data)
79 } 92 }
80} 93}
diff --git a/pkg/classes/userCmdInfo.go b/pkg/classes/userCmdInfo.go
index 04d76b6..f1bb613 100644
--- a/pkg/classes/userCmdInfo.go
+++ b/pkg/classes/userCmdInfo.go
@@ -4,6 +4,7 @@ import (
4 "bytes" 4 "bytes"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type UserCmdInfo struct { 10type UserCmdInfo struct {
@@ -68,5 +69,19 @@ func ParseUserCmdInfo(data []byte) UserCmdInfo {
68 if reader.TryReadBool() { 69 if reader.TryReadBool() {
69 userCmdInfo.MouseDy = int16(reader.TryReadBits(16)) 70 userCmdInfo.MouseDy = int16(reader.TryReadBits(16))
70 } 71 }
72 writer.AppendLine("\tCommand Number: %v", userCmdInfo.CommandNumber)
73 writer.AppendLine("\tTick Count: %v", userCmdInfo.TickCount)
74 writer.AppendLine("\tView Angles X: %v", userCmdInfo.ViewAnglesX)
75 writer.AppendLine("\tView Angles Y: %v", userCmdInfo.ViewAnglesY)
76 writer.AppendLine("\tView Angles Z: %v", userCmdInfo.ViewAnglesZ)
77 writer.AppendLine("\tForward Move: %v", userCmdInfo.ForwardMove)
78 writer.AppendLine("\tSide Move: %v", userCmdInfo.SideMove)
79 writer.AppendLine("\tUp Move: %v", userCmdInfo.UpMove)
80 writer.AppendLine("\tButtons: %v", userCmdInfo.Buttons)
81 writer.AppendLine("\tImpulse: %v", userCmdInfo.Impulse)
82 writer.AppendLine("\tWeapon Select: %v", userCmdInfo.WeaponSelect)
83 writer.AppendLine("\tWeapon Sub Type: %v", userCmdInfo.WeaponSubType)
84 writer.AppendLine("\tMouse Dx: %v", userCmdInfo.MouseDx)
85 writer.AppendLine("\tMouse Dy: %v", userCmdInfo.MouseDy)
71 return userCmdInfo 86 return userCmdInfo
72} 87}
diff --git a/pkg/messages/messages.go b/pkg/messages/messages.go
index 9e7dfae..efa9460 100644
--- a/pkg/messages/messages.go
+++ b/pkg/messages/messages.go
@@ -1,11 +1,11 @@
1package messages 1package messages
2 2
3import ( 3import (
4 "fmt"
5 "reflect" 4 "reflect"
6 5
7 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
8 messages "github.com/pektezol/demoparser/pkg/messages/types" 7 messages "github.com/pektezol/demoparser/pkg/messages/types"
8 "github.com/pektezol/demoparser/pkg/writer"
9) 9)
10 10
11func ParseMessages(messageType int, reader *bitreader.Reader) any { 11func ParseMessages(messageType int, reader *bitreader.Reader) any {
@@ -82,6 +82,7 @@ func ParseMessages(messageType int, reader *bitreader.Reader) any {
82 default: 82 default:
83 return nil 83 return nil
84 } 84 }
85 fmt.Printf("\t\t(%d) %s:\n\t\t\t%+v\n", messageType, reflect.ValueOf(messageData).Type(), messageData) 85 writer.AppendLine("\tMessage: %s (%d):", reflect.ValueOf(messageData).Type(), messageType)
86 writer.AppendOutputFromTemp()
86 return messageData 87 return messageData
87} 88}
diff --git a/pkg/messages/types/netDisconnect.go b/pkg/messages/types/netDisconnect.go
index 3ecf8e1..c2e22c1 100644
--- a/pkg/messages/types/netDisconnect.go
+++ b/pkg/messages/types/netDisconnect.go
@@ -1,13 +1,18 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type NetDisconnect struct { 8type NetDisconnect struct {
6 Text string 9 Text string
7} 10}
8 11
9func ParseNetDisconnect(reader *bitreader.Reader) NetDisconnect { 12func ParseNetDisconnect(reader *bitreader.Reader) NetDisconnect {
10 return NetDisconnect{ 13 netDisconnect := NetDisconnect{
11 Text: reader.TryReadString(), 14 Text: reader.TryReadString(),
12 } 15 }
16 writer.TempAppendLine("\t\tText: %s", netDisconnect.Text)
17 return netDisconnect
13} 18}
diff --git a/pkg/messages/types/netFile.go b/pkg/messages/types/netFile.go
index c9c587d..4ebd770 100644
--- a/pkg/messages/types/netFile.go
+++ b/pkg/messages/types/netFile.go
@@ -4,6 +4,7 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type NetFile struct { 10type NetFile struct {
@@ -34,9 +35,13 @@ func (netFileFlags NetFileFlags) String() string {
34} 35}
35 36
36func ParseNetFile(reader *bitreader.Reader) NetFile { 37func ParseNetFile(reader *bitreader.Reader) NetFile {
37 return NetFile{ 38 netFile := NetFile{
38 TransferId: reader.TryReadUInt32(), 39 TransferId: reader.TryReadUInt32(),
39 FileName: reader.TryReadString(), 40 FileName: reader.TryReadString(),
40 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(), 41 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(),
41 } 42 }
43 writer.TempAppendLine("\t\tTransfer ID: %d", netFile.TransferId)
44 writer.TempAppendLine("\t\tFile Name: %s", netFile.FileName)
45 writer.TempAppendLine("\t\tFile Flags: %s", netFile.FileFlags)
46 return netFile
42} 47}
diff --git a/pkg/messages/types/netNop.go b/pkg/messages/types/netNop.go
index f942786..0ee1d0d 100644
--- a/pkg/messages/types/netNop.go
+++ b/pkg/messages/types/netNop.go
@@ -1,9 +1,13 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type NetNop struct{} 8type NetNop struct{}
6 9
7func ParseNetNop(reader *bitreader.Reader) NetNop { 10func ParseNetNop(reader *bitreader.Reader) NetNop {
11 writer.TempAppendLine("\t\t{}")
8 return NetNop{} 12 return NetNop{}
9} 13}
diff --git a/pkg/messages/types/netSetConVar.go b/pkg/messages/types/netSetConVar.go
index 44b75b9..530cb6b 100644
--- a/pkg/messages/types/netSetConVar.go
+++ b/pkg/messages/types/netSetConVar.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type NetSetConVar struct { 8type NetSetConVar struct {
6 Length uint8 9 Length uint8
@@ -15,11 +18,13 @@ type conVar struct {
15func ParseNetSetConVar(reader *bitreader.Reader) NetSetConVar { 18func ParseNetSetConVar(reader *bitreader.Reader) NetSetConVar {
16 length := reader.TryReadUInt8() 19 length := reader.TryReadUInt8()
17 convars := []conVar{} 20 convars := []conVar{}
21 writer.TempAppendLine("\t\tLength: %d", length)
18 for count := 0; count < int(length); count++ { 22 for count := 0; count < int(length); count++ {
19 convar := conVar{ 23 convar := conVar{
20 Name: reader.TryReadString(), 24 Name: reader.TryReadString(),
21 Value: reader.TryReadString(), 25 Value: reader.TryReadString(),
22 } 26 }
27 writer.TempAppendLine("\t\t[%d] %s: %s", count, convar.Name, convar.Value)
23 convars = append(convars, convar) 28 convars = append(convars, convar)
24 } 29 }
25 return NetSetConVar{ 30 return NetSetConVar{
diff --git a/pkg/messages/types/netSignOnState.go b/pkg/messages/types/netSignOnState.go
index 78d03aa..f784b0a 100644
--- a/pkg/messages/types/netSignOnState.go
+++ b/pkg/messages/types/netSignOnState.go
@@ -4,6 +4,7 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type NetSignOnState struct { 10type NetSignOnState struct {
@@ -59,12 +60,17 @@ func ParseNetSignOnState(reader *bitreader.Reader) NetSignOnState {
59 NumServerPlayers: reader.TryReadUInt32(), 60 NumServerPlayers: reader.TryReadUInt32(),
60 IdsLength: reader.TryReadUInt32(), 61 IdsLength: reader.TryReadUInt32(),
61 } 62 }
63 writer.TempAppendLine("\t\tSign On State: %s", netSignOnState.SignOnState)
64 writer.TempAppendLine("\t\tSpawn Count: %d", netSignOnState.SpawnCount)
65 writer.TempAppendLine("\t\tNumber Of Server Players: %d", netSignOnState.NumServerPlayers)
62 if netSignOnState.IdsLength > 0 { 66 if netSignOnState.IdsLength > 0 {
63 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength)) 67 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength))
68 writer.TempAppendLine("\t\tPlayer Network IDs: %v", netSignOnState.PlayersNetworksIds)
64 } 69 }
65 netSignOnState.MapNameLength = reader.TryReadUInt32() 70 netSignOnState.MapNameLength = reader.TryReadUInt32()
66 if netSignOnState.MapNameLength > 0 { 71 if netSignOnState.MapNameLength > 0 {
67 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength)) 72 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength))
73 writer.TempAppendLine("\t\tMap Name: %s", netSignOnState.MapName)
68 } 74 }
69 return netSignOnState 75 return netSignOnState
70} 76}
diff --git a/pkg/messages/types/netSplitScreenUser.go b/pkg/messages/types/netSplitScreenUser.go
index 9e4caa8..6068a28 100644
--- a/pkg/messages/types/netSplitScreenUser.go
+++ b/pkg/messages/types/netSplitScreenUser.go
@@ -1,13 +1,18 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type NetSplitScreenUser struct { 8type NetSplitScreenUser struct {
6 Unknown bool 9 Slot bool
7} 10}
8 11
9func ParseNetSplitScreenUser(reader *bitreader.Reader) NetSplitScreenUser { 12func ParseNetSplitScreenUser(reader *bitreader.Reader) NetSplitScreenUser {
10 return NetSplitScreenUser{ 13 netSplitScreenUser := NetSplitScreenUser{
11 Unknown: reader.TryReadBool(), 14 Slot: reader.TryReadBool(),
12 } 15 }
16 writer.TempAppendLine("\t\tSlot: %t", netSplitScreenUser.Slot)
17 return netSplitScreenUser
13} 18}
diff --git a/pkg/messages/types/netStringCmd.go b/pkg/messages/types/netStringCmd.go
index da5a75b..57ae813 100644
--- a/pkg/messages/types/netStringCmd.go
+++ b/pkg/messages/types/netStringCmd.go
@@ -1,13 +1,20 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "strings"
5
6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8)
4 9
5type NetStringCmd struct { 10type NetStringCmd struct {
6 Command string 11 Command string
7} 12}
8 13
9func ParseNetStringCmd(reader *bitreader.Reader) NetStringCmd { 14func ParseNetStringCmd(reader *bitreader.Reader) NetStringCmd {
10 return NetStringCmd{ 15 netStringCmd := NetStringCmd{
11 Command: reader.TryReadString(), 16 Command: reader.TryReadString(),
12 } 17 }
18 writer.TempAppendLine("\t\tCommand: \"%s\"", strings.TrimSpace(netStringCmd.Command))
19 return netStringCmd
13} 20}
diff --git a/pkg/messages/types/netTick.go b/pkg/messages/types/netTick.go
index dc941ad..1c01171 100644
--- a/pkg/messages/types/netTick.go
+++ b/pkg/messages/types/netTick.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type NetTick struct { 8type NetTick struct {
6 Tick uint32 9 Tick uint32
@@ -9,9 +12,13 @@ type NetTick struct {
9} 12}
10 13
11func ParseNetTick(reader *bitreader.Reader) NetTick { 14func ParseNetTick(reader *bitreader.Reader) NetTick {
12 return NetTick{ 15 netTick := NetTick{
13 Tick: reader.TryReadUInt32(), 16 Tick: reader.TryReadUInt32(),
14 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5, 17 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5,
15 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5, 18 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5,
16 } 19 }
20 writer.TempAppendLine("\t\tTick: %d", netTick.Tick)
21 writer.TempAppendLine("\t\tHost Frame Time: %f", netTick.HostFrameTime)
22 writer.TempAppendLine("\t\tHost Frame Time Std Deviation: %f", netTick.HostFrameTimeStdDeviation)
23 return netTick
17} 24}
diff --git a/pkg/messages/types/svcBspDecal.go b/pkg/messages/types/svcBspDecal.go
index 220f63a..cf94c1d 100644
--- a/pkg/messages/types/svcBspDecal.go
+++ b/pkg/messages/types/svcBspDecal.go
@@ -2,6 +2,7 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
5) 6)
6 7
7type SvcBspDecal struct { 8type SvcBspDecal struct {
@@ -27,6 +28,11 @@ func ParseSvcBspDecal(reader *bitreader.Reader) SvcBspDecal {
27 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11)) 28 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11))
28 } 29 }
29 svcBspDecal.LowPriority = reader.TryReadBool() 30 svcBspDecal.LowPriority = reader.TryReadBool()
31 writer.TempAppendLine("\t\tPosition: %v", svcBspDecal.Pos)
32 writer.TempAppendLine("\t\tDecal Texture Index: %d", svcBspDecal.DecalTextureIndex)
33 writer.TempAppendLine("\t\tEntity Index: %d", svcBspDecal.EntityIndex)
34 writer.TempAppendLine("\t\tModel Index: %d", svcBspDecal.ModelIndex)
35 writer.TempAppendLine("\t\tLow Priority: %t", svcBspDecal.LowPriority)
30 return svcBspDecal 36 return svcBspDecal
31} 37}
32 38
diff --git a/pkg/messages/types/svcClassInfo.go b/pkg/messages/types/svcClassInfo.go
index d2f6a90..384c501 100644
--- a/pkg/messages/types/svcClassInfo.go
+++ b/pkg/messages/types/svcClassInfo.go
@@ -4,6 +4,7 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type SvcClassInfo struct { 10type SvcClassInfo struct {
@@ -24,14 +25,19 @@ func ParseSvcClassInfo(reader *bitreader.Reader) SvcClassInfo {
24 CreateOnClient: reader.TryReadBool(), 25 CreateOnClient: reader.TryReadBool(),
25 } 26 }
26 classes := []serverClass{} 27 classes := []serverClass{}
28 writer.TempAppendLine("\t\tCreate On Client: %t", svcClassInfo.CreateOnClient)
27 if !svcClassInfo.CreateOnClient { 29 if !svcClassInfo.CreateOnClient {
30 writer.TempAppendLine("\t\t%d Server Classes:", svcClassInfo.ClassCount)
28 for count := 0; count < int(svcClassInfo.ClassCount); count++ { 31 for count := 0; count < int(svcClassInfo.ClassCount); count++ {
29 classes = append(classes, serverClass{ 32 classes = append(classes, serverClass{
30 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))), 33 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))),
31 ClassName: reader.TryReadString(), 34 ClassName: reader.TryReadString(),
32 DataTableName: reader.TryReadString(), 35 DataTableName: reader.TryReadString(),
33 }) 36 })
37 writer.TempAppendLine("\t\t\t[%d] %s (%s)", classes[len(classes)-1].ClassId, classes[len(classes)-1].ClassName, classes[len(classes)-1].DataTableName)
34 } 38 }
39 } else {
40 writer.TempAppendLine("\t\t%d Server Classes", svcClassInfo.ClassCount)
35 } 41 }
36 svcClassInfo.ServerClasses = classes 42 svcClassInfo.ServerClasses = classes
37 return svcClassInfo 43 return svcClassInfo
diff --git a/pkg/messages/types/svcCmdKeyValues.go b/pkg/messages/types/svcCmdKeyValues.go
index 8fdd076..5c80d0b 100644
--- a/pkg/messages/types/svcCmdKeyValues.go
+++ b/pkg/messages/types/svcCmdKeyValues.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcCmdKeyValues struct { 8type SvcCmdKeyValues struct {
6 Length uint32 9 Length uint32
@@ -12,5 +15,6 @@ func ParseSvcCmdKeyValues(reader *bitreader.Reader) SvcCmdKeyValues {
12 Length: reader.TryReadUInt32(), 15 Length: reader.TryReadUInt32(),
13 } 16 }
14 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length)) 17 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length))
18 writer.TempAppendLine("\t\tData: %v", svcCmdKeyValues.Data)
15 return svcCmdKeyValues 19 return svcCmdKeyValues
16} 20}
diff --git a/pkg/messages/types/svcCreateStringTable.go b/pkg/messages/types/svcCreateStringTable.go
index aea40b0..ff2e27d 100644
--- a/pkg/messages/types/svcCreateStringTable.go
+++ b/pkg/messages/types/svcCreateStringTable.go
@@ -4,6 +4,7 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type SvcCreateStringTable struct { 10type SvcCreateStringTable struct {
@@ -31,6 +32,13 @@ func ParseSvcCreateStringTable(reader *bitreader.Reader) SvcCreateStringTable {
31 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4)) 32 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4))
32 } 33 }
33 svcCreateStringTable.Flags = int8(reader.TryReadBits(2)) 34 svcCreateStringTable.Flags = int8(reader.TryReadBits(2))
35 writer.TempAppendLine("\t\tName: %s", svcCreateStringTable.Name)
36 writer.TempAppendLine("\t\tMax Enties: %d", svcCreateStringTable.MaxEntries)
37 writer.TempAppendLine("\t\tNumber Of Entiries: %d", svcCreateStringTable.NumEntries)
38 writer.TempAppendLine("\t\tUser Data Fixed Size: %t", svcCreateStringTable.UserDataFixedSize)
39 writer.TempAppendLine("\t\tUser Data Size: %d", svcCreateStringTable.UserDataSize)
40 writer.TempAppendLine("\t\tUser Data Size In Bits: %d", svcCreateStringTable.UserDataSizeBits)
41 writer.TempAppendLine("\t\tFlags: %d", svcCreateStringTable.Flags)
34 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing 42 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing
35 return svcCreateStringTable 43 return svcCreateStringTable
36} 44}
diff --git a/pkg/messages/types/svcCrosshairAngle.go b/pkg/messages/types/svcCrosshairAngle.go
index b7d234c..efd6d77 100644
--- a/pkg/messages/types/svcCrosshairAngle.go
+++ b/pkg/messages/types/svcCrosshairAngle.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcCrosshairAngle struct { 8type SvcCrosshairAngle struct {
6 Angle crosshairAngles 9 Angle crosshairAngles
@@ -13,11 +16,15 @@ type crosshairAngles struct {
13} 16}
14 17
15func ParseSvcCrosshairAngle(reader *bitreader.Reader) SvcCrosshairAngle { 18func ParseSvcCrosshairAngle(reader *bitreader.Reader) SvcCrosshairAngle {
16 return SvcCrosshairAngle{ 19 svcCrosshairAngle := SvcCrosshairAngle{
17 Angle: crosshairAngles{ 20 Angle: crosshairAngles{
18 X: float32(reader.TryReadBits(16)), 21 X: float32(reader.TryReadBits(16)),
19 Y: float32(reader.TryReadBits(16)), 22 Y: float32(reader.TryReadBits(16)),
20 Z: float32(reader.TryReadBits(16)), 23 Z: float32(reader.TryReadBits(16)),
21 }, 24 },
22 } 25 }
26 writer.TempAppendLine("\t\tX: %f", svcCrosshairAngle.Angle.X)
27 writer.TempAppendLine("\t\tY: %f", svcCrosshairAngle.Angle.Y)
28 writer.TempAppendLine("\t\tZ: %f", svcCrosshairAngle.Angle.Z)
29 return svcCrosshairAngle
23} 30}
diff --git a/pkg/messages/types/svcEntityMessage.go b/pkg/messages/types/svcEntityMessage.go
index 58f42ba..a511fea 100644
--- a/pkg/messages/types/svcEntityMessage.go
+++ b/pkg/messages/types/svcEntityMessage.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcEntityMessage struct { 8type SvcEntityMessage struct {
6 EntityIndex uint16 9 EntityIndex uint16
@@ -16,5 +19,8 @@ func ParseSvcEntityMessage(reader *bitreader.Reader) SvcEntityMessage {
16 Length: uint16(reader.TryReadBits(11)), 19 Length: uint16(reader.TryReadBits(11)),
17 } 20 }
18 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length)) 21 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length))
22 writer.TempAppendLine("\t\tEntity Index: %d", svcEntityMessage.EntityIndex)
23 writer.TempAppendLine("\t\tClass ID: %d", svcEntityMessage.ClassId)
24 writer.TempAppendLine("\t\tData: %v", svcEntityMessage.Data)
19 return svcEntityMessage 25 return svcEntityMessage
20} 26}
diff --git a/pkg/messages/types/svcFixAngle.go b/pkg/messages/types/svcFixAngle.go
index 95f67ec..b79c02d 100644
--- a/pkg/messages/types/svcFixAngle.go
+++ b/pkg/messages/types/svcFixAngle.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcFixAngle struct { 8type SvcFixAngle struct {
6 Relative bool 9 Relative bool
@@ -14,7 +17,7 @@ type fixAngles struct {
14} 17}
15 18
16func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle { 19func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle {
17 return SvcFixAngle{ 20 svcFixAngle := SvcFixAngle{
18 Relative: reader.TryReadBool(), 21 Relative: reader.TryReadBool(),
19 Angle: fixAngles{ 22 Angle: fixAngles{
20 X: float32(reader.TryReadBits(16)), 23 X: float32(reader.TryReadBits(16)),
@@ -22,4 +25,9 @@ func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle {
22 Z: float32(reader.TryReadBits(16)), 25 Z: float32(reader.TryReadBits(16)),
23 }, 26 },
24 } 27 }
28 writer.TempAppendLine("\t\tRelative: %t", svcFixAngle.Relative)
29 writer.TempAppendLine("\t\tX: %f", svcFixAngle.Angle.X)
30 writer.TempAppendLine("\t\tY: %f", svcFixAngle.Angle.Y)
31 writer.TempAppendLine("\t\tZ: %f", svcFixAngle.Angle.Z)
32 return svcFixAngle
25} 33}
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go
index 9e4564a..e12d75a 100644
--- a/pkg/messages/types/svcGameEvent.go
+++ b/pkg/messages/types/svcGameEvent.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcGameEvent struct { 8type SvcGameEvent struct {
6 Length uint16 9 Length uint16
@@ -12,5 +15,6 @@ func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent {
12 Length: uint16(reader.TryReadBits(11)), 15 Length: uint16(reader.TryReadBits(11)),
13 } 16 }
14 svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)) 17 svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length))
18 writer.TempAppendLine("\t\tData: %v", svcGameEvent.Data)
15 return svcGameEvent 19 return svcGameEvent
16} 20}
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go
index c6eb896..1fa7589 100644
--- a/pkg/messages/types/svcGameEventList.go
+++ b/pkg/messages/types/svcGameEventList.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcGameEventList struct { 8type SvcGameEventList struct {
6 Events int16 9 Events int16
@@ -17,5 +20,6 @@ func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList {
17 Length: int32(reader.TryReadBits(20)), 20 Length: int32(reader.TryReadBits(20)),
18 } 21 }
19 reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)) 22 reader.TryReadBitsToSlice(uint64(svcGameEventList.Length))
23 writer.TempAppendLine("\t\tEvents: %d", svcGameEventList.Events)
20 return svcGameEventList 24 return svcGameEventList
21} 25}
diff --git a/pkg/messages/types/svcGetCvarValue.go b/pkg/messages/types/svcGetCvarValue.go
index 19fc362..939e6b6 100644
--- a/pkg/messages/types/svcGetCvarValue.go
+++ b/pkg/messages/types/svcGetCvarValue.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcGetCvarValue struct { 8type SvcGetCvarValue struct {
6 Cookie int32 9 Cookie int32
@@ -12,5 +15,7 @@ func ParseSvcGetCvarValue(reader *bitreader.Reader) SvcGetCvarValue {
12 Cookie: reader.TryReadSInt32(), 15 Cookie: reader.TryReadSInt32(),
13 CvarName: reader.TryReadString(), 16 CvarName: reader.TryReadString(),
14 } 17 }
18 writer.TempAppendLine("\t\tCookie: %d", svcGetCvarValue.Cookie)
19 writer.TempAppendLine("\t\tCvar: \"%s\"", svcGetCvarValue.CvarName)
15 return svcGetCvarValue 20 return svcGetCvarValue
16} 21}
diff --git a/pkg/messages/types/svcMenu.go b/pkg/messages/types/svcMenu.go
index 9e8e2eb..33ccb70 100644
--- a/pkg/messages/types/svcMenu.go
+++ b/pkg/messages/types/svcMenu.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcMenu struct { 8type SvcMenu struct {
6 Type uint16 9 Type uint16
@@ -14,5 +17,7 @@ func ParseSvcMenu(reader *bitreader.Reader) SvcMenu {
14 Length: reader.TryReadUInt32(), 17 Length: reader.TryReadUInt32(),
15 } 18 }
16 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length)) 19 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length))
20 writer.TempAppendLine("\t\tType: %d", svcMenu.Type)
21 writer.TempAppendLine("\t\tData: %v", svcMenu.Data)
17 return svcMenu 22 return svcMenu
18} 23}
diff --git a/pkg/messages/types/svcPacketEntities.go b/pkg/messages/types/svcPacketEntities.go
index 2d86bf2..05b6794 100644
--- a/pkg/messages/types/svcPacketEntities.go
+++ b/pkg/messages/types/svcPacketEntities.go
@@ -2,6 +2,7 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
5) 6)
6 7
7type SvcPacketEntities struct { 8type SvcPacketEntities struct {
@@ -30,5 +31,12 @@ func ParseSvcPacketEntities(reader *bitreader.Reader) SvcPacketEntities {
30 svcPacketEntities.Length = uint32(reader.TryReadBits(20)) 31 svcPacketEntities.Length = uint32(reader.TryReadBits(20))
31 svcPacketEntities.UpdatedBaseline = reader.TryReadBool() 32 svcPacketEntities.UpdatedBaseline = reader.TryReadBool()
32 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length)) 33 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length))
34 writer.TempAppendLine("\t\tMax Entries: %d", svcPacketEntities.MaxEntries)
35 writer.TempAppendLine("\t\tIs Delta: %t", svcPacketEntities.IsDelta)
36 writer.TempAppendLine("\t\tDelta From: %d", svcPacketEntities.DeltaFrom)
37 writer.TempAppendLine("\t\tBaseline: %t", svcPacketEntities.BaseLine)
38 writer.TempAppendLine("\t\tUpdated Baseline: %t", svcPacketEntities.UpdatedBaseline)
39 writer.TempAppendLine("\t\t%d Updated Entries:", svcPacketEntities.UpdatedEntries)
40 writer.TempAppendLine("\t\tData: %v", svcPacketEntities.Data)
33 return svcPacketEntities 41 return svcPacketEntities
34} 42}
diff --git a/pkg/messages/types/svcPaintmapData.go b/pkg/messages/types/svcPaintmapData.go
index 380016a..40f6ad0 100644
--- a/pkg/messages/types/svcPaintmapData.go
+++ b/pkg/messages/types/svcPaintmapData.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcPaintmapData struct { 8type SvcPaintmapData struct {
6 Length uint32 9 Length uint32
@@ -12,5 +15,6 @@ func ParseSvcPaintmapData(reader *bitreader.Reader) SvcPaintmapData {
12 Length: reader.TryReadUInt32(), 15 Length: reader.TryReadUInt32(),
13 } 16 }
14 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length)) 17 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length))
18 writer.TempAppendLine("\t\tData: %v", svcPaintmapData.Data)
15 return svcPaintmapData 19 return svcPaintmapData
16} 20}
diff --git a/pkg/messages/types/svcPrefetch.go b/pkg/messages/types/svcPrefetch.go
index 50d01e9..b71e61f 100644
--- a/pkg/messages/types/svcPrefetch.go
+++ b/pkg/messages/types/svcPrefetch.go
@@ -1,13 +1,18 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcPrefetch struct { 8type SvcPrefetch struct {
6 SoundIndex int16 9 SoundIndex int16
7} 10}
8 11
9func ParseSvcPrefetch(reader *bitreader.Reader) SvcPrefetch { 12func ParseSvcPrefetch(reader *bitreader.Reader) SvcPrefetch {
10 return SvcPrefetch{ 13 svcPrefetch := SvcPrefetch{
11 SoundIndex: int16(reader.TryReadBits(13)), 14 SoundIndex: int16(reader.TryReadBits(13)),
12 } 15 }
16 writer.TempAppendLine("\t\tSound Index: %d", svcPrefetch.SoundIndex)
17 return svcPrefetch
13} 18}
diff --git a/pkg/messages/types/svcPrint.go b/pkg/messages/types/svcPrint.go
index f31d046..760a3c5 100644
--- a/pkg/messages/types/svcPrint.go
+++ b/pkg/messages/types/svcPrint.go
@@ -1,13 +1,21 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "strings"
5
6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8)
4 9
5type SvcPrint struct { 10type SvcPrint struct {
6 Message string 11 Message string
7} 12}
8 13
9func ParseSvcPrint(reader *bitreader.Reader) SvcPrint { 14func ParseSvcPrint(reader *bitreader.Reader) SvcPrint {
10 return SvcPrint{ 15 svcPrint := SvcPrint{
11 Message: reader.TryReadString(), 16 Message: reader.TryReadString(),
12 } 17 }
18 // common psycopath behaviour
19 writer.TempAppendLine("\t\t%s", strings.Replace(strings.ReplaceAll(strings.ReplaceAll(svcPrint.Message, "\n", "\n\t\t"), "\n\t\t\n\t\t", ""), "\n\t\t", "", 1))
20 return svcPrint
13} 21}
diff --git a/pkg/messages/types/svcSendTable.go b/pkg/messages/types/svcSendTable.go
index 2395e9f..78df195 100644
--- a/pkg/messages/types/svcSendTable.go
+++ b/pkg/messages/types/svcSendTable.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcSendTable struct { 8type SvcSendTable struct {
6 NeedsDecoder bool 9 NeedsDecoder bool
@@ -14,5 +17,8 @@ func ParseSvcSendTable(reader *bitreader.Reader) SvcSendTable {
14 Length: reader.TryReadUInt8(), 17 Length: reader.TryReadUInt8(),
15 } 18 }
16 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length))) 19 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length)))
20 writer.TempAppendLine("\t\tNeeds Decoder: %t", svcSendTable.NeedsDecoder)
21 writer.TempAppendLine("\t\tLength: %d", svcSendTable.Length)
22 writer.TempAppendLine("\t\tProps: %d", svcSendTable.Props)
17 return svcSendTable 23 return svcSendTable
18} 24}
diff --git a/pkg/messages/types/svcServerInfo.go b/pkg/messages/types/svcServerInfo.go
index 7d44569..a6acd53 100644
--- a/pkg/messages/types/svcServerInfo.go
+++ b/pkg/messages/types/svcServerInfo.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcServerInfo struct { 8type SvcServerInfo struct {
6 Protocol uint16 9 Protocol uint16
@@ -22,7 +25,7 @@ type SvcServerInfo struct {
22} 25}
23 26
24func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo { 27func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo {
25 return SvcServerInfo{ 28 svcServerInfo := SvcServerInfo{
26 Protocol: reader.TryReadUInt16(), 29 Protocol: reader.TryReadUInt16(),
27 ServerCount: reader.TryReadUInt32(), 30 ServerCount: reader.TryReadUInt32(),
28 IsHltv: reader.TryReadBool(), 31 IsHltv: reader.TryReadBool(),
@@ -40,4 +43,21 @@ func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo {
40 SkyName: reader.TryReadString(), 43 SkyName: reader.TryReadString(),
41 HostName: reader.TryReadString(), 44 HostName: reader.TryReadString(),
42 } 45 }
46 writer.TempAppendLine("\t\tNetwork Protocol: %d", svcServerInfo.Protocol)
47 writer.TempAppendLine("\t\tServer Count: %d", svcServerInfo.ServerCount)
48 writer.TempAppendLine("\t\tIs Hltv: %t", svcServerInfo.IsHltv)
49 writer.TempAppendLine("\t\tIs Dedicated: %t", svcServerInfo.IsDedicated)
50 writer.TempAppendLine("\t\tServer Client CRC: %d", svcServerInfo.ClientCrc)
51 writer.TempAppendLine("\t\tString Table CRC: %d", svcServerInfo.StringTableCrc)
52 writer.TempAppendLine("\t\tMax Server Classes: %d", svcServerInfo.MaxServerClasses)
53 writer.TempAppendLine("\t\tServer Map CRC: %d", svcServerInfo.MapCrc)
54 writer.TempAppendLine("\t\tCurrent Player Count: %d", svcServerInfo.PlayerCount)
55 writer.TempAppendLine("\t\tMax Player Count: %d", svcServerInfo.MaxClients)
56 writer.TempAppendLine("\t\tInterval Per Tick: %f", svcServerInfo.TickInterval)
57 writer.TempAppendLine("\t\tPlatform: %s", svcServerInfo.Platform)
58 writer.TempAppendLine("\t\tGame Directory: %s", svcServerInfo.GameDir)
59 writer.TempAppendLine("\t\tMap Name: %s", svcServerInfo.MapName)
60 writer.TempAppendLine("\t\tSky Name: %s", svcServerInfo.SkyName)
61 writer.TempAppendLine("\t\tHost Name: %s", svcServerInfo.HostName)
62 return svcServerInfo
43} 63}
diff --git a/pkg/messages/types/svcSetPause.go b/pkg/messages/types/svcSetPause.go
index 551a4d3..d979ac5 100644
--- a/pkg/messages/types/svcSetPause.go
+++ b/pkg/messages/types/svcSetPause.go
@@ -1,13 +1,18 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcSetPause struct { 8type SvcSetPause struct {
6 Paused bool 9 Paused bool
7} 10}
8 11
9func ParseSvcSetPause(reader *bitreader.Reader) SvcSetPause { 12func ParseSvcSetPause(reader *bitreader.Reader) SvcSetPause {
10 return SvcSetPause{ 13 svcSetPause := SvcSetPause{
11 Paused: reader.TryReadBool(), 14 Paused: reader.TryReadBool(),
12 } 15 }
16 writer.TempAppendLine("\t\tPaused: %t", svcSetPause.Paused)
17 return svcSetPause
13} 18}
diff --git a/pkg/messages/types/svcSetView.go b/pkg/messages/types/svcSetView.go
index 4ba5e3c..bdb6203 100644
--- a/pkg/messages/types/svcSetView.go
+++ b/pkg/messages/types/svcSetView.go
@@ -1,13 +1,18 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcSetView struct { 8type SvcSetView struct {
6 EntityIndex uint16 9 EntityIndex uint16
7} 10}
8 11
9func ParseSvcSetView(reader *bitreader.Reader) SvcSetView { 12func ParseSvcSetView(reader *bitreader.Reader) SvcSetView {
10 return SvcSetView{ 13 svcSetView := SvcSetView{
11 EntityIndex: uint16(reader.TryReadBits(11)), 14 EntityIndex: uint16(reader.TryReadBits(11)),
12 } 15 }
16 writer.TempAppendLine("\t\tEntity Index: %d", svcSetView.EntityIndex)
17 return svcSetView
13} 18}
diff --git a/pkg/messages/types/svcSounds.go b/pkg/messages/types/svcSounds.go
index 1553450..1affeb4 100644
--- a/pkg/messages/types/svcSounds.go
+++ b/pkg/messages/types/svcSounds.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcSounds struct { 8type SvcSounds struct {
6 ReliableSound bool 9 ReliableSound bool
@@ -21,5 +24,8 @@ func ParseSvcSounds(reader *bitreader.Reader) SvcSounds {
21 svcSounds.Length = reader.TryReadUInt16() 24 svcSounds.Length = reader.TryReadUInt16()
22 } 25 }
23 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length)) 26 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length))
27 writer.TempAppendLine("\t\tReliable Sound: %t", svcSounds.ReliableSound)
28 writer.TempAppendLine("\t\tSound Count: %d", svcSounds.SoundCount)
29 writer.TempAppendLine("\t\tData: %v", svcSounds.Data)
24 return svcSounds 30 return svcSounds
25} 31}
diff --git a/pkg/messages/types/svcSplitScreen.go b/pkg/messages/types/svcSplitScreen.go
index 5ddc131..653438a 100644
--- a/pkg/messages/types/svcSplitScreen.go
+++ b/pkg/messages/types/svcSplitScreen.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcSplitScreen struct { 8type SvcSplitScreen struct {
6 RemoveUser bool 9 RemoveUser bool
@@ -14,5 +17,7 @@ func ParseSvcSplitScreen(reader *bitreader.Reader) SvcSplitScreen {
14 Length: uint16(reader.TryReadBits(11)), 17 Length: uint16(reader.TryReadBits(11)),
15 } 18 }
16 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length)) 19 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length))
20 writer.TempAppendLine("\t\tRemove User: %t", svcSplitScreen.RemoveUser)
21 writer.TempAppendLine("\t\tData: %v", svcSplitScreen.Data)
17 return svcSplitScreen 22 return svcSplitScreen
18} 23}
diff --git a/pkg/messages/types/svcTempEntities.go b/pkg/messages/types/svcTempEntities.go
index 9c20a65..407bfd6 100644
--- a/pkg/messages/types/svcTempEntities.go
+++ b/pkg/messages/types/svcTempEntities.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcTempEntities struct { 8type SvcTempEntities struct {
6 NumEntries uint8 9 NumEntries uint8
@@ -14,5 +17,7 @@ func ParseSvcTempEntities(reader *bitreader.Reader) SvcTempEntities {
14 Length: uint32(reader.TryReadBits(17)), 17 Length: uint32(reader.TryReadBits(17)),
15 } 18 }
16 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length)) 19 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length))
20 writer.TempAppendLine("\t\tNumber Of Entries: %d", svcTempEntities.NumEntries)
21 writer.TempAppendLine("\t\tData: %v", svcTempEntities.Data)
17 return svcTempEntities 22 return svcTempEntities
18} 23}
diff --git a/pkg/messages/types/svcUpdateStringTable.go b/pkg/messages/types/svcUpdateStringTable.go
index 0ff076c..68c8fb5 100644
--- a/pkg/messages/types/svcUpdateStringTable.go
+++ b/pkg/messages/types/svcUpdateStringTable.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcUpdateStringTable struct { 8type SvcUpdateStringTable struct {
6 TableId uint8 9 TableId uint8
@@ -18,5 +21,7 @@ func ParseSvcUpdateStringTable(reader *bitreader.Reader) SvcUpdateStringTable {
18 } 21 }
19 svcUpdateStringTable.Length = int32(reader.TryReadBits(20)) 22 svcUpdateStringTable.Length = int32(reader.TryReadBits(20))
20 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length)) 23 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length))
24 writer.TempAppendLine("\t\tTable ID: %d", svcUpdateStringTable.TableId)
25 writer.TempAppendLine("\t\tNumber Of Changed Entries: %d", svcUpdateStringTable.NumChangedEntries)
21 return svcUpdateStringTable 26 return svcUpdateStringTable
22} 27}
diff --git a/pkg/messages/types/svcUserMessage.go b/pkg/messages/types/svcUserMessage.go
index 3cc6de2..e5b1943 100644
--- a/pkg/messages/types/svcUserMessage.go
+++ b/pkg/messages/types/svcUserMessage.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcUserMessage struct { 8type SvcUserMessage struct {
6 Type int8 9 Type int8
@@ -86,6 +89,8 @@ func ParseSvcUserMessage(reader *bitreader.Reader) SvcUserMessage {
86 Length: int16(reader.TryReadBits(12)), 89 Length: int16(reader.TryReadBits(12)),
87 } 90 }
88 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length)) 91 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length))
92 writer.TempAppendLine("\t\tType: %d", svcUserMessage.Type)
93 writer.TempAppendLine("\t\tData: %v", svcUserMessage.Data)
89 return svcUserMessage 94 return svcUserMessage
90} 95}
91 96
diff --git a/pkg/messages/types/svcVoiceData.go b/pkg/messages/types/svcVoiceData.go
index efcae85..c3e08ee 100644
--- a/pkg/messages/types/svcVoiceData.go
+++ b/pkg/messages/types/svcVoiceData.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcVoiceData struct { 8type SvcVoiceData struct {
6 FromClient uint8 9 FromClient uint8
@@ -18,5 +21,8 @@ func ParseSvcVoiceData(reader *bitreader.Reader) SvcVoiceData {
18 svcVoiceData.Proximity = true 21 svcVoiceData.Proximity = true
19 } 22 }
20 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length)) 23 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length))
24 writer.TempAppendLine("\t\tFrom Client: %d", svcVoiceData.FromClient)
25 writer.TempAppendLine("\t\tProximity: %t", svcVoiceData.Proximity)
26 writer.TempAppendLine("\t\tData: %v", svcVoiceData.Data)
21 return svcVoiceData 27 return svcVoiceData
22} 28}
diff --git a/pkg/messages/types/svcVoiceInit.go b/pkg/messages/types/svcVoiceInit.go
index a6d711a..03e0e25 100644
--- a/pkg/messages/types/svcVoiceInit.go
+++ b/pkg/messages/types/svcVoiceInit.go
@@ -1,6 +1,9 @@
1package messages 1package messages
2 2
3import "github.com/pektezol/bitreader" 3import (
4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6)
4 7
5type SvcVoiceInit struct { 8type SvcVoiceInit struct {
6 Codec string 9 Codec string
@@ -22,5 +25,8 @@ func ParseSvcVoiceInit(reader *bitreader.Reader) SvcVoiceInit {
22 svcVoiceInit.SampleRate = 11025 25 svcVoiceInit.SampleRate = 11025
23 } 26 }
24 } 27 }
28 writer.TempAppendLine("\t\tCodec: %s", svcVoiceInit.Codec)
29 writer.TempAppendLine("\t\tQuality: %d", svcVoiceInit.Quality)
30 writer.TempAppendLine("\t\tSample Rate: %d", svcVoiceInit.SampleRate)
25 return svcVoiceInit 31 return svcVoiceInit
26} 32}
diff --git a/pkg/packets/headers.go b/pkg/packets/headers.go
index dbeab87..d92b22d 100644
--- a/pkg/packets/headers.go
+++ b/pkg/packets/headers.go
@@ -1,9 +1,8 @@
1package packets 1package packets
2 2
3import ( 3import (
4 "fmt"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
7) 6)
8 7
9type Headers struct { 8type Headers struct {
@@ -43,6 +42,6 @@ func ParseHeaders(reader *bitreader.Reader) Headers {
43 if headers.NetworkProtocol != 2001 { 42 if headers.NetworkProtocol != 2001 {
44 panic("this parser only supports demos from portal 2") 43 panic("this parser only supports demos from portal 2")
45 } 44 }
46 fmt.Printf("Headers: %+v\n", headers) 45 writer.AppendLine("Headers: %+v", headers)
47 return headers 46 return headers
48} 47}
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
index 3a01370..33350d5 100644
--- a/pkg/packets/packets.go
+++ b/pkg/packets/packets.go
@@ -4,6 +4,7 @@ import (
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" 6 "github.com/pektezol/demoparser/pkg/messages"
7 "github.com/pektezol/demoparser/pkg/writer"
7) 8)
8 9
9type PacketMessageInfo struct { 10type PacketMessageInfo struct {
@@ -23,6 +24,7 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
23 switch packetType { 24 switch packetType {
24 case 1: // SignOn 25 case 1: // SignOn
25 signOn := SignOn{} 26 signOn := SignOn{}
27 writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType)
26 for count := 0; count < MSSC; count++ { 28 for count := 0; count < MSSC; count++ {
27 signOn.PacketInfo = append(signOn.PacketInfo, classes.ParseCmdInfo(reader)) 29 signOn.PacketInfo = append(signOn.PacketInfo, classes.ParseCmdInfo(reader))
28 } 30 }
@@ -41,6 +43,7 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
41 packetData = signOn 43 packetData = signOn
42 case 2: // Packet 44 case 2: // Packet
43 packet := Packet{} 45 packet := Packet{}
46 writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType)
44 for count := 0; count < MSSC; count++ { 47 for count := 0; count < MSSC; count++ {
45 packet.PacketInfo = append(packet.PacketInfo, classes.ParseCmdInfo(reader)) 48 packet.PacketInfo = append(packet.PacketInfo, classes.ParseCmdInfo(reader))
46 } 49 }
@@ -59,16 +62,18 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
59 packetData = packet 62 packetData = packet
60 case 3: // SyncTick 63 case 3: // SyncTick
61 syncTick := SyncTick{} 64 syncTick := SyncTick{}
65 writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType)
62 packetData = syncTick 66 packetData = syncTick
63 case 4: // ConsoleCmd 67 case 4: // ConsoleCmd
64 size := reader.TryReadSInt32() 68 consoleCmd := ConsoleCmd{}
65 consoleCmd := ConsoleCmd{ 69 writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType)
66 Size: int32(size), 70 consoleCmd.Size = reader.TryReadSInt32()
67 Data: reader.TryReadStringLength(uint64(size)), 71 consoleCmd.Data = reader.TryReadStringLength(uint64(consoleCmd.Size))
68 } 72 writer.AppendLine("\t%s", consoleCmd.Data)
69 packetData = consoleCmd 73 packetData = consoleCmd
70 case 5: // UserCmd TODO: usercmdinfo refactor 74 case 5: // UserCmd TODO: usercmdinfo refactor
71 userCmd := UserCmd{} 75 userCmd := UserCmd{}
76 writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType)
72 userCmd.Cmd = int32(reader.TryReadSInt32()) 77 userCmd.Cmd = int32(reader.TryReadSInt32())
73 userCmd.Size = int32(reader.TryReadSInt32()) 78 userCmd.Size = int32(reader.TryReadSInt32())
74 data := reader.TryReadBytesToSlice(uint64(userCmd.Size)) 79 data := reader.TryReadBytesToSlice(uint64(userCmd.Size))
@@ -76,6 +81,7 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
76 packetData = userCmd 81 packetData = userCmd
77 case 6: // DataTables TODO: prop stuff 82 case 6: // DataTables TODO: prop stuff
78 dataTables := DataTables{} 83 dataTables := DataTables{}
84 writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType)
79 dataTables.Size = int32(reader.TryReadSInt32()) 85 dataTables.Size = int32(reader.TryReadSInt32())
80 data := reader.TryReadBytesToSlice(uint64(dataTables.Size)) 86 data := reader.TryReadBytesToSlice(uint64(dataTables.Size))
81 dataTableReader := bitreader.NewReaderFromBytes(data, true) 87 dataTableReader := bitreader.NewReaderFromBytes(data, true)
@@ -84,43 +90,52 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
84 count++ 90 count++
85 dataTables.SendTable = append(dataTables.SendTable, classes.ParseSendTable(dataTableReader)) 91 dataTables.SendTable = append(dataTables.SendTable, classes.ParseSendTable(dataTableReader))
86 } 92 }
93 writer.AppendLine("\t%d Send Tables:", count)
94 writer.AppendOutputFromTemp()
87 numOfClasses := dataTableReader.TryReadBits(16) 95 numOfClasses := dataTableReader.TryReadBits(16)
88 for count = 0; count < int(numOfClasses); count++ { 96 for count = 0; count < int(numOfClasses); count++ {
89 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, classes.ParseServerClassInfo(dataTableReader, count, int(numOfClasses))) 97 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, classes.ParseServerClassInfo(dataTableReader, count, int(numOfClasses)))
90 } 98 }
99 writer.AppendLine("\t%d Classes:", count)
100 writer.AppendOutputFromTemp()
91 packetData = dataTables 101 packetData = dataTables
92 case 7: // Stop 102 case 7: // Stop
93 stop := Stop{} 103 stop := Stop{}
104 writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType)
94 if reader.TryReadBool() { 105 if reader.TryReadBool() {
95 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits())) 106 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits()))
107 writer.AppendLine("\tRemaining Data: %v", stop.RemainingData)
96 } 108 }
97 packetData = stop 109 packetData = stop
98 case 8: // CustomData 110 case 8: // CustomData TODO: not sar data
99 customData := CustomData{ 111 customData := CustomData{}
100 Unknown: int32(reader.TryReadBits(32)), 112 customData.Type = reader.TryReadSInt32()
101 Size: int32(reader.TryReadBits(32)), 113 customData.Size = reader.TryReadSInt32()
102 } 114 if customData.Type != 0 || customData.Size == 8 {
103 if customData.Unknown != 0 || customData.Size == 8 {
104 // Not SAR data 115 // Not SAR data
116 writer.AppendLine("[%d] %s (%d):", tickNumber, "CUSTOMDATA", packetType)
105 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size))) 117 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size)))
118 writer.AppendLine("\t%s", customData.Data)
106 packetData = customData 119 packetData = customData
107 break 120 break
108 } 121 }
109 // SAR data 122 // SAR data
110 sarData := classes.SarData{} 123 sarData := classes.SarData{}
124 writer.AppendLine("[%d] %s (%d):", tickNumber, "SARDATA", packetType)
111 data := reader.TryReadBytesToSlice(uint64(customData.Size)) 125 data := reader.TryReadBytesToSlice(uint64(customData.Size))
112 sarReader := bitreader.NewReaderFromBytes(data, true) 126 sarReader := bitreader.NewReaderFromBytes(data, true)
113 sarData.ParseSarData(sarReader) 127 sarData.ParseSarData(sarReader)
114 packetData = sarData 128 packetData = sarData
115 case 9: // StringTables TODO: parsing string table data 129 case 9: // StringTables TODO: parsing string table data
116 stringTables := StringTables{ 130 stringTables := StringTables{}
117 Size: int32(reader.TryReadSInt32()), 131 writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType)
118 } 132 stringTables.Size = reader.TryReadSInt32()
119 data := reader.TryReadBytesToSlice(uint64(stringTables.Size)) 133 data := reader.TryReadBytesToSlice(uint64(stringTables.Size))
120 stringTableReader := bitreader.NewReaderFromBytes(data, true) 134 stringTableReader := bitreader.NewReaderFromBytes(data, true)
121 stringTables.Data = classes.ParseStringTables(stringTableReader) 135 stringTables.Data = classes.ParseStringTables(stringTableReader)
122 packetData = stringTables 136 packetData = stringTables
123 default: // invalid 137 default: // invalid
138 writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType)
124 panic("invalid packet type") 139 panic("invalid packet type")
125 } 140 }
126 return PacketMessageInfo{ 141 return PacketMessageInfo{
diff --git a/pkg/packets/types.go b/pkg/packets/types.go
index 6297b01..a2fb78f 100644
--- a/pkg/packets/types.go
+++ b/pkg/packets/types.go
@@ -42,9 +42,9 @@ type Stop struct {
42} 42}
43 43
44type CustomData struct { 44type CustomData struct {
45 Unknown int32 45 Type int32
46 Size int32 46 Size int32
47 Data string 47 Data string
48} 48}
49 49
50type StringTables struct { 50type StringTables struct {
diff --git a/pkg/writer/writer.go b/pkg/writer/writer.go
new file mode 100644
index 0000000..6b66e75
--- /dev/null
+++ b/pkg/writer/writer.go
@@ -0,0 +1,47 @@
1package writer
2
3import (
4 "fmt"
5 "strings"
6)
7
8var output strings.Builder
9
10var temp strings.Builder
11
12func Append(str string, a ...any) {
13 _, err := output.WriteString(fmt.Sprintf(str, a...))
14 if err != nil {
15 output.WriteString(err.Error())
16 }
17}
18
19func AppendLine(str string, a ...any) {
20 Append(str, a...)
21 output.WriteString("\n")
22}
23
24func GetString() string {
25 return output.String()
26}
27
28func TempAppend(str string, a ...any) {
29 _, err := temp.WriteString(fmt.Sprintf(str, a...))
30 if err != nil {
31 temp.WriteString(err.Error())
32 }
33}
34
35func TempAppendLine(str string, a ...any) {
36 TempAppend(str, a...)
37 temp.WriteString("\n")
38}
39
40func TempGetString() string {
41 return temp.String()
42}
43
44func AppendOutputFromTemp() {
45 output.WriteString(temp.String())
46 temp.Reset()
47}