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