From 71cdb9cea1309fe710ecf7a3d47e2c475adf0cd0 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:53:33 +0300 Subject: done until the hard part --- packets/header.go | 10 ++++---- packets/message.go | 70 ++++++++++++++++++++++++++++++++++-------------------- packets/types.go | 18 +++++++------- 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/packets/header.go b/packets/header.go index 60cd146..c4172d9 100644 --- a/packets/header.go +++ b/packets/header.go @@ -9,16 +9,16 @@ import ( func ParseHeader(reader *bitreader.ReaderType) { header := Header{ DemoFileStamp: reader.TryReadStringLen(8), - DemoProtocol: uint(reader.TryReadInt32()), - NetworkProtocol: uint(reader.TryReadInt32()), + DemoProtocol: uint32(reader.TryReadInt32()), + NetworkProtocol: uint32(reader.TryReadInt32()), ServerName: reader.TryReadStringLen(260), ClientName: reader.TryReadStringLen(260), MapName: reader.TryReadStringLen(260), GameDirectory: reader.TryReadStringLen(260), PlaybackTime: reader.TryReadFloat32(), - PlaybackTicks: int(reader.TryReadInt32()), - PlaybackFrames: int(reader.TryReadInt32()), - SignOnLength: uint(reader.TryReadInt32()), + PlaybackTicks: int32(reader.TryReadInt32()), + PlaybackFrames: int32(reader.TryReadInt32()), + SignOnLength: uint32(reader.TryReadInt32()), } if header.DemoFileStamp != "HL2DEMO" { panic("Invalid demo file stamp. Make sure a valid demo file is given.") diff --git a/packets/message.go b/packets/message.go index a8e830d..3688ff9 100644 --- a/packets/message.go +++ b/packets/message.go @@ -4,56 +4,74 @@ import ( "fmt" "github.com/pektezol/bitreader" + "github.com/pektezol/demoparser/packets/classes" ) +const MSSC = 2 + func ParseMessage(reader *bitreader.ReaderType) (status int) { messageType := reader.TryReadInt8() messageTick := reader.TryReadInt32() messageSlot := reader.TryReadInt8() - //fmt.Println(messageType, messageTick, messageSlot) switch messageType { - case 0x01: - //signOn := SignOn{} - reader.SkipBytes(76*2 + 8) - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) - fmt.Printf("[%d] (%d) {%d} SignOn: \n", messageTick, messageType, messageSlot) + case 0x01: // TODO: SignOn - Data + signOn := SignOn{ + PacketInfo: classes.ParseCmdInfo(reader, MSSC), + InSequence: int32(reader.TryReadInt32()), + OutSequence: int32(reader.TryReadInt32()), + Size: int32(reader.TryReadInt32()), + } + reader.SkipBytes(int(signOn.Size)) + fmt.Printf("[%d] (%d) {%d} SignOn: %v\n", messageTick, messageType, messageSlot, signOn) return 1 - case 0x02: - reader.SkipBytes(76*2 + 8) - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) - // fmt.Printf("[%d] (%d) Packet: \n", messageTick, messageType) + case 0x02: // TODO: Packet - Data + packet := Packet{ + PacketInfo: classes.ParseCmdInfo(reader, MSSC), + InSequence: int32(reader.TryReadInt32()), + OutSequence: int32(reader.TryReadInt32()), + Size: int32(reader.TryReadInt32()), + } + //classes.ParseUserCmdInfo(reader, packet.Size) + reader.SkipBytes(int(packet.Size)) + //fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet) return 2 case 0x03: - fmt.Printf("[%d] (%d) SyncTick: \n", messageTick, messageType) + syncTick := SyncTick{} + fmt.Printf("[%d] (%d) SyncTick: %v\n", messageTick, messageType, syncTick) return 3 case 0x04: - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) - // fmt.Printf("[%d] (%d) ConsoleCmd: \n", messageTick, messageType) + consoleCmd := ConsoleCmd{ + Size: int32(reader.TryReadInt32()), + } + consoleCmd.Data = reader.TryReadStringLen(int(consoleCmd.Size)) + //fmt.Printf("[%d] (%d) ConsoleCmd: %s\n", messageTick, messageType, consoleCmd.Data) return 4 - case 0x05: - reader.SkipBytes(4) - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) - // fmt.Printf("[%d] (%d) UserCmd: \n", messageTick, messageType) + case 0x05: // TODO: UserCmd - Buttons + userCmd := UserCmd{ + Cmd: int32(reader.TryReadInt32()), + Size: int32(reader.TryReadInt32()), + } + userCmd.Data = classes.ParseUserCmdInfo(reader, int(userCmd.Size)) + fmt.Printf("[%d] (%d) UserCmd: %v\n", messageTick, messageType, userCmd) return 5 - case 0x06: + case 0x06: // TODO: DataTables val := reader.TryReadInt32() reader.SkipBytes(int(val)) // fmt.Printf("[%d] (%d) DataTables: \n", messageTick, messageType) return 6 - case 0x07: - fmt.Printf("[%d] (%d) Stop: \n", messageTick, messageType) + case 0x07: // TODO: Stop - RemainingData + stop := Stop{ + RemainingData: nil, + } + fmt.Printf("[%d] (%d) Stop: %v\n", messageTick, messageType, stop) return 7 - case 0x08: + case 0x08: // TODO: CustomData reader.SkipBytes(4) val := reader.TryReadInt32() reader.SkipBytes(int(val)) // fmt.Printf("[%d] (%d) CustomData: \n", messageTick, messageType) return 8 - case 0x09: + case 0x09: // TODO: StringTables val := reader.TryReadInt32() reader.SkipBytes(int(val)) // fmt.Printf("[%d] (%d) StringTables: \n", messageTick, messageType) diff --git a/packets/types.go b/packets/types.go index 5f7a29b..5e75643 100644 --- a/packets/types.go +++ b/packets/types.go @@ -1,21 +1,23 @@ package packets +import "github.com/pektezol/demoparser/packets/classes" + type Header struct { DemoFileStamp string - DemoProtocol uint - NetworkProtocol uint + DemoProtocol uint32 + NetworkProtocol uint32 ServerName string ClientName string MapName string GameDirectory string PlaybackTime float32 - PlaybackTicks int - PlaybackFrames int - SignOnLength uint + PlaybackTicks int32 + PlaybackFrames int32 + SignOnLength uint32 } type SignOn struct { - PacketInfo []byte + PacketInfo []classes.CmdInfo InSequence int32 OutSequence int32 Size int32 @@ -23,7 +25,7 @@ type SignOn struct { } type Packet struct { - PacketInfo []byte + PacketInfo []classes.CmdInfo InSequence int32 OutSequence int32 Size int32 @@ -40,7 +42,7 @@ type ConsoleCmd struct { type UserCmd struct { Cmd int32 Size int32 - Data []byte + Data classes.UserCmdInfo } type DataTables struct { -- cgit v1.2.3