aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/classes/consoleCmd.go4
-rw-r--r--pkg/classes/customData.go4
-rw-r--r--pkg/classes/dataTables.go13
-rw-r--r--pkg/classes/packet.go9
-rw-r--r--pkg/classes/sarData.go49
-rw-r--r--pkg/classes/signOn.go9
-rw-r--r--pkg/classes/stop.go2
-rw-r--r--pkg/classes/stringTables.go14
-rw-r--r--pkg/classes/userCmd.go9
-rw-r--r--pkg/messages/messages.go5
-rw-r--r--pkg/messages/types/netDisconnect.go3
-rw-r--r--pkg/messages/types/netFile.go5
-rw-r--r--pkg/messages/types/netNop.go3
-rw-r--r--pkg/messages/types/netSetConVar.go5
-rw-r--r--pkg/messages/types/netSignOnState.go9
-rw-r--r--pkg/messages/types/netSplitScreenUser.go3
-rw-r--r--pkg/messages/types/netStringCmd.go5
-rw-r--r--pkg/messages/types/netTick.go5
-rw-r--r--pkg/messages/types/svcBspDecal.go7
-rw-r--r--pkg/messages/types/svcClassInfo.go9
-rw-r--r--pkg/messages/types/svcCmdKeyValues.go3
-rw-r--r--pkg/messages/types/svcCreateStringTable.go9
-rw-r--r--pkg/messages/types/svcCrosshairAngle.go5
-rw-r--r--pkg/messages/types/svcEntityMessage.go5
-rw-r--r--pkg/messages/types/svcFixAngle.go6
-rw-r--r--pkg/messages/types/svcGameEvent.go3
-rw-r--r--pkg/messages/types/svcGameEventList.go3
-rw-r--r--pkg/messages/types/svcGetCvarValue.go4
-rw-r--r--pkg/messages/types/svcMenu.go4
-rw-r--r--pkg/messages/types/svcPacketEntities.go9
-rw-r--r--pkg/messages/types/svcPaintmapData.go3
-rw-r--r--pkg/messages/types/svcPrefetch.go3
-rw-r--r--pkg/messages/types/svcPrint.go5
-rw-r--r--pkg/messages/types/svcSendTable.go5
-rw-r--r--pkg/messages/types/svcServerInfo.go18
-rw-r--r--pkg/messages/types/svcSetPause.go3
-rw-r--r--pkg/messages/types/svcSetView.go3
-rw-r--r--pkg/messages/types/svcSounds.go5
-rw-r--r--pkg/messages/types/svcSplitScreen.go4
-rw-r--r--pkg/messages/types/svcTempEntities.go4
-rw-r--r--pkg/messages/types/svcUpdateStringTable.go4
-rw-r--r--pkg/messages/types/svcUserMessage.go924
-rw-r--r--pkg/messages/types/svcVoiceData.go5
-rw-r--r--pkg/messages/types/svcVoiceInit.go5
-rw-r--r--pkg/packets/headers.go2
-rw-r--r--pkg/packets/packets.go10
-rw-r--r--pkg/writer/writer.go47
47 files changed, 56 insertions, 1217 deletions
diff --git a/pkg/classes/consoleCmd.go b/pkg/classes/consoleCmd.go
index 75a56eb..fa9bbd0 100644
--- a/pkg/classes/consoleCmd.go
+++ b/pkg/classes/consoleCmd.go
@@ -1,10 +1,7 @@
1package classes 1package classes
2 2
3import ( 3import (
4 "strings"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 5)
9 6
10type ConsoleCmd struct { 7type ConsoleCmd struct {
@@ -15,5 +12,4 @@ type ConsoleCmd struct {
15func (consoleCmd *ConsoleCmd) ParseConsoleCmd(reader *bitreader.Reader) { 12func (consoleCmd *ConsoleCmd) ParseConsoleCmd(reader *bitreader.Reader) {
16 consoleCmd.Size = reader.TryReadSInt32() 13 consoleCmd.Size = reader.TryReadSInt32()
17 consoleCmd.Data = reader.TryReadStringLength(uint64(consoleCmd.Size)) 14 consoleCmd.Data = reader.TryReadStringLength(uint64(consoleCmd.Size))
18 writer.AppendLine("\t%s", strings.TrimSpace(consoleCmd.Data))
19} 15}
diff --git a/pkg/classes/customData.go b/pkg/classes/customData.go
index 2dadde4..59cb121 100644
--- a/pkg/classes/customData.go
+++ b/pkg/classes/customData.go
@@ -2,7 +2,6 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type CustomData struct { 7type CustomData struct {
@@ -16,13 +15,10 @@ func (customData *CustomData) ParseCustomData(reader *bitreader.Reader, tickNumb
16 customData.Size = reader.TryReadSInt32() 15 customData.Size = reader.TryReadSInt32()
17 if customData.Type != 0 || customData.Size == 8 { 16 if customData.Type != 0 || customData.Size == 8 {
18 // Not SAR data 17 // Not SAR data
19 writer.AppendLine("[%d] %s (%d):", tickNumber, "CUSTOMDATA", packetType)
20 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size))) 18 customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size)))
21 writer.AppendLine("\t%s", customData.Data)
22 return 19 return
23 } 20 }
24 // SAR data 21 // SAR data
25 writer.AppendLine("[%d] %s (%d):", tickNumber, "SARDATA", packetType)
26 sarData := SarData{} 22 sarData := SarData{}
27 data := reader.TryReadBytesToSlice(uint64(customData.Size)) 23 data := reader.TryReadBytesToSlice(uint64(customData.Size))
28 sarReader := bitreader.NewReaderFromBytes(data, true) 24 sarReader := bitreader.NewReaderFromBytes(data, true)
diff --git a/pkg/classes/dataTables.go b/pkg/classes/dataTables.go
index 27ab9e4..c17e5f6 100644
--- a/pkg/classes/dataTables.go
+++ b/pkg/classes/dataTables.go
@@ -4,7 +4,6 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type DataTables struct { 9type DataTables struct {
@@ -46,14 +45,10 @@ func (dataTables *DataTables) ParseDataTables(reader *bitreader.Reader) {
46 count++ 45 count++
47 dataTables.SendTable = append(dataTables.SendTable, ParseSendTable(dataTableReader)) 46 dataTables.SendTable = append(dataTables.SendTable, ParseSendTable(dataTableReader))
48 } 47 }
49 writer.AppendLine("\t%d Send Tables:", count)
50 writer.AppendOutputFromTemp()
51 numOfClasses := dataTableReader.TryReadBits(16) 48 numOfClasses := dataTableReader.TryReadBits(16)
52 for count = 0; count < int(numOfClasses); count++ { 49 for count = 0; count < int(numOfClasses); count++ {
53 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, ParseServerClassInfo(dataTableReader, count, int(numOfClasses))) 50 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, ParseServerClassInfo(dataTableReader, count, int(numOfClasses)))
54 } 51 }
55 writer.AppendLine("\t%d Classes:", count)
56 writer.AppendOutputFromTemp()
57} 52}
58 53
59func ParseSendTable(reader *bitreader.Reader) SendTable { 54func ParseSendTable(reader *bitreader.Reader) SendTable {
@@ -65,7 +60,6 @@ func ParseSendTable(reader *bitreader.Reader) SendTable {
65 if sendTable.NumOfProps < 0 { 60 if sendTable.NumOfProps < 0 {
66 return sendTable 61 return sendTable
67 } 62 }
68 writer.TempAppendLine("\t\t%s (%d Props):", sendTable.NetTableName, sendTable.NumOfProps)
69 for count := 0; count < int(sendTable.NumOfProps); count++ { 63 for count := 0; count < int(sendTable.NumOfProps); count++ {
70 propType := int8(reader.TryReadBits(5)) 64 propType := int8(reader.TryReadBits(5))
71 if propType >= int8(7) { 65 if propType >= int8(7) {
@@ -77,26 +71,20 @@ func ParseSendTable(reader *bitreader.Reader) SendTable {
77 SendPropFlags: uint32(reader.TryReadBits(19)), 71 SendPropFlags: uint32(reader.TryReadBits(19)),
78 Priority: reader.TryReadUInt8(), 72 Priority: reader.TryReadUInt8(),
79 } 73 }
80 writer.TempAppend("\t\t\t%s\t", prop.SendPropType)
81 if propType == int8(ESendPropTypeDataTable) || checkBit(prop.SendPropFlags, 6) { 74 if propType == int8(ESendPropTypeDataTable) || checkBit(prop.SendPropFlags, 6) {
82 prop.ExcludeDtName = reader.TryReadString() 75 prop.ExcludeDtName = reader.TryReadString()
83 writer.TempAppend(":\t%s\t", prop.ExcludeDtName)
84 } else { 76 } else {
85 switch propType { 77 switch propType {
86 case int8(ESendPropTypeString), int8(ESendPropTypeInt), int8(ESendPropTypeFloat), int8(ESendPropTypeVector3), int8(ESendPropTypeVector2): 78 case int8(ESendPropTypeString), int8(ESendPropTypeInt), int8(ESendPropTypeFloat), int8(ESendPropTypeVector3), int8(ESendPropTypeVector2):
87 prop.LowValue = reader.TryReadFloat32() 79 prop.LowValue = reader.TryReadFloat32()
88 prop.HighValue = reader.TryReadFloat32() 80 prop.HighValue = reader.TryReadFloat32()
89 prop.NumBits = int32(reader.TryReadBits(7)) 81 prop.NumBits = int32(reader.TryReadBits(7))
90 writer.TempAppend("Low: %f\tHigh: %f\t%d bits\t", prop.LowValue, prop.HighValue, prop.NumBits)
91 case int8(ESendPropTypeArray): 82 case int8(ESendPropTypeArray):
92 prop.NumElements = int32(reader.TryReadBits(10)) 83 prop.NumElements = int32(reader.TryReadBits(10))
93 writer.TempAppend("Elements: %d\t", prop.NumElements)
94 default: 84 default:
95 writer.TempAppend("Unknown Prop Type: %v\t", propType)
96 return sendTable 85 return sendTable
97 } 86 }
98 } 87 }
99 writer.TempAppend("Flags: %v\tPriority: %d\n", prop.GetFlags(), prop.Priority)
100 sendTable.Props = append(sendTable.Props, prop) 88 sendTable.Props = append(sendTable.Props, prop)
101 } 89 }
102 return sendTable 90 return sendTable
@@ -108,7 +96,6 @@ func ParseServerClassInfo(reader *bitreader.Reader, count int, numOfClasses int)
108 ClassName: reader.TryReadString(), 96 ClassName: reader.TryReadString(),
109 DataTableName: reader.TryReadString(), 97 DataTableName: reader.TryReadString(),
110 } 98 }
111 writer.TempAppendLine("\t\t\t[%d] %s (%s)", serverClassInfo.ClassId, serverClassInfo.ClassName, serverClassInfo.DataTableName)
112 return serverClassInfo 99 return serverClassInfo
113} 100}
114 101
diff --git a/pkg/classes/packet.go b/pkg/classes/packet.go
index 0bba102..c608244 100644
--- a/pkg/classes/packet.go
+++ b/pkg/classes/packet.go
@@ -5,7 +5,6 @@ import (
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/messages" 7 "github.com/pektezol/demoparser/pkg/messages"
8 "github.com/pektezol/demoparser/pkg/writer"
9) 8)
10 9
11const MSSC int = 2 10const MSSC int = 2
@@ -55,14 +54,6 @@ func (packet *Packet) ParseCmdInfo(reader *bitreader.Reader) {
55 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 54 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
56 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 55 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
57 }) 56 })
58 writer.AppendLine("\tFlags: %s", CmdInfoFlags(packet.PacketInfo[len(packet.PacketInfo)-1].Flags).String())
59 writer.AppendLine("\tView Origin: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewOrigin)
60 writer.AppendLine("\tView Angles: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewAngles)
61 writer.AppendLine("\tLocal View Angles: %v", packet.PacketInfo[len(packet.PacketInfo)-1].LocalViewAngles)
62 writer.AppendLine("\tView Origin 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewOrigin2)
63 writer.AppendLine("\tView Angles 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewAngles2)
64 writer.AppendLine("\tLocal View Angles 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].LocalViewAngles2)
65 writer.AppendLine("")
66} 57}
67 58
68type CmdInfoFlags int 59type CmdInfoFlags int
diff --git a/pkg/classes/sarData.go b/pkg/classes/sarData.go
index 27e8a64..9c61304 100644
--- a/pkg/classes/sarData.go
+++ b/pkg/classes/sarData.go
@@ -5,7 +5,6 @@ import (
5 "fmt" 5 "fmt"
6 6
7 "github.com/pektezol/bitreader" 7 "github.com/pektezol/bitreader"
8 "github.com/pektezol/demoparser/pkg/writer"
9) 8)
10 9
11type SarDataType uint8 10type SarDataType uint8
@@ -164,7 +163,6 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
164 len = 9 163 len = 9
165 } 164 }
166 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true) 165 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true)
167 writer.AppendLine("\tMessage: %s (%d):", sarData.Type.String(), sarData.Type)
168 switch sarData.Type { 166 switch sarData.Type {
169 case ESarDataTimescaleCheat: 167 case ESarDataTimescaleCheat:
170 sarData.Data, err = parseTimescaleCheatData(dataReader, len) 168 sarData.Data, err = parseTimescaleCheatData(dataReader, len)
@@ -175,7 +173,6 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
175 sarData.Data = parseInitialCVarData(dataReader) 173 sarData.Data = parseInitialCVarData(dataReader)
176 case ESarDataEntityInputSlot: 174 case ESarDataEntityInputSlot:
177 sarData.Slot = int(dataReader.TryReadBytes(1)) 175 sarData.Slot = int(dataReader.TryReadBytes(1))
178 writer.AppendLine("\t\tSlot: %d", sarData.Slot)
179 case ESarDataEntityInput: 176 case ESarDataEntityInput:
180 sarData.Data = parseEntityInputData(dataReader) 177 sarData.Data = parseEntityInputData(dataReader)
181 case ESarDataChecksum: 178 case ESarDataChecksum:
@@ -201,7 +198,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
201 if err != nil { 198 if err != nil {
202 sarData.Data = nil 199 sarData.Data = nil
203 } 200 }
204 writer.AppendLine("\t\tSlot: %d", sarData.Slot) 201
205 case ESarDataPause: 202 case ESarDataPause:
206 sarData.Data, err = parsePauseData(dataReader, len) 203 sarData.Data, err = parsePauseData(dataReader, len)
207 if err != nil { 204 if err != nil {
@@ -246,7 +243,7 @@ func parseTimescaleCheatData(reader *bitreader.Reader, length uint64) (SarDataTi
246 sarDataTimescaleCheat := SarDataTimescaleCheat{ 243 sarDataTimescaleCheat := SarDataTimescaleCheat{
247 Timescale: reader.TryReadFloat32(), 244 Timescale: reader.TryReadFloat32(),
248 } 245 }
249 writer.AppendLine("\t\tTimescale: %f", sarDataTimescaleCheat.Timescale) 246
250 return sarDataTimescaleCheat, nil 247 return sarDataTimescaleCheat, nil
251} 248}
252 249
@@ -255,7 +252,7 @@ func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar {
255 CVar: reader.TryReadString(), 252 CVar: reader.TryReadString(),
256 Val: reader.TryReadString(), 253 Val: reader.TryReadString(),
257 } 254 }
258 writer.AppendLine("\t\tCvar: \"%s\" = \"%s\"", sarDataInitialCvar.CVar, sarDataInitialCvar.Val) 255
259 return sarDataInitialCvar 256 return sarDataInitialCvar
260} 257}
261 258
@@ -266,10 +263,7 @@ func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput {
266 InputName: reader.TryReadString(), 263 InputName: reader.TryReadString(),
267 Parameter: reader.TryReadString(), 264 Parameter: reader.TryReadString(),
268 } 265 }
269 writer.AppendLine("\t\tTarget: %s", sarDataEntityInput.TargetName) 266
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 267 return sarDataEntityInput
274} 268}
275 269
@@ -281,8 +275,7 @@ func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum
281 DemoSum: reader.TryReadUInt32(), 275 DemoSum: reader.TryReadUInt32(),
282 SarSum: reader.TryReadUInt32(), 276 SarSum: reader.TryReadUInt32(),
283 } 277 }
284 writer.AppendLine("\t\tDemo Checksum: %d", sarDataChecksum.DemoSum) 278
285 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksum.SarSum)
286 return sarDataChecksum, nil 279 return sarDataChecksum, nil
287} 280}
288 281
@@ -294,8 +287,7 @@ func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecks
294 SarSum: reader.TryReadUInt32(), 287 SarSum: reader.TryReadUInt32(),
295 Signature: [64]byte(reader.TryReadBytesToSlice(60)), 288 Signature: [64]byte(reader.TryReadBytesToSlice(60)),
296 } 289 }
297 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksumV2.SarSum) 290
298 writer.AppendLine("\t\tSignature: %v", sarDataChecksumV2.Signature)
299 return sarDataChecksumV2, nil 291 return sarDataChecksumV2, nil
300} 292}
301 293
@@ -312,10 +304,7 @@ func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataP
312 Y: reader.TryReadFloat32(), 304 Y: reader.TryReadFloat32(),
313 Z: reader.TryReadFloat32(), 305 Z: reader.TryReadFloat32(),
314 } 306 }
315 writer.AppendLine("\t\tOrange: %t", orange) 307
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 308 return sarDataPortalPlacement, slot, nil
320} 309}
321 310
@@ -333,7 +322,7 @@ func parsePauseData(reader *bitreader.Reader, length uint64) (SarDataPause, erro
333 sarDataPause := SarDataPause{ 322 sarDataPause := SarDataPause{
334 PauseTicks: reader.TryReadUInt32(), 323 PauseTicks: reader.TryReadUInt32(),
335 } 324 }
336 writer.AppendLine("\t\tPause Ticks: %d", sarDataPause.PauseTicks) 325
337 return sarDataPause, nil 326 return sarDataPause, nil
338} 327}
339 328
@@ -345,8 +334,7 @@ func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun,
345 Ticks: int(reader.TryReadUInt32()), 334 Ticks: int(reader.TryReadUInt32()),
346 Cmd: reader.TryReadString(), 335 Cmd: reader.TryReadString(),
347 } 336 }
348 writer.AppendLine("\t\tTicks: %d", sarDataWaitRun.Ticks) 337
349 writer.AppendLine("\t\tCmd: \"%s\"", sarDataWaitRun.Cmd)
350 return sarDataWaitRun, nil 338 return sarDataWaitRun, nil
351} 339}
352 340
@@ -358,8 +346,7 @@ func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun
358 Ticks: int(reader.TryReadUInt32()), 346 Ticks: int(reader.TryReadUInt32()),
359 Cmd: reader.TryReadString(), 347 Cmd: reader.TryReadString(),
360 } 348 }
361 writer.AppendLine("\t\tTicks: %d", sarDataHWaitRun.Ticks) 349
362 writer.AppendLine("\t\tCmd: \"%s\"", sarDataHWaitRun.Cmd)
363 return sarDataHWaitRun, nil 350 return sarDataHWaitRun, nil
364} 351}
365 352
@@ -372,14 +359,12 @@ func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpee
372 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ { 359 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ {
373 splits[splitCount].Name = reader.TryReadString() 360 splits[splitCount].Name = reader.TryReadString()
374 splits[splitCount].NSegs = reader.TryReadUInt32() 361 splits[splitCount].NSegs = reader.TryReadUInt32()
375 writer.AppendLine("\t\t[%d] Split Name: \"%s\"", splitCount, splits[splitCount].Name) 362
376 writer.AppendLine("\t\t[%d] Number of Segments: %d", splitCount, splits[splitCount].NSegs)
377 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs) 363 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs)
378 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ { 364 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ {
379 splits[splitCount].Segs[segCount].Name = reader.TryReadString() 365 splits[splitCount].Segs[segCount].Name = reader.TryReadString()
380 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32() 366 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32()
381 writer.AppendLine("\t\t\t[%d] Segment Name: \"%s\"", segCount, splits[splitCount].Segs[segCount].Name) 367
382 writer.AppendLine("\t\t\t[%d] Segment Ticks: %d", segCount, splits[splitCount].Segs[segCount].Ticks)
383 } 368 }
384 } 369 }
385 return SarDataSpeedrunTime{ 370 return SarDataSpeedrunTime{
@@ -401,12 +386,7 @@ func parseTimestampData(reader *bitreader.Reader, length uint64) (SarDataTimesta
401 Minute: timestamp[5], 386 Minute: timestamp[5],
402 Second: timestamp[6], 387 Second: timestamp[6],
403 } 388 }
404 writer.AppendLine("\t\tYear: %d", sarDataTimeStamp.Year) 389
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 390 return sarDataTimeStamp, nil
411} 391}
412 392
@@ -418,7 +398,6 @@ func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFile
418 Sum: reader.TryReadUInt32(), 398 Sum: reader.TryReadUInt32(),
419 Path: reader.TryReadString(), 399 Path: reader.TryReadString(),
420 } 400 }
421 writer.AppendLine("\t\tChecksum: %d", sarDataFileChecksum.Sum) 401
422 writer.AppendLine("\t\tPath: \"%s\"", sarDataFileChecksum.Path)
423 return sarDataFileChecksum, nil 402 return sarDataFileChecksum, nil
424} 403}
diff --git a/pkg/classes/signOn.go b/pkg/classes/signOn.go
index fad696c..5f004c0 100644
--- a/pkg/classes/signOn.go
+++ b/pkg/classes/signOn.go
@@ -3,7 +3,6 @@ package classes
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/messages" 5 "github.com/pektezol/demoparser/pkg/messages"
6 "github.com/pektezol/demoparser/pkg/writer"
7) 6)
8 7
9type SignOn struct { 8type SignOn struct {
@@ -41,12 +40,4 @@ func (signOn *SignOn) ParseCmdInfo(reader *bitreader.Reader) {
41 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 40 ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
42 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 41 LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
43 }) 42 })
44 writer.AppendLine("\tFlags: %s", CmdInfoFlags(signOn.PacketInfo[len(signOn.PacketInfo)-1].Flags).String())
45 writer.AppendLine("\tView Origin: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].ViewOrigin)
46 writer.AppendLine("\tView Angles: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].ViewAngles)
47 writer.AppendLine("\tLocal View Angles: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].LocalViewAngles)
48 writer.AppendLine("\tView Origin 2: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].ViewOrigin2)
49 writer.AppendLine("\tView Angles 2: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].ViewAngles2)
50 writer.AppendLine("\tLocal View Angles 2: %v", signOn.PacketInfo[len(signOn.PacketInfo)-1].LocalViewAngles2)
51 writer.AppendLine("")
52} 43}
diff --git a/pkg/classes/stop.go b/pkg/classes/stop.go
index 753be19..96bc1e4 100644
--- a/pkg/classes/stop.go
+++ b/pkg/classes/stop.go
@@ -2,7 +2,6 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type Stop struct { 7type Stop struct {
@@ -12,6 +11,5 @@ type Stop struct {
12func (stop *Stop) ParseStop(reader *bitreader.Reader) { 11func (stop *Stop) ParseStop(reader *bitreader.Reader) {
13 if reader.TryReadBool() { 12 if reader.TryReadBool() {
14 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits())) 13 stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits()))
15 writer.AppendLine("\tRemaining Data: %v", stop.RemainingData)
16 } 14 }
17} 15}
diff --git a/pkg/classes/stringTables.go b/pkg/classes/stringTables.go
index 01939b2..45954be 100644
--- a/pkg/classes/stringTables.go
+++ b/pkg/classes/stringTables.go
@@ -2,7 +2,6 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type StringTables struct { 7type StringTables struct {
@@ -46,7 +45,6 @@ func (stringTables *StringTables) ParseStringTables(reader *bitreader.Reader) {
46func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { 45func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
47 stringTable.Name = reader.TryReadString() 46 stringTable.Name = reader.TryReadString()
48 entryCount := reader.TryReadBits(16) 47 entryCount := reader.TryReadBits(16)
49 writer.AppendLine("\tTable Name: %s", stringTable.Name)
50 stringTable.TableEntries = make([]StringTableEntry, entryCount) 48 stringTable.TableEntries = make([]StringTableEntry, entryCount)
51 49
52 for i := 0; i < int(entryCount); i++ { 50 for i := 0; i < int(entryCount); i++ {
@@ -54,12 +52,6 @@ func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
54 entry.Parse(reader) 52 entry.Parse(reader)
55 stringTable.TableEntries[i] = entry 53 stringTable.TableEntries[i] = entry
56 } 54 }
57 if entryCount != 0 {
58 writer.AppendLine("\t\t%d Table Entries:", entryCount)
59 writer.AppendOutputFromTemp()
60 } else {
61 writer.AppendLine("\t\tNo Table Entries")
62 }
63 if reader.TryReadBool() { 55 if reader.TryReadBool() {
64 classCount := reader.TryReadBits(16) 56 classCount := reader.TryReadBits(16)
65 stringTable.Classes = make([]StringTableClass, classCount) 57 stringTable.Classes = make([]StringTableClass, classCount)
@@ -69,10 +61,6 @@ func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) {
69 class.Parse(reader) 61 class.Parse(reader)
70 stringTable.Classes[i] = class 62 stringTable.Classes[i] = class
71 } 63 }
72 writer.AppendLine("\t\t%d Classes:", classCount)
73 writer.AppendOutputFromTemp()
74 } else {
75 writer.AppendLine("\t\tNo Class Entries")
76 } 64 }
77} 65}
78 66
@@ -91,10 +79,8 @@ func (stringTableEntry *StringTableEntry) Parse(reader *bitreader.Reader) {
91 79
92func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) { 80func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) {
93 stringTableClass.Name = reader.TryReadString() 81 stringTableClass.Name = reader.TryReadString()
94 writer.TempAppendLine("\t\t\tName: %s", stringTableClass.Name)
95 if reader.TryReadBool() { 82 if reader.TryReadBool() {
96 dataLen := reader.TryReadBits(16) 83 dataLen := reader.TryReadBits(16)
97 stringTableClass.Data = reader.TryReadStringLength(dataLen) 84 stringTableClass.Data = reader.TryReadStringLength(dataLen)
98 writer.TempAppendLine("\t\t\tData: %s", stringTableClass.Data)
99 } 85 }
100} 86}
diff --git a/pkg/classes/userCmd.go b/pkg/classes/userCmd.go
index 24969f1..a4bf3d4 100644
--- a/pkg/classes/userCmd.go
+++ b/pkg/classes/userCmd.go
@@ -2,7 +2,6 @@ package classes
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type UserCmd struct { 7type UserCmd struct {
@@ -78,14 +77,6 @@ func (userCmd *UserCmd) ParseUserCmdInfo(reader *bitreader.Reader) {
78 if reader.TryReadBool() { 77 if reader.TryReadBool() {
79 userCmd.Data.MouseDy = reader.TryReadUInt16() 78 userCmd.Data.MouseDy = reader.TryReadUInt16()
80 } 79 }
81 writer.AppendLine("\tCommand Number: %v", userCmd.Data.CommandNumber)
82 writer.AppendLine("\tTick Count: %v", userCmd.Data.TickCount)
83 writer.AppendLine("\tView Angles: %v", []float32{userCmd.Data.ViewAnglesX, userCmd.Data.ViewAnglesY, userCmd.Data.ViewAnglesZ})
84 writer.AppendLine("\tMovement: %v", []float32{userCmd.Data.ForwardMove, userCmd.Data.SideMove, userCmd.Data.UpMove})
85 writer.AppendLine("\tButtons: %v", Buttons(userCmd.Data.Buttons).GetButtons())
86 writer.AppendLine("\tImpulse: %v", userCmd.Data.Impulse)
87 writer.AppendLine("\tWeapon, Subtype: %v, %v", userCmd.Data.WeaponSelect, userCmd.Data.WeaponSubType)
88 writer.AppendLine("\tMouse Dx, Mouse Dy: %v, %v", userCmd.Data.MouseDx, userCmd.Data.MouseDy)
89} 80}
90 81
91func (button Buttons) GetButtons() []string { 82func (button Buttons) GetButtons() []string {
diff --git a/pkg/messages/messages.go b/pkg/messages/messages.go
index 5cc781d..9b2422f 100644
--- a/pkg/messages/messages.go
+++ b/pkg/messages/messages.go
@@ -1,11 +1,8 @@
1package messages 1package messages
2 2
3import ( 3import (
4 "reflect"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 messages "github.com/pektezol/demoparser/pkg/messages/types" 5 messages "github.com/pektezol/demoparser/pkg/messages/types"
8 "github.com/pektezol/demoparser/pkg/writer"
9) 6)
10 7
11func ParseMessages(messageType uint64, reader *bitreader.Reader) any { 8func ParseMessages(messageType uint64, reader *bitreader.Reader) any {
@@ -82,7 +79,5 @@ func ParseMessages(messageType uint64, reader *bitreader.Reader) any {
82 default: 79 default:
83 return nil 80 return nil
84 } 81 }
85 writer.AppendLine("\tMessage: %s (%d):", reflect.ValueOf(messageData).Type(), messageType)
86 writer.AppendOutputFromTemp()
87 return messageData 82 return messageData
88} 83}
diff --git a/pkg/messages/types/netDisconnect.go b/pkg/messages/types/netDisconnect.go
index c2e22c1..10a8b05 100644
--- a/pkg/messages/types/netDisconnect.go
+++ b/pkg/messages/types/netDisconnect.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type NetDisconnect struct { 7type NetDisconnect struct {
@@ -13,6 +12,6 @@ func ParseNetDisconnect(reader *bitreader.Reader) NetDisconnect {
13 netDisconnect := NetDisconnect{ 12 netDisconnect := NetDisconnect{
14 Text: reader.TryReadString(), 13 Text: reader.TryReadString(),
15 } 14 }
16 writer.TempAppendLine("\t\tText: %s", netDisconnect.Text) 15
17 return netDisconnect 16 return netDisconnect
18} 17}
diff --git a/pkg/messages/types/netFile.go b/pkg/messages/types/netFile.go
index 4ebd770..fc65229 100644
--- a/pkg/messages/types/netFile.go
+++ b/pkg/messages/types/netFile.go
@@ -4,7 +4,6 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type NetFile struct { 9type NetFile struct {
@@ -40,8 +39,6 @@ func ParseNetFile(reader *bitreader.Reader) NetFile {
40 FileName: reader.TryReadString(), 39 FileName: reader.TryReadString(),
41 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(), 40 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(),
42 } 41 }
43 writer.TempAppendLine("\t\tTransfer ID: %d", netFile.TransferId) 42
44 writer.TempAppendLine("\t\tFile Name: %s", netFile.FileName)
45 writer.TempAppendLine("\t\tFile Flags: %s", netFile.FileFlags)
46 return netFile 43 return netFile
47} 44}
diff --git a/pkg/messages/types/netNop.go b/pkg/messages/types/netNop.go
index 0ee1d0d..826da6b 100644
--- a/pkg/messages/types/netNop.go
+++ b/pkg/messages/types/netNop.go
@@ -2,12 +2,11 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type NetNop struct{} 7type NetNop struct{}
9 8
10func ParseNetNop(reader *bitreader.Reader) NetNop { 9func ParseNetNop(reader *bitreader.Reader) NetNop {
11 writer.TempAppendLine("\t\t{}") 10
12 return NetNop{} 11 return NetNop{}
13} 12}
diff --git a/pkg/messages/types/netSetConVar.go b/pkg/messages/types/netSetConVar.go
index 530cb6b..03e9e0d 100644
--- a/pkg/messages/types/netSetConVar.go
+++ b/pkg/messages/types/netSetConVar.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type NetSetConVar struct { 7type NetSetConVar struct {
@@ -18,13 +17,13 @@ type conVar struct {
18func ParseNetSetConVar(reader *bitreader.Reader) NetSetConVar { 17func ParseNetSetConVar(reader *bitreader.Reader) NetSetConVar {
19 length := reader.TryReadUInt8() 18 length := reader.TryReadUInt8()
20 convars := []conVar{} 19 convars := []conVar{}
21 writer.TempAppendLine("\t\tLength: %d", length) 20
22 for count := 0; count < int(length); count++ { 21 for count := 0; count < int(length); count++ {
23 convar := conVar{ 22 convar := conVar{
24 Name: reader.TryReadString(), 23 Name: reader.TryReadString(),
25 Value: reader.TryReadString(), 24 Value: reader.TryReadString(),
26 } 25 }
27 writer.TempAppendLine("\t\t[%d] %s: %s", count, convar.Name, convar.Value) 26
28 convars = append(convars, convar) 27 convars = append(convars, convar)
29 } 28 }
30 return NetSetConVar{ 29 return NetSetConVar{
diff --git a/pkg/messages/types/netSignOnState.go b/pkg/messages/types/netSignOnState.go
index f784b0a..65e17a4 100644
--- a/pkg/messages/types/netSignOnState.go
+++ b/pkg/messages/types/netSignOnState.go
@@ -4,7 +4,6 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type NetSignOnState struct { 9type NetSignOnState struct {
@@ -60,17 +59,15 @@ func ParseNetSignOnState(reader *bitreader.Reader) NetSignOnState {
60 NumServerPlayers: reader.TryReadUInt32(), 59 NumServerPlayers: reader.TryReadUInt32(),
61 IdsLength: reader.TryReadUInt32(), 60 IdsLength: reader.TryReadUInt32(),
62 } 61 }
63 writer.TempAppendLine("\t\tSign On State: %s", netSignOnState.SignOnState) 62
64 writer.TempAppendLine("\t\tSpawn Count: %d", netSignOnState.SpawnCount)
65 writer.TempAppendLine("\t\tNumber Of Server Players: %d", netSignOnState.NumServerPlayers)
66 if netSignOnState.IdsLength > 0 { 63 if netSignOnState.IdsLength > 0 {
67 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength)) 64 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength))
68 writer.TempAppendLine("\t\tPlayer Network IDs: %v", netSignOnState.PlayersNetworksIds) 65
69 } 66 }
70 netSignOnState.MapNameLength = reader.TryReadUInt32() 67 netSignOnState.MapNameLength = reader.TryReadUInt32()
71 if netSignOnState.MapNameLength > 0 { 68 if netSignOnState.MapNameLength > 0 {
72 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength)) 69 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength))
73 writer.TempAppendLine("\t\tMap Name: %s", netSignOnState.MapName) 70
74 } 71 }
75 return netSignOnState 72 return netSignOnState
76} 73}
diff --git a/pkg/messages/types/netSplitScreenUser.go b/pkg/messages/types/netSplitScreenUser.go
index 6068a28..8b14f63 100644
--- a/pkg/messages/types/netSplitScreenUser.go
+++ b/pkg/messages/types/netSplitScreenUser.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type NetSplitScreenUser struct { 7type NetSplitScreenUser struct {
@@ -13,6 +12,6 @@ func ParseNetSplitScreenUser(reader *bitreader.Reader) NetSplitScreenUser {
13 netSplitScreenUser := NetSplitScreenUser{ 12 netSplitScreenUser := NetSplitScreenUser{
14 Slot: reader.TryReadBool(), 13 Slot: reader.TryReadBool(),
15 } 14 }
16 writer.TempAppendLine("\t\tSlot: %t", netSplitScreenUser.Slot) 15
17 return netSplitScreenUser 16 return netSplitScreenUser
18} 17}
diff --git a/pkg/messages/types/netStringCmd.go b/pkg/messages/types/netStringCmd.go
index 57ae813..2f7e830 100644
--- a/pkg/messages/types/netStringCmd.go
+++ b/pkg/messages/types/netStringCmd.go
@@ -1,10 +1,7 @@
1package messages 1package messages
2 2
3import ( 3import (
4 "strings"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 5)
9 6
10type NetStringCmd struct { 7type NetStringCmd struct {
@@ -15,6 +12,6 @@ func ParseNetStringCmd(reader *bitreader.Reader) NetStringCmd {
15 netStringCmd := NetStringCmd{ 12 netStringCmd := NetStringCmd{
16 Command: reader.TryReadString(), 13 Command: reader.TryReadString(),
17 } 14 }
18 writer.TempAppendLine("\t\tCommand: \"%s\"", strings.TrimSpace(netStringCmd.Command)) 15
19 return netStringCmd 16 return netStringCmd
20} 17}
diff --git a/pkg/messages/types/netTick.go b/pkg/messages/types/netTick.go
index 1c01171..49e997e 100644
--- a/pkg/messages/types/netTick.go
+++ b/pkg/messages/types/netTick.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type NetTick struct { 7type NetTick struct {
@@ -17,8 +16,6 @@ func ParseNetTick(reader *bitreader.Reader) NetTick {
17 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5, 16 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5,
18 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5, 17 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5,
19 } 18 }
20 writer.TempAppendLine("\t\tTick: %d", netTick.Tick) 19
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 20 return netTick
24} 21}
diff --git a/pkg/messages/types/svcBspDecal.go b/pkg/messages/types/svcBspDecal.go
index cf94c1d..6bf96a3 100644
--- a/pkg/messages/types/svcBspDecal.go
+++ b/pkg/messages/types/svcBspDecal.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcBspDecal struct { 7type SvcBspDecal struct {
@@ -28,11 +27,7 @@ func ParseSvcBspDecal(reader *bitreader.Reader) SvcBspDecal {
28 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11)) 27 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11))
29 } 28 }
30 svcBspDecal.LowPriority = reader.TryReadBool() 29 svcBspDecal.LowPriority = reader.TryReadBool()
31 writer.TempAppendLine("\t\tPosition: %v", svcBspDecal.Pos) 30
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)
36 return svcBspDecal 31 return svcBspDecal
37} 32}
38 33
diff --git a/pkg/messages/types/svcClassInfo.go b/pkg/messages/types/svcClassInfo.go
index 384c501..a20bfa3 100644
--- a/pkg/messages/types/svcClassInfo.go
+++ b/pkg/messages/types/svcClassInfo.go
@@ -4,7 +4,6 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type SvcClassInfo struct { 9type SvcClassInfo struct {
@@ -25,19 +24,17 @@ func ParseSvcClassInfo(reader *bitreader.Reader) SvcClassInfo {
25 CreateOnClient: reader.TryReadBool(), 24 CreateOnClient: reader.TryReadBool(),
26 } 25 }
27 classes := []serverClass{} 26 classes := []serverClass{}
28 writer.TempAppendLine("\t\tCreate On Client: %t", svcClassInfo.CreateOnClient) 27
29 if !svcClassInfo.CreateOnClient { 28 if !svcClassInfo.CreateOnClient {
30 writer.TempAppendLine("\t\t%d Server Classes:", svcClassInfo.ClassCount) 29
31 for count := 0; count < int(svcClassInfo.ClassCount); count++ { 30 for count := 0; count < int(svcClassInfo.ClassCount); count++ {
32 classes = append(classes, serverClass{ 31 classes = append(classes, serverClass{
33 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))), 32 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))),
34 ClassName: reader.TryReadString(), 33 ClassName: reader.TryReadString(),
35 DataTableName: reader.TryReadString(), 34 DataTableName: reader.TryReadString(),
36 }) 35 })
37 writer.TempAppendLine("\t\t\t[%d] %s (%s)", classes[len(classes)-1].ClassId, classes[len(classes)-1].ClassName, classes[len(classes)-1].DataTableName) 36
38 } 37 }
39 } else {
40 writer.TempAppendLine("\t\t%d Server Classes", svcClassInfo.ClassCount)
41 } 38 }
42 svcClassInfo.ServerClasses = classes 39 svcClassInfo.ServerClasses = classes
43 return svcClassInfo 40 return svcClassInfo
diff --git a/pkg/messages/types/svcCmdKeyValues.go b/pkg/messages/types/svcCmdKeyValues.go
index 5c80d0b..61d6290 100644
--- a/pkg/messages/types/svcCmdKeyValues.go
+++ b/pkg/messages/types/svcCmdKeyValues.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcCmdKeyValues struct { 7type SvcCmdKeyValues struct {
@@ -15,6 +14,6 @@ func ParseSvcCmdKeyValues(reader *bitreader.Reader) SvcCmdKeyValues {
15 Length: reader.TryReadUInt32(), 14 Length: reader.TryReadUInt32(),
16 } 15 }
17 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length)) 16 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length))
18 writer.TempAppendLine("\t\tData: %v", svcCmdKeyValues.Data) 17
19 return svcCmdKeyValues 18 return svcCmdKeyValues
20} 19}
diff --git a/pkg/messages/types/svcCreateStringTable.go b/pkg/messages/types/svcCreateStringTable.go
index ff2e27d..8d36fcf 100644
--- a/pkg/messages/types/svcCreateStringTable.go
+++ b/pkg/messages/types/svcCreateStringTable.go
@@ -4,7 +4,6 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type SvcCreateStringTable struct { 9type SvcCreateStringTable struct {
@@ -32,13 +31,7 @@ func ParseSvcCreateStringTable(reader *bitreader.Reader) SvcCreateStringTable {
32 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4)) 31 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4))
33 } 32 }
34 svcCreateStringTable.Flags = int8(reader.TryReadBits(2)) 33 svcCreateStringTable.Flags = int8(reader.TryReadBits(2))
35 writer.TempAppendLine("\t\tName: %s", svcCreateStringTable.Name) 34
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)
42 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing 35 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing
43 return svcCreateStringTable 36 return svcCreateStringTable
44} 37}
diff --git a/pkg/messages/types/svcCrosshairAngle.go b/pkg/messages/types/svcCrosshairAngle.go
index efd6d77..f689876 100644
--- a/pkg/messages/types/svcCrosshairAngle.go
+++ b/pkg/messages/types/svcCrosshairAngle.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcCrosshairAngle struct { 7type SvcCrosshairAngle struct {
@@ -23,8 +22,6 @@ func ParseSvcCrosshairAngle(reader *bitreader.Reader) SvcCrosshairAngle {
23 Z: float32(reader.TryReadBits(16)), 22 Z: float32(reader.TryReadBits(16)),
24 }, 23 },
25 } 24 }
26 writer.TempAppendLine("\t\tX: %f", svcCrosshairAngle.Angle.X) 25
27 writer.TempAppendLine("\t\tY: %f", svcCrosshairAngle.Angle.Y)
28 writer.TempAppendLine("\t\tZ: %f", svcCrosshairAngle.Angle.Z)
29 return svcCrosshairAngle 26 return svcCrosshairAngle
30} 27}
diff --git a/pkg/messages/types/svcEntityMessage.go b/pkg/messages/types/svcEntityMessage.go
index a511fea..c4676ec 100644
--- a/pkg/messages/types/svcEntityMessage.go
+++ b/pkg/messages/types/svcEntityMessage.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcEntityMessage struct { 7type SvcEntityMessage struct {
@@ -19,8 +18,6 @@ func ParseSvcEntityMessage(reader *bitreader.Reader) SvcEntityMessage {
19 Length: uint16(reader.TryReadBits(11)), 18 Length: uint16(reader.TryReadBits(11)),
20 } 19 }
21 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length)) 20 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length))
22 writer.TempAppendLine("\t\tEntity Index: %d", svcEntityMessage.EntityIndex) 21
23 writer.TempAppendLine("\t\tClass ID: %d", svcEntityMessage.ClassId)
24 writer.TempAppendLine("\t\tData: %v", svcEntityMessage.Data)
25 return svcEntityMessage 22 return svcEntityMessage
26} 23}
diff --git a/pkg/messages/types/svcFixAngle.go b/pkg/messages/types/svcFixAngle.go
index b79c02d..f00c239 100644
--- a/pkg/messages/types/svcFixAngle.go
+++ b/pkg/messages/types/svcFixAngle.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcFixAngle struct { 7type SvcFixAngle struct {
@@ -25,9 +24,6 @@ func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle {
25 Z: float32(reader.TryReadBits(16)), 24 Z: float32(reader.TryReadBits(16)),
26 }, 25 },
27 } 26 }
28 writer.TempAppendLine("\t\tRelative: %t", svcFixAngle.Relative) 27
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 28 return svcFixAngle
33} 29}
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go
index e12d75a..ec96653 100644
--- a/pkg/messages/types/svcGameEvent.go
+++ b/pkg/messages/types/svcGameEvent.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcGameEvent struct { 7type SvcGameEvent struct {
@@ -15,6 +14,6 @@ func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent {
15 Length: uint16(reader.TryReadBits(11)), 14 Length: uint16(reader.TryReadBits(11)),
16 } 15 }
17 svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)) 16 svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length))
18 writer.TempAppendLine("\t\tData: %v", svcGameEvent.Data) 17
19 return svcGameEvent 18 return svcGameEvent
20} 19}
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go
index 1fa7589..ca2cf76 100644
--- a/pkg/messages/types/svcGameEventList.go
+++ b/pkg/messages/types/svcGameEventList.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcGameEventList struct { 7type SvcGameEventList struct {
@@ -20,6 +19,6 @@ func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList {
20 Length: int32(reader.TryReadBits(20)), 19 Length: int32(reader.TryReadBits(20)),
21 } 20 }
22 reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)) 21 reader.TryReadBitsToSlice(uint64(svcGameEventList.Length))
23 writer.TempAppendLine("\t\tEvents: %d", svcGameEventList.Events) 22
24 return svcGameEventList 23 return svcGameEventList
25} 24}
diff --git a/pkg/messages/types/svcGetCvarValue.go b/pkg/messages/types/svcGetCvarValue.go
index 939e6b6..b0513d0 100644
--- a/pkg/messages/types/svcGetCvarValue.go
+++ b/pkg/messages/types/svcGetCvarValue.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcGetCvarValue struct { 7type SvcGetCvarValue struct {
@@ -15,7 +14,6 @@ func ParseSvcGetCvarValue(reader *bitreader.Reader) SvcGetCvarValue {
15 Cookie: reader.TryReadSInt32(), 14 Cookie: reader.TryReadSInt32(),
16 CvarName: reader.TryReadString(), 15 CvarName: reader.TryReadString(),
17 } 16 }
18 writer.TempAppendLine("\t\tCookie: %d", svcGetCvarValue.Cookie) 17
19 writer.TempAppendLine("\t\tCvar: \"%s\"", svcGetCvarValue.CvarName)
20 return svcGetCvarValue 18 return svcGetCvarValue
21} 19}
diff --git a/pkg/messages/types/svcMenu.go b/pkg/messages/types/svcMenu.go
index 33ccb70..df14048 100644
--- a/pkg/messages/types/svcMenu.go
+++ b/pkg/messages/types/svcMenu.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcMenu struct { 7type SvcMenu struct {
@@ -17,7 +16,6 @@ func ParseSvcMenu(reader *bitreader.Reader) SvcMenu {
17 Length: reader.TryReadUInt32(), 16 Length: reader.TryReadUInt32(),
18 } 17 }
19 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length)) 18 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length))
20 writer.TempAppendLine("\t\tType: %d", svcMenu.Type) 19
21 writer.TempAppendLine("\t\tData: %v", svcMenu.Data)
22 return svcMenu 20 return svcMenu
23} 21}
diff --git a/pkg/messages/types/svcPacketEntities.go b/pkg/messages/types/svcPacketEntities.go
index 05b6794..8000a55 100644
--- a/pkg/messages/types/svcPacketEntities.go
+++ b/pkg/messages/types/svcPacketEntities.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcPacketEntities struct { 7type SvcPacketEntities struct {
@@ -31,12 +30,6 @@ func ParseSvcPacketEntities(reader *bitreader.Reader) SvcPacketEntities {
31 svcPacketEntities.Length = uint32(reader.TryReadBits(20)) 30 svcPacketEntities.Length = uint32(reader.TryReadBits(20))
32 svcPacketEntities.UpdatedBaseline = reader.TryReadBool() 31 svcPacketEntities.UpdatedBaseline = reader.TryReadBool()
33 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length)) 32 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length))
34 writer.TempAppendLine("\t\tMax Entries: %d", svcPacketEntities.MaxEntries) 33
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)
41 return svcPacketEntities 34 return svcPacketEntities
42} 35}
diff --git a/pkg/messages/types/svcPaintmapData.go b/pkg/messages/types/svcPaintmapData.go
index 40f6ad0..49aa433 100644
--- a/pkg/messages/types/svcPaintmapData.go
+++ b/pkg/messages/types/svcPaintmapData.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcPaintmapData struct { 7type SvcPaintmapData struct {
@@ -15,6 +14,6 @@ func ParseSvcPaintmapData(reader *bitreader.Reader) SvcPaintmapData {
15 Length: reader.TryReadUInt32(), 14 Length: reader.TryReadUInt32(),
16 } 15 }
17 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length)) 16 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length))
18 writer.TempAppendLine("\t\tData: %v", svcPaintmapData.Data) 17
19 return svcPaintmapData 18 return svcPaintmapData
20} 19}
diff --git a/pkg/messages/types/svcPrefetch.go b/pkg/messages/types/svcPrefetch.go
index b71e61f..a9a88fe 100644
--- a/pkg/messages/types/svcPrefetch.go
+++ b/pkg/messages/types/svcPrefetch.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcPrefetch struct { 7type SvcPrefetch struct {
@@ -13,6 +12,6 @@ func ParseSvcPrefetch(reader *bitreader.Reader) SvcPrefetch {
13 svcPrefetch := SvcPrefetch{ 12 svcPrefetch := SvcPrefetch{
14 SoundIndex: int16(reader.TryReadBits(13)), 13 SoundIndex: int16(reader.TryReadBits(13)),
15 } 14 }
16 writer.TempAppendLine("\t\tSound Index: %d", svcPrefetch.SoundIndex) 15
17 return svcPrefetch 16 return svcPrefetch
18} 17}
diff --git a/pkg/messages/types/svcPrint.go b/pkg/messages/types/svcPrint.go
index 760a3c5..5868ab2 100644
--- a/pkg/messages/types/svcPrint.go
+++ b/pkg/messages/types/svcPrint.go
@@ -1,10 +1,7 @@
1package messages 1package messages
2 2
3import ( 3import (
4 "strings"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 5)
9 6
10type SvcPrint struct { 7type SvcPrint struct {
@@ -16,6 +13,6 @@ func ParseSvcPrint(reader *bitreader.Reader) SvcPrint {
16 Message: reader.TryReadString(), 13 Message: reader.TryReadString(),
17 } 14 }
18 // common psycopath behaviour 15 // 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)) 16
20 return svcPrint 17 return svcPrint
21} 18}
diff --git a/pkg/messages/types/svcSendTable.go b/pkg/messages/types/svcSendTable.go
index 78df195..4397db0 100644
--- a/pkg/messages/types/svcSendTable.go
+++ b/pkg/messages/types/svcSendTable.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcSendTable struct { 7type SvcSendTable struct {
@@ -17,8 +16,6 @@ func ParseSvcSendTable(reader *bitreader.Reader) SvcSendTable {
17 Length: reader.TryReadUInt8(), 16 Length: reader.TryReadUInt8(),
18 } 17 }
19 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length))) 18 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length)))
20 writer.TempAppendLine("\t\tNeeds Decoder: %t", svcSendTable.NeedsDecoder) 19
21 writer.TempAppendLine("\t\tLength: %d", svcSendTable.Length)
22 writer.TempAppendLine("\t\tProps: %d", svcSendTable.Props)
23 return svcSendTable 20 return svcSendTable
24} 21}
diff --git a/pkg/messages/types/svcServerInfo.go b/pkg/messages/types/svcServerInfo.go
index a6acd53..507b7ca 100644
--- a/pkg/messages/types/svcServerInfo.go
+++ b/pkg/messages/types/svcServerInfo.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcServerInfo struct { 7type SvcServerInfo struct {
@@ -43,21 +42,6 @@ func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo {
43 SkyName: reader.TryReadString(), 42 SkyName: reader.TryReadString(),
44 HostName: reader.TryReadString(), 43 HostName: reader.TryReadString(),
45 } 44 }
46 writer.TempAppendLine("\t\tNetwork Protocol: %d", svcServerInfo.Protocol) 45
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 46 return svcServerInfo
63} 47}
diff --git a/pkg/messages/types/svcSetPause.go b/pkg/messages/types/svcSetPause.go
index d979ac5..1f6f25f 100644
--- a/pkg/messages/types/svcSetPause.go
+++ b/pkg/messages/types/svcSetPause.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcSetPause struct { 7type SvcSetPause struct {
@@ -13,6 +12,6 @@ func ParseSvcSetPause(reader *bitreader.Reader) SvcSetPause {
13 svcSetPause := SvcSetPause{ 12 svcSetPause := SvcSetPause{
14 Paused: reader.TryReadBool(), 13 Paused: reader.TryReadBool(),
15 } 14 }
16 writer.TempAppendLine("\t\tPaused: %t", svcSetPause.Paused) 15
17 return svcSetPause 16 return svcSetPause
18} 17}
diff --git a/pkg/messages/types/svcSetView.go b/pkg/messages/types/svcSetView.go
index bdb6203..a60d547 100644
--- a/pkg/messages/types/svcSetView.go
+++ b/pkg/messages/types/svcSetView.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcSetView struct { 7type SvcSetView struct {
@@ -13,6 +12,6 @@ func ParseSvcSetView(reader *bitreader.Reader) SvcSetView {
13 svcSetView := SvcSetView{ 12 svcSetView := SvcSetView{
14 EntityIndex: uint16(reader.TryReadBits(11)), 13 EntityIndex: uint16(reader.TryReadBits(11)),
15 } 14 }
16 writer.TempAppendLine("\t\tEntity Index: %d", svcSetView.EntityIndex) 15
17 return svcSetView 16 return svcSetView
18} 17}
diff --git a/pkg/messages/types/svcSounds.go b/pkg/messages/types/svcSounds.go
index 1affeb4..34d99f6 100644
--- a/pkg/messages/types/svcSounds.go
+++ b/pkg/messages/types/svcSounds.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcSounds struct { 7type SvcSounds struct {
@@ -24,8 +23,6 @@ func ParseSvcSounds(reader *bitreader.Reader) SvcSounds {
24 svcSounds.Length = reader.TryReadUInt16() 23 svcSounds.Length = reader.TryReadUInt16()
25 } 24 }
26 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length)) 25 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length))
27 writer.TempAppendLine("\t\tReliable Sound: %t", svcSounds.ReliableSound) 26
28 writer.TempAppendLine("\t\tSound Count: %d", svcSounds.SoundCount)
29 writer.TempAppendLine("\t\tData: %v", svcSounds.Data)
30 return svcSounds 27 return svcSounds
31} 28}
diff --git a/pkg/messages/types/svcSplitScreen.go b/pkg/messages/types/svcSplitScreen.go
index 653438a..fc6acb4 100644
--- a/pkg/messages/types/svcSplitScreen.go
+++ b/pkg/messages/types/svcSplitScreen.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcSplitScreen struct { 7type SvcSplitScreen struct {
@@ -17,7 +16,6 @@ func ParseSvcSplitScreen(reader *bitreader.Reader) SvcSplitScreen {
17 Length: uint16(reader.TryReadBits(11)), 16 Length: uint16(reader.TryReadBits(11)),
18 } 17 }
19 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length)) 18 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length))
20 writer.TempAppendLine("\t\tRemove User: %t", svcSplitScreen.RemoveUser) 19
21 writer.TempAppendLine("\t\tData: %v", svcSplitScreen.Data)
22 return svcSplitScreen 20 return svcSplitScreen
23} 21}
diff --git a/pkg/messages/types/svcTempEntities.go b/pkg/messages/types/svcTempEntities.go
index 407bfd6..41b1afb 100644
--- a/pkg/messages/types/svcTempEntities.go
+++ b/pkg/messages/types/svcTempEntities.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcTempEntities struct { 7type SvcTempEntities struct {
@@ -17,7 +16,6 @@ func ParseSvcTempEntities(reader *bitreader.Reader) SvcTempEntities {
17 Length: uint32(reader.TryReadBits(17)), 16 Length: uint32(reader.TryReadBits(17)),
18 } 17 }
19 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length)) 18 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length))
20 writer.TempAppendLine("\t\tNumber Of Entries: %d", svcTempEntities.NumEntries) 19
21 writer.TempAppendLine("\t\tData: %v", svcTempEntities.Data)
22 return svcTempEntities 20 return svcTempEntities
23} 21}
diff --git a/pkg/messages/types/svcUpdateStringTable.go b/pkg/messages/types/svcUpdateStringTable.go
index 68c8fb5..ca716eb 100644
--- a/pkg/messages/types/svcUpdateStringTable.go
+++ b/pkg/messages/types/svcUpdateStringTable.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcUpdateStringTable struct { 7type SvcUpdateStringTable struct {
@@ -21,7 +20,6 @@ func ParseSvcUpdateStringTable(reader *bitreader.Reader) SvcUpdateStringTable {
21 } 20 }
22 svcUpdateStringTable.Length = int32(reader.TryReadBits(20)) 21 svcUpdateStringTable.Length = int32(reader.TryReadBits(20))
23 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length)) 22 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length))
24 writer.TempAppendLine("\t\tTable ID: %d", svcUpdateStringTable.TableId) 23
25 writer.TempAppendLine("\t\tNumber Of Changed Entries: %d", svcUpdateStringTable.NumChangedEntries)
26 return svcUpdateStringTable 24 return svcUpdateStringTable
27} 25}
diff --git a/pkg/messages/types/svcUserMessage.go b/pkg/messages/types/svcUserMessage.go
index 35c9e2d..652fbb5 100644
--- a/pkg/messages/types/svcUserMessage.go
+++ b/pkg/messages/types/svcUserMessage.go
@@ -4,7 +4,6 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/writer"
8) 7)
9 8
10type SvcUserMessage struct { 9type SvcUserMessage struct {
@@ -20,702 +19,13 @@ func ParseSvcUserMessage(reader *bitreader.Reader) SvcUserMessage {
20 } 19 }
21 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length)) 20 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length))
22 userMessageReader := bitreader.NewReaderFromBytes(svcUserMessage.Data.([]byte), true) 21 userMessageReader := bitreader.NewReaderFromBytes(svcUserMessage.Data.([]byte), true)
23 writer.TempAppendLine("\t\t%s (%d):", UserMessageType(svcUserMessage.Type).String(), svcUserMessage.Type) 22 switch svcUserMessage.Type {
24 switch UserMessageType(svcUserMessage.Type) { 23 case 60:
25 case EUserMessageTypeGeiger:
26 svcUserMessage.parseGeiger(userMessageReader)
27 case EUserMessageTypeTrain:
28 svcUserMessage.parseTrain(userMessageReader)
29 case EUserMessageTypeHudText:
30 svcUserMessage.parseHUDText(userMessageReader)
31 case EUserMessageTypeSayText:
32 svcUserMessage.parseSayText(userMessageReader)
33 case EUserMessageTypeSayText2:
34 svcUserMessage.parseSayText2(userMessageReader)
35 case EUserMessageTypeTextMsg:
36 svcUserMessage.parseTextMsg(userMessageReader)
37 case EUserMessageTypeHUDMsg:
38 svcUserMessage.parseHUDMsg(userMessageReader)
39 case EUserMessageTypeResetHUD:
40 svcUserMessage.parseResetHUD(userMessageReader)
41 case EUserMessageTypeShake:
42 svcUserMessage.parseShake(userMessageReader)
43 case EUserMessageTypeFade:
44 svcUserMessage.parseFade(userMessageReader)
45 case EUserMessageTypeVGUIMenu:
46 svcUserMessage.parseVguiMenu(userMessageReader)
47 case EUserMessageTypeRumble:
48 svcUserMessage.parseRumble(userMessageReader)
49 case EUserMessageTypeBattery:
50 svcUserMessage.parseBattery(userMessageReader)
51 case EUserMessageTypeDamage:
52 svcUserMessage.parseDamage(userMessageReader)
53 case EUserMessageTypeVoiceMask:
54 svcUserMessage.parseVoiceMask(userMessageReader)
55 case EUserMessageTypeCloseCaption:
56 svcUserMessage.parseCloseCaption(userMessageReader)
57 case EUserMessageTypeKeyHintText:
58 svcUserMessage.parseKeyHintText(userMessageReader)
59 case EUserMessageTypeLogoTimeMsg:
60 svcUserMessage.parseLogoTimeMsg(userMessageReader)
61 case EUserMessageTypeAchievementEvent:
62 svcUserMessage.parseAchivementEvent(userMessageReader)
63 case EUserMessageTypeMPMapCompleted:
64 svcUserMessage.parseMpMapCompleted(userMessageReader)
65 case EUserMessageTypeMPMapIncomplete:
66 svcUserMessage.parseMpMapIncomplete(userMessageReader)
67 case EUserMessageTypeMPTauntEarned:
68 svcUserMessage.parseMpTauntEarned(userMessageReader)
69 case EUserMessageTypeMPTauntLocked:
70 svcUserMessage.parseMpTauntLocked(userMessageReader)
71 case EUserMessageTypePortalFX_Surface:
72 svcUserMessage.parsePortalFxSurface(userMessageReader)
73 case EUserMessageTypeScoreboardTempUpdate:
74 svcUserMessage.parseScoreboardTempUpdate(userMessageReader) 24 svcUserMessage.parseScoreboardTempUpdate(userMessageReader)
75 default:
76 writer.TempAppendLine("\t\t\tData: %v", svcUserMessage.Data)
77 } 25 }
78 return svcUserMessage 26 return svcUserMessage
79} 27}
80 28
81func (svcUserMessage *SvcUserMessage) parseGeiger(reader *bitreader.Reader) {
82 geiger := struct{ Range uint8 }{
83 Range: reader.TryReadUInt8(),
84 }
85 svcUserMessage.Data = geiger
86 writer.TempAppendLine("\t\t\tGeiger Range: %d", geiger.Range)
87}
88
89func (svcUserMessage *SvcUserMessage) parseTrain(reader *bitreader.Reader) {
90 train := struct{ Pos uint8 }{
91 Pos: reader.TryReadUInt8(),
92 }
93 svcUserMessage.Data = train
94 writer.TempAppendLine("\t\t\tPos: %d", train.Pos)
95}
96
97func (svcUserMessage *SvcUserMessage) parseHUDText(reader *bitreader.Reader) {
98 hudText := struct{ Text string }{
99 Text: reader.TryReadString(),
100 }
101 svcUserMessage.Data = hudText
102 writer.TempAppendLine("\t\t\tText: %s", hudText.Text)
103}
104
105func (svcUserMessage *SvcUserMessage) parseSayText(reader *bitreader.Reader) {
106 sayText := struct {
107 Client uint8
108 Message string
109 WantsToChat bool
110 }{
111 Client: reader.TryReadUInt8(),
112 Message: reader.TryReadString(),
113 WantsToChat: reader.TryReadUInt8() != 0,
114 }
115 svcUserMessage.Data = sayText
116 writer.TempAppendLine("\t\t\tClient: %d", sayText.Client)
117 writer.TempAppendLine("\t\t\tMessage: %s", sayText.Message)
118 writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText.WantsToChat)
119}
120
121func (svcUserMessage *SvcUserMessage) parseSayText2(reader *bitreader.Reader) {
122 sayText2 := struct {
123 Client uint8
124 WantsToChat bool
125 MessageName string
126 Messages []string
127 }{
128 Client: reader.TryReadUInt8(),
129 WantsToChat: reader.TryReadUInt8() != 0,
130 MessageName: reader.TryReadString(),
131 Messages: []string{reader.TryReadString(), reader.TryReadString(), reader.TryReadString()},
132 }
133 svcUserMessage.Data = sayText2
134 writer.TempAppendLine("\t\t\tClient: %d", sayText2.Client)
135 writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText2.WantsToChat)
136 writer.TempAppendLine("\t\t\tName: %s", sayText2.MessageName)
137 for index, message := range sayText2.Messages {
138 writer.TempAppendLine("\t\t\tMessage %d: %s", index, message)
139 }
140}
141
142func (svcUserMessage *SvcUserMessage) parseTextMsg(reader *bitreader.Reader) {
143 const MessageCount int = 5
144 textMsg := struct {
145 Destination uint8
146 Messages []string
147 }{
148 Destination: reader.TryReadUInt8(),
149 }
150 textMsg.Messages = make([]string, 5)
151 for i := 0; i < MessageCount; i++ {
152 textMsg.Messages[i] = reader.TryReadString()
153 }
154 svcUserMessage.Data = textMsg
155 writer.TempAppendLine("\t\t\tDestination: %d", textMsg.Destination)
156 for i := 0; i < MessageCount; i++ {
157 writer.TempAppendLine("\t\t\tMessage %d: %s", i+1, textMsg.Messages)
158 }
159}
160
161func (svcUserMessage *SvcUserMessage) parseHUDMsg(reader *bitreader.Reader) {
162 const MaxNetMessage uint8 = 6
163 hudMsg := struct {
164 Channel uint8
165 Info struct {
166 X, Y float32 // 0-1 & resolution independent, -1 means center in each dimension
167 R1, G1, B1, A1 uint8
168 R2, G2, B2, A2 uint8
169 Effect uint8
170 FadeIn, FadeOut, HoldTime, FxTime float32 // the fade times seem to be per character
171 Message string
172 }
173 }{
174 Channel: reader.TryReadUInt8() % MaxNetMessage,
175 }
176 svcUserMessage.Data = hudMsg
177 writer.TempAppendLine("\t\t\tChannel: %d", hudMsg.Channel)
178 if reader.TryReadRemainingBits() >= 148 {
179 hudMsg.Info = struct {
180 X float32
181 Y float32
182 R1 uint8
183 G1 uint8
184 B1 uint8
185 A1 uint8
186 R2 uint8
187 G2 uint8
188 B2 uint8
189 A2 uint8
190 Effect uint8
191 FadeIn float32
192 FadeOut float32
193 HoldTime float32
194 FxTime float32
195 Message string
196 }{
197 X: reader.TryReadFloat32(),
198 Y: reader.TryReadFloat32(),
199 R1: reader.TryReadUInt8(),
200 G1: reader.TryReadUInt8(),
201 B1: reader.TryReadUInt8(),
202 A1: reader.TryReadUInt8(),
203 R2: reader.TryReadUInt8(),
204 G2: reader.TryReadUInt8(),
205 B2: reader.TryReadUInt8(),
206 A2: reader.TryReadUInt8(),
207 Effect: reader.TryReadUInt8(),
208 FadeIn: reader.TryReadFloat32(),
209 FadeOut: reader.TryReadFloat32(),
210 HoldTime: reader.TryReadFloat32(),
211 FxTime: reader.TryReadFloat32(),
212 Message: reader.TryReadString(),
213 }
214 svcUserMessage.Data = hudMsg
215 writer.TempAppendLine("\t\t\tX: %f, Y: %f", hudMsg.Info.X, hudMsg.Info.Y)
216 writer.TempAppendLine("\t\t\tRGBA1: %3d %3d %3d %3d", hudMsg.Info.R1, hudMsg.Info.G1, hudMsg.Info.B1, hudMsg.Info.A1)
217 writer.TempAppendLine("\t\t\tRGBA2: %3d %3d %3d %3d", hudMsg.Info.R2, hudMsg.Info.G2, hudMsg.Info.B2, hudMsg.Info.A2)
218 writer.TempAppendLine("\t\t\tEffect: %d", hudMsg.Info.Effect)
219 writer.TempAppendLine("\t\t\tFade In: %f", hudMsg.Info.FadeIn)
220 writer.TempAppendLine("\t\t\tFade Out: %f", hudMsg.Info.FadeOut)
221 writer.TempAppendLine("\t\t\tHold Time: %f", hudMsg.Info.HoldTime)
222 writer.TempAppendLine("\t\t\tFX Time: %f", hudMsg.Info.FxTime)
223 writer.TempAppendLine("\t\t\tMessage: %s", hudMsg.Info.Message)
224 }
225}
226
227func (svcUserMessage *SvcUserMessage) parseResetHUD(reader *bitreader.Reader) {
228 resetHUD := struct{ Unknown uint8 }{
229 Unknown: reader.TryReadUInt8(),
230 }
231 svcUserMessage.Data = resetHUD
232 writer.TempAppendLine("\t\t\tUnknown: %d", resetHUD.Unknown)
233}
234
235func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader) {
236 type ShakeCommand uint8
237 const (
238 Start ShakeCommand = iota // Starts the screen shake for all players within the radius.
239 Stop // Stops the screen shake for all players within the radius.
240 Amplitude // Modifies the amplitude of an active screen shake for all players within the radius.
241 Frequency // Modifies the frequency of an active screen shake for all players within the radius.
242 RumbleOnly // Starts a shake effect that only rumbles the controller, no screen effect.
243 NoRumble // Starts a shake that does NOT rumble the controller.
244 )
245 shake := struct {
246 Command uint8
247 Amplitude float32
248 Frequency float32
249 Duration float32
250 }{
251 Command: reader.TryReadUInt8(),
252 Amplitude: reader.TryReadFloat32(),
253 Frequency: reader.TryReadFloat32(),
254 Duration: reader.TryReadFloat32(),
255 }
256 shakeCommandToString := func(cmd ShakeCommand) string {
257 switch cmd {
258 case Start:
259 return "Start"
260 case Stop:
261 return "Stop"
262 case Amplitude:
263 return "Amplitude"
264 case Frequency:
265 return "Frequency"
266 case RumbleOnly:
267 return "RumbleOnly"
268 case NoRumble:
269 return "NoRumble"
270 default:
271 return "Unknown"
272 }
273 }
274 svcUserMessage.Data = shake
275 writer.TempAppendLine("\t\t\tCommand: %v", shakeCommandToString(ShakeCommand(shake.Command)))
276 writer.TempAppendLine("\t\t\tAmplitude: %v", shake.Amplitude)
277 writer.TempAppendLine("\t\t\tFrequency: %v", shake.Frequency)
278 writer.TempAppendLine("\t\t\tDuration: %v", shake.Duration)
279}
280
281func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader) {
282 type FadeFlag uint16
283 const (
284 None FadeFlag = 0
285 FadeIn FadeFlag = 1
286 FadeOut FadeFlag = 1 << 1
287 Modulate FadeFlag = 1 << 2 // Modulate (don't blend)
288 StayOut FadeFlag = 1 << 3 // ignores the duration, stays faded out until new ScreenFade message received
289 Purge FadeFlag = 1 << 4 // Purges all other fades, replacing them with this one
290 )
291 fade := struct {
292 Duration float32
293 HoldTime uint16
294 Flags uint16
295 R uint8
296 G uint8
297 B uint8
298 A uint8
299 }{
300 Duration: float32(reader.TryReadUInt16()) / float32(1<<9), // might be useful: #define SCREENFADE_FRACBITS 9
301 HoldTime: reader.TryReadUInt16(),
302 Flags: reader.TryReadUInt16(),
303 R: reader.TryReadUInt8(),
304 G: reader.TryReadUInt8(),
305 B: reader.TryReadUInt8(),
306 A: reader.TryReadUInt8(),
307 }
308 getFlags := func(flags FadeFlag) []string {
309 var flagStrings []string
310 if flags&FadeIn != 0 {
311 flagStrings = append(flagStrings, "FadeIn")
312 }
313 if flags&FadeOut != 0 {
314 flagStrings = append(flagStrings, "FadeOut")
315 }
316 if flags&Modulate != 0 {
317 flagStrings = append(flagStrings, "Modulate")
318 }
319 if flags&StayOut != 0 {
320 flagStrings = append(flagStrings, "StayOut")
321 }
322 if flags&Purge != 0 {
323 flagStrings = append(flagStrings, "Purge")
324 }
325 return flagStrings
326 }
327 svcUserMessage.Data = fade
328 writer.TempAppendLine("\t\t\tDuration: %f", fade.Duration)
329 writer.TempAppendLine("\t\t\tHold Time: %d", fade.HoldTime)
330 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(FadeFlag(fade.Flags)))
331 writer.TempAppendLine("\t\t\tRGBA: %3d %3d %3d %3d", fade.R, fade.G, fade.B, fade.A)
332}
333
334func (svcUserMessage *SvcUserMessage) parseVguiMenu(reader *bitreader.Reader) {
335 vguiMenu := struct {
336 Message string
337 Show bool
338 KeyValues []map[string]string
339 }{
340 Message: reader.TryReadString(),
341 Show: reader.TryReadUInt8() != 0,
342 }
343 count := reader.TryReadUInt8()
344 for i := 0; i < int(count); i++ {
345 vguiMenu.KeyValues = append(vguiMenu.KeyValues, map[string]string{"Key": reader.TryReadString(), "Value": reader.TryReadString()})
346 }
347 svcUserMessage.Data = vguiMenu
348 writer.TempAppendLine("\t\t\tMessage: %s", vguiMenu.Message)
349 writer.TempAppendLine("\t\t\tShow: %t", vguiMenu.Show)
350 if len(vguiMenu.KeyValues) > 0 {
351 writer.TempAppendLine("\t\t\t%d Key Value Pairs:", len(vguiMenu.KeyValues))
352 for _, kv := range vguiMenu.KeyValues {
353 writer.TempAppendLine("\t\t\t\t%s: %s", kv["Key"], kv["Value"])
354 }
355 } else {
356 writer.TempAppendLine("\t\t\tNo Key Value Pairs")
357 }
358}
359
360func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader) {
361 type RumbleLookup int8
362 const (
363 RumbleInvalid RumbleLookup = -1
364 RumbleStopAll RumbleLookup = 0 // cease all current rumbling effects.
365 PhyscannonOpen RumbleLookup = 20
366 PhyscannonPunt RumbleLookup = 21
367 PhyscannonLow RumbleLookup = 22
368 PhyscannonMedium RumbleLookup = 23
369 PhyscannonHigh RumbleLookup = 24
370 PortalgunLeft RumbleLookup = 25
371 PortalgunRight RumbleLookup = 26
372 PortalPlacementFailure RumbleLookup = 27
373 )
374 getRumbleLookup := func(rumbleLookup RumbleLookup) string {
375 switch rumbleLookup {
376 case RumbleInvalid:
377 return "RumbleInvalid"
378 case RumbleStopAll:
379 return "RumbleStopAll"
380 case PhyscannonOpen:
381 return "PhyscannonOpen"
382 case PhyscannonPunt:
383 return "PhyscannonPunt"
384 case PhyscannonLow:
385 return "PhyscannonLow"
386 case PhyscannonMedium:
387 return "PhyscannonMedium"
388 case PhyscannonHigh:
389 return "PhyscannonHigh"
390 case PortalgunLeft:
391 return "PortalgunLeft"
392 case PortalgunRight:
393 return "PortalgunRight"
394 case PortalPlacementFailure:
395 return "PortalPlacementFailure"
396 default:
397 return fmt.Sprintf("%d", int(rumbleLookup))
398 }
399 }
400 type RumbleFlag uint8
401 const (
402 None RumbleFlag = 0
403 Stop RumbleFlag = 1
404 Loop RumbleFlag = 1 << 1
405 Restart RumbleFlag = 1 << 2
406 UpdateScale RumbleFlag = 1 << 3 // Apply DATA to this effect if already playing, but don't restart. <-- DATA is scale * 100
407 OnlyOne RumbleFlag = 1 << 4 // Don't play this effect if it is already playing.
408 RandomAmplitude RumbleFlag = 1 << 4 // Amplitude scale will be randomly chosen. Between 10% and 100%
409 InitialScale RumbleFlag = 1 << 4 // Data is the initial scale to start this effect ( * 100 )
410 )
411 rumble := struct {
412 Type int8
413 Scale float32
414 Flags uint8
415 }{
416 Type: reader.TryReadSInt8(),
417 Scale: float32(reader.TryReadUInt8()) / 100,
418 Flags: reader.TryReadUInt8(),
419 }
420 getFlags := func(flags RumbleFlag) []string {
421 var flagStrings []string
422 if flags&Stop != 0 {
423 flagStrings = append(flagStrings, "Stop")
424 }
425 if flags&Loop != 0 {
426 flagStrings = append(flagStrings, "Loop")
427 }
428 if flags&Restart != 0 {
429 flagStrings = append(flagStrings, "Restart")
430 }
431 if flags&UpdateScale != 0 {
432 flagStrings = append(flagStrings, "UpdateScale")
433 }
434 if flags&OnlyOne != 0 {
435 flagStrings = append(flagStrings, "OnlyOne")
436 }
437 if flags&RandomAmplitude != 0 {
438 flagStrings = append(flagStrings, "RandomAmplitude")
439 }
440 if flags&InitialScale != 0 {
441 flagStrings = append(flagStrings, "InitialScale")
442 }
443 return flagStrings
444 }
445 svcUserMessage.Data = rumble
446 writer.TempAppendLine("\t\t\tType: %s", getRumbleLookup(RumbleLookup(rumble.Type)))
447 writer.TempAppendLine("\t\t\tScale: %f", rumble.Scale)
448 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(RumbleFlag(rumble.Flags)))
449}
450
451func (svcUserMessage *SvcUserMessage) parseBattery(reader *bitreader.Reader) {
452 battery := struct{ BatteryVal uint16 }{
453 BatteryVal: reader.TryReadUInt16(),
454 }
455 svcUserMessage.Data = battery
456 writer.TempAppendLine("\t\t\tBattery: %d", battery.BatteryVal)
457}
458
459func (svcUserMessage *SvcUserMessage) parseDamage(reader *bitreader.Reader) {
460 damage := struct {
461 Armor uint8
462 DamageTaken uint8
463 BitsDamage int32
464 VecFrom []float32
465 }{
466 Armor: reader.TryReadUInt8(),
467 DamageTaken: reader.TryReadUInt8(),
468 BitsDamage: reader.TryReadSInt32(),
469 VecFrom: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
470 }
471 svcUserMessage.Data = damage
472 writer.TempAppendLine("\t\t\tArmor: %d", damage.Armor)
473 writer.TempAppendLine("\t\t\tDamage Taken: %d", damage.DamageTaken)
474 writer.TempAppendLine("\t\t\tBits Damage: %d", damage.BitsDamage)
475 writer.TempAppendLine("\t\t\tVecFrom: %v", damage.VecFrom)
476}
477
478func (svcUserMessage *SvcUserMessage) parseVoiceMask(reader *bitreader.Reader) {
479 // const VoiceMaxPlayers = 2
480 voiceMask := struct {
481 PlayerMasks []struct {
482 GameRulesMask int32
483 BanMask int32
484 }
485 PlayerModEnable bool
486 }{
487 PlayerMasks: []struct {
488 GameRulesMask int32
489 BanMask int32
490 }{
491 {
492 GameRulesMask: reader.TryReadSInt32(),
493 BanMask: reader.TryReadSInt32(),
494 },
495 {
496 GameRulesMask: reader.TryReadSInt32(),
497 BanMask: reader.TryReadSInt32(),
498 },
499 },
500 PlayerModEnable: reader.TryReadUInt8() != 0,
501 }
502 svcUserMessage.Data = voiceMask
503 writer.TempAppendLine("\t\t\tPlayer Masks:")
504 writer.TempAppendLine("\t\t\t\t[0] Game Rules Mask: %d", voiceMask.PlayerMasks[0].GameRulesMask)
505 writer.TempAppendLine("\t\t\t\t[0] Ban Mask: %d", voiceMask.PlayerMasks[0].BanMask)
506 writer.TempAppendLine("\t\t\t\t[1] Game Rules Mask: %d", voiceMask.PlayerMasks[1].GameRulesMask)
507 writer.TempAppendLine("\t\t\t\t[1] Ban Mask: %d", voiceMask.PlayerMasks[1].BanMask)
508 writer.TempAppendLine("\t\t\t\tPlayer Mod Enable: %t", voiceMask.PlayerModEnable)
509}
510
511func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader) {
512 type CloseCaptionFlag uint8
513 const (
514 None CloseCaptionFlag = 0
515 WarnIfMissing CloseCaptionFlag = 1
516 FromPlayer CloseCaptionFlag = 1 << 1
517 GenderMale CloseCaptionFlag = 1 << 2
518 GenderFemale CloseCaptionFlag = 1 << 3
519 )
520 closeCaption := struct {
521 TokenName string
522 Duration float32
523 Flags uint8
524 }{
525 TokenName: reader.TryReadString(),
526 Duration: float32(reader.TryReadSInt16()) * 0.1,
527 Flags: reader.TryReadUInt8(),
528 }
529 getFlags := func(flags CloseCaptionFlag) []string {
530 var flagStrings []string
531 if flags&WarnIfMissing != 0 {
532 flagStrings = append(flagStrings, "WarnIfMissing")
533 }
534 if flags&FromPlayer != 0 {
535 flagStrings = append(flagStrings, "FromPlayer")
536 }
537 if flags&GenderMale != 0 {
538 flagStrings = append(flagStrings, "GenderMale")
539 }
540 if flags&GenderFemale != 0 {
541 flagStrings = append(flagStrings, "GenderFemale")
542 }
543 return flagStrings
544 }
545 svcUserMessage.Data = closeCaption
546 writer.TempAppendLine("\t\t\tToken Name: %s", closeCaption.TokenName)
547 writer.TempAppendLine("\t\t\tDuration: %f", closeCaption.Duration)
548 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(CloseCaptionFlag(closeCaption.Flags)))
549}
550
551func (svcUserMessage *SvcUserMessage) parseKeyHintText(reader *bitreader.Reader) {
552 keyHintText := struct {
553 Count uint8
554 KeyString string
555 }{
556 Count: reader.TryReadUInt8(),
557 KeyString: reader.TryReadString(),
558 }
559 svcUserMessage.Data = keyHintText
560 writer.TempAppendLine("\t\t\tCount: %d", keyHintText.Count)
561 writer.TempAppendLine("\t\t\tString: %s", keyHintText.KeyString)
562}
563
564func (svcUserMessage *SvcUserMessage) parseLogoTimeMsg(reader *bitreader.Reader) {
565 logoTimeMsg := struct{ Time float32 }{
566 Time: reader.TryReadFloat32(),
567 }
568 svcUserMessage.Data = logoTimeMsg
569 writer.TempAppendLine("\t\t\tTime: %f", logoTimeMsg.Time)
570}
571
572func (svcUserMessage *SvcUserMessage) parseAchivementEvent(reader *bitreader.Reader) {
573 achivementEvent := struct{ AchivementID int32 }{
574 AchivementID: reader.TryReadSInt32(),
575 }
576 svcUserMessage.Data = achivementEvent
577 writer.TempAppendLine("\t\t\tPortal Count: %v", achivementEvent.AchivementID)
578}
579
580func (svcUserMessage *SvcUserMessage) parseMpMapCompleted(reader *bitreader.Reader) {
581 mpMapCompleted := struct {
582 Branch uint8
583 Level uint8
584 }{
585 Branch: reader.TryReadUInt8(),
586 Level: reader.TryReadUInt8(),
587 }
588 svcUserMessage.Data = mpMapCompleted
589 writer.TempAppendLine("\t\t\tBranch: %d", mpMapCompleted.Branch)
590 writer.TempAppendLine("\t\t\tLevel: %d", mpMapCompleted.Level)
591}
592
593func (svcUserMessage *SvcUserMessage) parseMpMapIncomplete(reader *bitreader.Reader) {}
594
595func (svcUserMessage *SvcUserMessage) parseMpTauntEarned(reader *bitreader.Reader) {
596 mpTauntEarned := struct {
597 TauntName string
598 AwardSilently bool
599 }{
600 TauntName: reader.TryReadString(),
601 AwardSilently: reader.TryReadBool(),
602 }
603 svcUserMessage.Data = mpTauntEarned
604 writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntEarned.TauntName)
605 writer.TempAppendLine("\t\t\tAward Silently: %t", mpTauntEarned.AwardSilently)
606}
607
608func (svcUserMessage *SvcUserMessage) parseMpTauntLocked(reader *bitreader.Reader) {
609 mpTauntLocked := struct{ TauntName string }{
610 TauntName: reader.TryReadString(),
611 }
612 svcUserMessage.Data = mpTauntLocked
613 writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntLocked.TauntName)
614}
615
616func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Reader) {
617 type PortalFizzleType int8
618 const (
619 PortalFizzleSuccess PortalFizzleType = iota // Placed fine (no fizzle)
620 PortalFizzleCantFit
621 PortalFizzleOverlappedLinked
622 PortalFizzleBadVolume
623 PortalFizzleBadSurface
624 PortalFizzleKilled
625 PortalFizzleCleanser
626 PortalFizzleClose
627 PortalFizzleNearBlue
628 PortalFizzleNearRed
629 PortalFizzleNone
630 )
631 getPortalFizzleType := func(portalFizzleType PortalFizzleType) string {
632 switch portalFizzleType {
633 case PortalFizzleSuccess:
634 return "PortalFizzleSuccess"
635 case PortalFizzleCantFit:
636 return "PortalFizzleCantFit"
637 case PortalFizzleOverlappedLinked:
638 return "PortalFizzleOverlappedLinked"
639 case PortalFizzleBadVolume:
640 return "PortalFizzleBadVolume"
641 case PortalFizzleBadSurface:
642 return "PortalFizzleBadSurface"
643 case PortalFizzleKilled:
644 return "PortalFizzleKilled"
645 case PortalFizzleCleanser:
646 return "PortalFizzleCleanser"
647 case PortalFizzleClose:
648 return "PortalFizzleClose"
649 case PortalFizzleNearBlue:
650 return "PortalFizzleNearBlue"
651 case PortalFizzleNearRed:
652 return "PortalFizzleNearRed"
653 case PortalFizzleNone:
654 return "PortalFizzleNone"
655 default:
656 return fmt.Sprintf("%d", int(portalFizzleType))
657 }
658 }
659 portalFxSurface := struct {
660 PortalEnt uint16
661 OwnerEnt uint16
662 Team uint8
663 PortalNum uint8
664 Effect uint8
665 Origin []float32
666 Angles []float32
667 }{
668 PortalEnt: reader.TryReadUInt16(),
669 OwnerEnt: reader.TryReadUInt16(),
670 Team: reader.TryReadUInt8(),
671 PortalNum: reader.TryReadUInt8(),
672 Effect: reader.TryReadUInt8(),
673 Origin: []float32{},
674 Angles: []float32{},
675 }
676 existsX, existsY, existsZ := reader.TryReadBool(), reader.TryReadBool(), reader.TryReadBool()
677 if existsX {
678 portalFxSurface.Origin = append(portalFxSurface.Origin, readBitCoord(reader))
679 } else {
680 portalFxSurface.Origin = append(portalFxSurface.Origin, 0)
681 }
682 if existsY {
683 portalFxSurface.Origin = append(portalFxSurface.Origin, readBitCoord(reader))
684 } else {
685 portalFxSurface.Origin = append(portalFxSurface.Origin, 0)
686 }
687 if existsZ {
688 portalFxSurface.Origin = append(portalFxSurface.Origin, readBitCoord(reader))
689 } else {
690 portalFxSurface.Origin = append(portalFxSurface.Origin, 0)
691 }
692 existsX, existsY, existsZ = reader.TryReadBool(), reader.TryReadBool(), reader.TryReadBool()
693 if existsX {
694 portalFxSurface.Angles = append(portalFxSurface.Angles, readBitCoord(reader))
695 } else {
696 portalFxSurface.Angles = append(portalFxSurface.Angles, 0)
697 }
698 if existsY {
699 portalFxSurface.Angles = append(portalFxSurface.Angles, readBitCoord(reader))
700 } else {
701 portalFxSurface.Angles = append(portalFxSurface.Angles, 0)
702 }
703 if existsZ {
704 portalFxSurface.Angles = append(portalFxSurface.Angles, readBitCoord(reader))
705 } else {
706 portalFxSurface.Angles = append(portalFxSurface.Angles, 0)
707 }
708 svcUserMessage.Data = portalFxSurface
709 _ = getPortalFizzleType(PortalFizzleType(2))
710 writer.TempAppendLine("\t\t\tPortal Entity: %d", portalFxSurface.PortalEnt)
711 writer.TempAppendLine("\t\t\tOwner Entity: %d", portalFxSurface.OwnerEnt)
712 writer.TempAppendLine("\t\t\tTeam: %d", portalFxSurface.Team)
713 writer.TempAppendLine("\t\t\tPortal Number: %d", portalFxSurface.PortalNum)
714 writer.TempAppendLine("\t\t\tEffect: %s", getPortalFizzleType(PortalFizzleType(portalFxSurface.Effect)))
715 writer.TempAppendLine("\t\t\tOrigin: %v", portalFxSurface.Origin)
716 writer.TempAppendLine("\t\t\tAngles: %v", portalFxSurface.Angles)
717}
718
719func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreader.Reader) { 29func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreader.Reader) {
720 scoreboardTempUpdate := struct { 30 scoreboardTempUpdate := struct {
721 NumPortals int32 31 NumPortals int32
@@ -725,232 +35,6 @@ func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreade
725 TimeTaken: reader.TryReadSInt32(), 35 TimeTaken: reader.TryReadSInt32(),
726 } 36 }
727 svcUserMessage.Data = scoreboardTempUpdate 37 svcUserMessage.Data = scoreboardTempUpdate
728 writer.TempAppendLine("\t\t\tPortal Count: %v", scoreboardTempUpdate.NumPortals) 38 fmt.Printf("Portal Count: %d\n", scoreboardTempUpdate.NumPortals)
729 writer.TempAppendLine("\t\t\tCM Ticks: %v", scoreboardTempUpdate.TimeTaken) 39 fmt.Printf("CM Ticks: %d\n", scoreboardTempUpdate.TimeTaken)
730}
731
732type UserMessageType uint8
733
734const (
735 EUserMessageTypeGeiger UserMessageType = iota // done
736 EUserMessageTypeTrain // done
737 EUserMessageTypeHudText // done
738 EUserMessageTypeSayText // done
739 EUserMessageTypeSayText2 // done
740 EUserMessageTypeTextMsg // done
741 EUserMessageTypeHUDMsg // done
742 EUserMessageTypeResetHUD // done // called every respawn
743 EUserMessageTypeGameTitle
744 EUserMessageTypeItemPickup
745 EUserMessageTypeShowMenu
746 EUserMessageTypeShake // done
747 EUserMessageTypeTilt
748 EUserMessageTypeFade // done
749 EUserMessageTypeVGUIMenu // done // Show VGUI menu
750 EUserMessageTypeRumble // done // Send a rumble to a controller
751 EUserMessageTypeBattery // done
752 EUserMessageTypeDamage // done
753 EUserMessageTypeVoiceMask // done
754 EUserMessageTypeRequestState
755 EUserMessageTypeCloseCaption // done // Show a caption (by string id number)(duration in 10th of a second)
756 EUserMessageTypeCloseCaptionDirect // Show a forced caption (by string id number)(duration in 10th of a second)
757 EUserMessageTypeHintText // Displays hint text display
758 EUserMessageTypeKeyHintText // done // Displays hint text display
759 EUserMessageTypeSquadMemberDied
760 EUserMessageTypeAmmoDenied
761 EUserMessageTypeCreditsMsg
762 EUserMessageTypeLogoTimeMsg // done
763 EUserMessageTypeAchievementEvent // done
764 EUserMessageTypeUpdateJalopyRadar
765 EUserMessageTypeCurrentTimescale // Send one float for the new timescale
766 EUserMessageTypeDesiredTimescale // Send timescale and some blending vars
767 EUserMessageTypeCreditsPortalMsg // portal 1 end
768 EUserMessageTypeInventoryFlash // portal 2 start
769 EUserMessageTypeIndicatorFlash
770 EUserMessageTypeControlHelperAnimate
771 EUserMessageTypeTakePhoto
772 EUserMessageTypeFlash
773 EUserMessageTypeHudPingIndicator
774 EUserMessageTypeOpenRadialMenu
775 EUserMessageTypeAddLocator
776 EUserMessageTypeMPMapCompleted // done
777 EUserMessageTypeMPMapIncomplete // done
778 EUserMessageTypeMPMapCompletedData
779 EUserMessageTypeMPTauntEarned // done
780 EUserMessageTypeMPTauntUnlocked
781 EUserMessageTypeMPTauntLocked // done
782 EUserMessageTypeMPAllTauntsLocked
783 EUserMessageTypePortalFX_Surface // done
784 EUserMessageTypePaintWorld
785 EUserMessageTypePaintEntity
786 EUserMessageTypeChangePaintColor
787 EUserMessageTypePaintBombExplode
788 EUserMessageTypeRemoveAllPaint
789 EUserMessageTypePaintAllSurfaces
790 EUserMessageTypeRemovePaint
791 EUserMessageTypeStartSurvey
792 EUserMessageTypeApplyHitBoxDamageEffect
793 EUserMessageTypeSetMixLayerTriggerFactor
794 EUserMessageTypeTransitionFade
795 EUserMessageTypeScoreboardTempUpdate // done
796 EUserMessageTypeChallengeModCheatSession
797 EUserMessageTypeChallengeModCloseAllUI
798)
799
800func (userMessageType UserMessageType) String() string {
801 switch userMessageType {
802 case EUserMessageTypeGeiger:
803 return "Geiger"
804 case EUserMessageTypeTrain:
805 return "Train"
806 case EUserMessageTypeHudText:
807 return "HudText"
808 case EUserMessageTypeSayText:
809 return "SayText"
810 case EUserMessageTypeSayText2:
811 return "SayText2"
812 case EUserMessageTypeTextMsg:
813 return "TextMsg"
814 case EUserMessageTypeHUDMsg:
815 return "HUDMsg"
816 case EUserMessageTypeResetHUD:
817 return "ResetHUD"
818 case EUserMessageTypeGameTitle:
819 return "GameTitle"
820 case EUserMessageTypeItemPickup:
821 return "ItemPickup"
822 case EUserMessageTypeShowMenu:
823 return "ShowMenu"
824 case EUserMessageTypeShake:
825 return "Shake"
826 case EUserMessageTypeTilt:
827 return "Tilt"
828 case EUserMessageTypeFade:
829 return "Fade"
830 case EUserMessageTypeVGUIMenu:
831 return "VGUIMenu"
832 case EUserMessageTypeRumble:
833 return "Rumble"
834 case EUserMessageTypeBattery:
835 return "Battery"
836 case EUserMessageTypeDamage:
837 return "Damage"
838 case EUserMessageTypeVoiceMask:
839 return "VoiceMask"
840 case EUserMessageTypeRequestState:
841 return "RequestState"
842 case EUserMessageTypeCloseCaption:
843 return "CloseCaption"
844 case EUserMessageTypeCloseCaptionDirect:
845 return "CloseCaptionDirect"
846 case EUserMessageTypeHintText:
847 return "HintText"
848 case EUserMessageTypeKeyHintText:
849 return "KeyHintText"
850 case EUserMessageTypeSquadMemberDied:
851 return "SquadMemberDied"
852 case EUserMessageTypeAmmoDenied:
853 return "AmmoDenied"
854 case EUserMessageTypeCreditsMsg:
855 return "CreditsMsg"
856 case EUserMessageTypeLogoTimeMsg:
857 return "LogoTimeMsg"
858 case EUserMessageTypeAchievementEvent:
859 return "AchievementEvent"
860 case EUserMessageTypeUpdateJalopyRadar:
861 return "UpdateJalopyRadar"
862 case EUserMessageTypeCurrentTimescale:
863 return "CurrentTimescale"
864 case EUserMessageTypeDesiredTimescale:
865 return "DesiredTimescale"
866 case EUserMessageTypeCreditsPortalMsg:
867 return "CreditsPortalMsg"
868 case EUserMessageTypeInventoryFlash:
869 return "InventoryFlash"
870 case EUserMessageTypeIndicatorFlash:
871 return "IndicatorFlash"
872 case EUserMessageTypeControlHelperAnimate:
873 return "ControlHelperAnimate"
874 case EUserMessageTypeTakePhoto:
875 return "TakePhoto"
876 case EUserMessageTypeFlash:
877 return "Flash"
878 case EUserMessageTypeHudPingIndicator:
879 return "HudPingIndicator"
880 case EUserMessageTypeOpenRadialMenu:
881 return "OpenRadialMenu"
882 case EUserMessageTypeAddLocator:
883 return "AddLocator"
884 case EUserMessageTypeMPMapCompleted:
885 return "MPMapCompleted"
886 case EUserMessageTypeMPMapIncomplete:
887 return "MPMapIncomplete"
888 case EUserMessageTypeMPMapCompletedData:
889 return "MPMapCompletedData"
890 case EUserMessageTypeMPTauntEarned:
891 return "MPTauntEarned"
892 case EUserMessageTypeMPTauntUnlocked:
893 return "MPTauntUnlocked"
894 case EUserMessageTypeMPTauntLocked:
895 return "MPTauntLocked"
896 case EUserMessageTypeMPAllTauntsLocked:
897 return "MPAllTauntsLocked"
898 case EUserMessageTypePortalFX_Surface:
899 return "PortalFX_Surface"
900 case EUserMessageTypePaintWorld:
901 return "PaintWorld"
902 case EUserMessageTypePaintEntity:
903 return "PaintEntity"
904 case EUserMessageTypeChangePaintColor:
905 return "ChangePaintColor"
906 case EUserMessageTypePaintBombExplode:
907 return "PaintBombExplode"
908 case EUserMessageTypeRemoveAllPaint:
909 return "RemoveAllPaint"
910 case EUserMessageTypePaintAllSurfaces:
911 return "PaintAllSurfaces"
912 case EUserMessageTypeRemovePaint:
913 return "RemovePaint"
914 case EUserMessageTypeStartSurvey:
915 return "StartSurvey"
916 case EUserMessageTypeApplyHitBoxDamageEffect:
917 return "ApplyHitBoxDamageEffect"
918 case EUserMessageTypeSetMixLayerTriggerFactor:
919 return "SetMixLayerTriggerFactor"
920 case EUserMessageTypeTransitionFade:
921 return "TransitionFade"
922 case EUserMessageTypeScoreboardTempUpdate:
923 return "ScoreboardTempUpdate"
924 case EUserMessageTypeChallengeModCheatSession:
925 return "ChallengeModCheatSession"
926 case EUserMessageTypeChallengeModCloseAllUI:
927 return "ChallengeModCloseAllUI"
928 default:
929 return "Unknown"
930 }
931}
932
933func readBitCoord(reader *bitreader.Reader) float32 {
934 const (
935 CoordIntBits uint64 = 14
936 CoordFracBits uint64 = 5
937 CoordDenom = 1 << CoordFracBits
938 CoordRes = 1.0 / CoordDenom
939 )
940 val := float32(0)
941 hasInt := reader.TryReadBool()
942 hasFrac := reader.TryReadBool()
943 if hasInt || hasFrac {
944 sign := reader.TryReadBool()
945 if hasInt {
946 val += float32(reader.TryReadBits(CoordIntBits) + 1)
947 }
948 if hasFrac {
949 val += float32(reader.TryReadBits(CoordFracBits)) * CoordRes
950 }
951 if sign {
952 val = -val
953 }
954 }
955 return val
956} 40}
diff --git a/pkg/messages/types/svcVoiceData.go b/pkg/messages/types/svcVoiceData.go
index c3e08ee..6ac8050 100644
--- a/pkg/messages/types/svcVoiceData.go
+++ b/pkg/messages/types/svcVoiceData.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcVoiceData struct { 7type SvcVoiceData struct {
@@ -21,8 +20,6 @@ func ParseSvcVoiceData(reader *bitreader.Reader) SvcVoiceData {
21 svcVoiceData.Proximity = true 20 svcVoiceData.Proximity = true
22 } 21 }
23 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length)) 22 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length))
24 writer.TempAppendLine("\t\tFrom Client: %d", svcVoiceData.FromClient) 23
25 writer.TempAppendLine("\t\tProximity: %t", svcVoiceData.Proximity)
26 writer.TempAppendLine("\t\tData: %v", svcVoiceData.Data)
27 return svcVoiceData 24 return svcVoiceData
28} 25}
diff --git a/pkg/messages/types/svcVoiceInit.go b/pkg/messages/types/svcVoiceInit.go
index 03e0e25..eb6093f 100644
--- a/pkg/messages/types/svcVoiceInit.go
+++ b/pkg/messages/types/svcVoiceInit.go
@@ -2,7 +2,6 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type SvcVoiceInit struct { 7type SvcVoiceInit struct {
@@ -25,8 +24,6 @@ func ParseSvcVoiceInit(reader *bitreader.Reader) SvcVoiceInit {
25 svcVoiceInit.SampleRate = 11025 24 svcVoiceInit.SampleRate = 11025
26 } 25 }
27 } 26 }
28 writer.TempAppendLine("\t\tCodec: %s", svcVoiceInit.Codec) 27
29 writer.TempAppendLine("\t\tQuality: %d", svcVoiceInit.Quality)
30 writer.TempAppendLine("\t\tSample Rate: %d", svcVoiceInit.SampleRate)
31 return svcVoiceInit 28 return svcVoiceInit
32} 29}
diff --git a/pkg/packets/headers.go b/pkg/packets/headers.go
index d92b22d..ba5482b 100644
--- a/pkg/packets/headers.go
+++ b/pkg/packets/headers.go
@@ -2,7 +2,6 @@ package packets
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/demoparser/pkg/writer"
6) 5)
7 6
8type Headers struct { 7type Headers struct {
@@ -42,6 +41,5 @@ func ParseHeaders(reader *bitreader.Reader) Headers {
42 if headers.NetworkProtocol != 2001 { 41 if headers.NetworkProtocol != 2001 {
43 panic("this parser only supports demos from portal 2") 42 panic("this parser only supports demos from portal 2")
44 } 43 }
45 writer.AppendLine("Headers: %+v", headers)
46 return headers 44 return headers
47} 45}
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
index b1d6a40..02ad806 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/writer"
7) 6)
8 7
9type PacketMessageInfo struct { 8type PacketMessageInfo struct {
@@ -18,42 +17,33 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo {
18 slotNumber := reader.TryReadUInt8() 17 slotNumber := reader.TryReadUInt8()
19 switch packetType { 18 switch packetType {
20 case 1: // SignOn 19 case 1: // SignOn
21 writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType)
22 signOn := classes.SignOn{} 20 signOn := classes.SignOn{}
23 signOn.ParseSignOn(reader) 21 signOn.ParseSignOn(reader)
24 case 2: // Packet 22 case 2: // Packet
25 writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType)
26 packet := classes.Packet{} 23 packet := classes.Packet{}
27 packet.ParsePacket(reader) 24 packet.ParsePacket(reader)
28 case 3: // SyncTick 25 case 3: // SyncTick
29 writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType)
30 syncTick := classes.SyncTick{} 26 syncTick := classes.SyncTick{}
31 syncTick.ParseSyncTick() 27 syncTick.ParseSyncTick()
32 case 4: // ConsoleCmd 28 case 4: // ConsoleCmd
33 writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType)
34 consoleCmd := classes.ConsoleCmd{} 29 consoleCmd := classes.ConsoleCmd{}
35 consoleCmd.ParseConsoleCmd(reader) 30 consoleCmd.ParseConsoleCmd(reader)
36 case 5: // UserCmd 31 case 5: // UserCmd
37 writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType)
38 userCmd := classes.UserCmd{} 32 userCmd := classes.UserCmd{}
39 userCmd.ParseUserCmd(reader) 33 userCmd.ParseUserCmd(reader)
40 case 6: // DataTables 34 case 6: // DataTables
41 writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType)
42 dataTables := classes.DataTables{} 35 dataTables := classes.DataTables{}
43 dataTables.ParseDataTables(reader) 36 dataTables.ParseDataTables(reader)
44 case 7: // Stop 37 case 7: // Stop
45 writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType)
46 stop := classes.Stop{} 38 stop := classes.Stop{}
47 stop.ParseStop(reader) 39 stop.ParseStop(reader)
48 case 8: // CustomData TODO: not sar data 40 case 8: // CustomData TODO: not sar data
49 customData := classes.CustomData{} 41 customData := classes.CustomData{}
50 customData.ParseCustomData(reader, tickNumber, packetType) 42 customData.ParseCustomData(reader, tickNumber, packetType)
51 case 9: // StringTables TODO: parsing string table data 43 case 9: // StringTables TODO: parsing string table data
52 writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType)
53 stringTables := classes.StringTables{} 44 stringTables := classes.StringTables{}
54 stringTables.ParseStringTables(reader) 45 stringTables.ParseStringTables(reader)
55 default: // Invalid 46 default: // Invalid
56 writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType)
57 panic("invalid packet type") 47 panic("invalid packet type")
58 } 48 }
59 return PacketMessageInfo{ 49 return PacketMessageInfo{
diff --git a/pkg/writer/writer.go b/pkg/writer/writer.go
deleted file mode 100644
index 6b66e75..0000000
--- a/pkg/writer/writer.go
+++ /dev/null
@@ -1,47 +0,0 @@
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}