diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-21 19:26:40 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-21 19:26:40 +0300 |
| commit | 44eefefe67a4a5f514faa4594370346fd1b54996 (patch) | |
| tree | a8853a8ecd49ddbb87c6cc19904ec6bb5419ee83 /pkg/classes/packet.go | |
| parent | add strings builder, customize ALL outputs (#6) (diff) | |
| download | sdp.go-44eefefe67a4a5f514faa4594370346fd1b54996.tar.gz sdp.go-44eefefe67a4a5f514faa4594370346fd1b54996.tar.bz2 sdp.go-44eefefe67a4a5f514faa4594370346fd1b54996.zip | |
organize packets and classes (#9)v1.1.1
Diffstat (limited to 'pkg/classes/packet.go')
| -rw-r--r-- | pkg/classes/packet.go | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/pkg/classes/packet.go b/pkg/classes/packet.go new file mode 100644 index 0000000..0bba102 --- /dev/null +++ b/pkg/classes/packet.go | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | package classes | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "fmt" | ||
| 5 | |||
| 6 | "github.com/pektezol/bitreader" | ||
| 7 | "github.com/pektezol/demoparser/pkg/messages" | ||
| 8 | "github.com/pektezol/demoparser/pkg/writer" | ||
| 9 | ) | ||
| 10 | |||
| 11 | const MSSC int = 2 | ||
| 12 | |||
| 13 | type Packet struct { | ||
| 14 | PacketInfo []CmdInfo | ||
| 15 | InSequence uint32 | ||
| 16 | OutSequence uint32 | ||
| 17 | Size uint32 | ||
| 18 | Data []any | ||
| 19 | } | ||
| 20 | |||
| 21 | type CmdInfo struct { | ||
| 22 | Flags uint32 | ||
| 23 | ViewOrigin []float32 | ||
| 24 | ViewAngles []float32 | ||
| 25 | LocalViewAngles []float32 | ||
| 26 | ViewOrigin2 []float32 | ||
| 27 | ViewAngles2 []float32 | ||
| 28 | LocalViewAngles2 []float32 | ||
| 29 | } | ||
| 30 | |||
| 31 | func (packet *Packet) ParsePacket(reader *bitreader.Reader) { | ||
| 32 | for count := 0; count < MSSC; count++ { | ||
| 33 | packet.ParseCmdInfo(reader) | ||
| 34 | } | ||
| 35 | packet.InSequence = reader.TryReadUInt32() | ||
| 36 | packet.OutSequence = reader.TryReadUInt32() | ||
| 37 | packet.Size = reader.TryReadUInt32() | ||
| 38 | packetReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(uint64(packet.Size)), true) | ||
| 39 | for { | ||
| 40 | messageType, err := packetReader.ReadBits(6) | ||
| 41 | if err != nil { | ||
| 42 | break | ||
| 43 | } | ||
| 44 | packet.Data = append(packet.Data, messages.ParseMessages(messageType, packetReader)) | ||
| 45 | } | ||
| 46 | } | ||
| 47 | |||
| 48 | func (packet *Packet) ParseCmdInfo(reader *bitreader.Reader) { | ||
| 49 | packet.PacketInfo = append(packet.PacketInfo, CmdInfo{ | ||
| 50 | Flags: reader.TryReadUInt32(), | ||
| 51 | ViewOrigin: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 52 | ViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 53 | LocalViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 54 | ViewOrigin2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 55 | ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 56 | LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, | ||
| 57 | }) | ||
| 58 | writer.AppendLine("\tFlags: %s", CmdInfoFlags(packet.PacketInfo[len(packet.PacketInfo)-1].Flags).String()) | ||
| 59 | writer.AppendLine("\tView Origin: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewOrigin) | ||
| 60 | writer.AppendLine("\tView Angles: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewAngles) | ||
| 61 | writer.AppendLine("\tLocal View Angles: %v", packet.PacketInfo[len(packet.PacketInfo)-1].LocalViewAngles) | ||
| 62 | writer.AppendLine("\tView Origin 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewOrigin2) | ||
| 63 | writer.AppendLine("\tView Angles 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].ViewAngles2) | ||
| 64 | writer.AppendLine("\tLocal View Angles 2: %v", packet.PacketInfo[len(packet.PacketInfo)-1].LocalViewAngles2) | ||
| 65 | writer.AppendLine("") | ||
| 66 | } | ||
| 67 | |||
| 68 | type CmdInfoFlags int | ||
| 69 | |||
| 70 | const ( | ||
| 71 | ECmdInfoFlagsNone = 0 | ||
| 72 | ECmdInfoFlagsUseOrigin2 = 1 | ||
| 73 | ECmdInfoFlagsUserAngles2 = 1 << 1 | ||
| 74 | ECmdInfoFlagsNoInterp = 1 << 2 | ||
| 75 | ) | ||
| 76 | |||
| 77 | func (cmdInfoFlags CmdInfoFlags) String() string { | ||
| 78 | switch cmdInfoFlags { | ||
| 79 | case ECmdInfoFlagsNone: | ||
| 80 | return "None" | ||
| 81 | case ECmdInfoFlagsUseOrigin2: | ||
| 82 | return "UseOrigin2" | ||
| 83 | case ECmdInfoFlagsUserAngles2: | ||
| 84 | return "UserAngles2" | ||
| 85 | case ECmdInfoFlagsNoInterp: | ||
| 86 | return "NoInterp" | ||
| 87 | default: | ||
| 88 | return fmt.Sprintf("%d", int(cmdInfoFlags)) | ||
| 89 | } | ||
| 90 | } | ||