From a77cf8169b42a4394e62f7a381ca546b27d0f723 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Mon, 7 Nov 2022 16:09:44 +0300 Subject: starting fresh for the third time --- packets/header.go | 33 ++++++++++++++++++++++++++++ packets/message.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ packets/types.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 packets/header.go create mode 100644 packets/message.go create mode 100644 packets/types.go (limited to 'packets') diff --git a/packets/header.go b/packets/header.go new file mode 100644 index 0000000..60cd146 --- /dev/null +++ b/packets/header.go @@ -0,0 +1,33 @@ +package packets + +import ( + "fmt" + + "github.com/pektezol/bitreader" +) + +func ParseHeader(reader *bitreader.ReaderType) { + header := Header{ + DemoFileStamp: reader.TryReadStringLen(8), + DemoProtocol: uint(reader.TryReadInt32()), + NetworkProtocol: uint(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()), + } + if header.DemoFileStamp != "HL2DEMO" { + panic("Invalid demo file stamp. Make sure a valid demo file is given.") + } + if header.DemoProtocol != 4 { + panic("Given demo is from old engine. This parser is only supported for new engine.") + } + if header.NetworkProtocol != 2001 { + panic("Given demo is not from Portal2. This parser currently only supports Portal 2.") + } + fmt.Println(header) +} diff --git a/packets/message.go b/packets/message.go new file mode 100644 index 0000000..a8e830d --- /dev/null +++ b/packets/message.go @@ -0,0 +1,64 @@ +package packets + +import ( + "fmt" + + "github.com/pektezol/bitreader" +) + +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) + return 1 + case 0x02: + reader.SkipBytes(76*2 + 8) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) Packet: \n", messageTick, messageType) + return 2 + case 0x03: + fmt.Printf("[%d] (%d) SyncTick: \n", messageTick, messageType) + return 3 + case 0x04: + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) ConsoleCmd: \n", messageTick, messageType) + return 4 + case 0x05: + reader.SkipBytes(4) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) UserCmd: \n", messageTick, messageType) + return 5 + case 0x06: + 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) + return 7 + case 0x08: + reader.SkipBytes(4) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) CustomData: \n", messageTick, messageType) + return 8 + case 0x09: + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) StringTables: \n", messageTick, messageType) + return 9 + default: + return 0 + } +} diff --git a/packets/types.go b/packets/types.go new file mode 100644 index 0000000..5f7a29b --- /dev/null +++ b/packets/types.go @@ -0,0 +1,64 @@ +package packets + +type Header struct { + DemoFileStamp string + DemoProtocol uint + NetworkProtocol uint + ServerName string + ClientName string + MapName string + GameDirectory string + PlaybackTime float32 + PlaybackTicks int + PlaybackFrames int + SignOnLength uint +} + +type SignOn struct { + PacketInfo []byte + InSequence int32 + OutSequence int32 + Size int32 + Data []byte +} + +type Packet struct { + PacketInfo []byte + InSequence int32 + OutSequence int32 + Size int32 + Data []byte +} + +type SyncTick struct{} + +type ConsoleCmd struct { + Size int32 + Data string +} + +type UserCmd struct { + Cmd int32 + Size int32 + Data []byte +} + +type DataTables struct { + Size int32 + Data []byte +} + +type Stop struct { + RemainingData []byte +} + +type CustomData struct { + Unknown int32 + Size int32 + Data []byte +} + +type StringTables struct { + Size int32 + Data []byte +} -- cgit v1.2.3