diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-27 00:52:47 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-27 00:52:47 +0300 |
| commit | 2ec2cf3cff547ae5daa79e7914394ce3f88504b2 (patch) | |
| tree | 3e78eda432107fc6493a2f0beba1b86873eaf38e /pkg/messages/types | |
| parent | add new user messages, fix some writer types (#13) (diff) | |
| download | sdp.go-2ec2cf3cff547ae5daa79e7914394ce3f88504b2.tar.gz sdp.go-2ec2cf3cff547ae5daa79e7914394ce3f88504b2.tar.bz2 sdp.go-2ec2cf3cff547ae5daa79e7914394ce3f88504b2.zip | |
added game event list detailed parsing (#14)
Diffstat (limited to 'pkg/messages/types')
| -rw-r--r-- | pkg/messages/types/svcGameEventList.go | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go index 1fa7589..d020feb 100644 --- a/pkg/messages/types/svcGameEventList.go +++ b/pkg/messages/types/svcGameEventList.go | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | package messages | 1 | package messages |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | ||
| 5 | |||
| 4 | "github.com/pektezol/bitreader" | 6 | "github.com/pektezol/bitreader" |
| 5 | "github.com/pektezol/demoparser/pkg/writer" | 7 | "github.com/pektezol/demoparser/pkg/writer" |
| 6 | ) | 8 | ) |
| @@ -8,18 +10,84 @@ import ( | |||
| 8 | type SvcGameEventList struct { | 10 | type SvcGameEventList struct { |
| 9 | Events int16 | 11 | Events int16 |
| 10 | Length int32 | 12 | Length int32 |
| 11 | GameEventDescriptor []gameEventDescriptor | 13 | GameEventDescriptor []GameEventDescriptor |
| 12 | } | 14 | } |
| 13 | 15 | ||
| 14 | type gameEventDescriptor struct { | 16 | type GameEventDescriptor struct { |
| 17 | EventID uint32 | ||
| 18 | Name string | ||
| 19 | Keys []struct { | ||
| 20 | Name string | ||
| 21 | Type EventDescriptor | ||
| 22 | } | ||
| 15 | } | 23 | } |
| 16 | 24 | ||
| 25 | type EventDescriptor uint8 | ||
| 26 | |||
| 17 | func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList { | 27 | func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList { |
| 18 | svcGameEventList := SvcGameEventList{ | 28 | svcGameEventList := SvcGameEventList{ |
| 19 | Events: int16(reader.TryReadBits(9)), | 29 | Events: int16(reader.TryReadBits(9)), |
| 20 | Length: int32(reader.TryReadBits(20)), | 30 | Length: int32(reader.TryReadBits(20)), |
| 21 | } | 31 | } |
| 22 | reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)) | 32 | gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) |
| 23 | writer.TempAppendLine("\t\tEvents: %d", svcGameEventList.Events) | 33 | writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) |
| 34 | svcGameEventList.parseGameEventDescriptor(gameEventListReader) | ||
| 24 | return svcGameEventList | 35 | return svcGameEventList |
| 25 | } | 36 | } |
| 37 | |||
| 38 | func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { | ||
| 39 | svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) | ||
| 40 | for event := 0; event < int(svcGameEventList.Events); event++ { | ||
| 41 | gameEventDescriptor := GameEventDescriptor{ | ||
| 42 | EventID: uint32(reader.TryReadBits(9)), | ||
| 43 | Name: reader.TryReadString(), | ||
| 44 | } | ||
| 45 | writer.TempAppendLine("\t\t\t%d: %s", gameEventDescriptor.EventID, gameEventDescriptor.Name) | ||
| 46 | for { | ||
| 47 | descriptorType := reader.TryReadBits(3) | ||
| 48 | if descriptorType == 0 { | ||
| 49 | break | ||
| 50 | } | ||
| 51 | KeyName := reader.TryReadString() | ||
| 52 | gameEventDescriptor.Keys = append(gameEventDescriptor.Keys, struct { | ||
| 53 | Name string | ||
| 54 | Type EventDescriptor | ||
| 55 | }{ | ||
| 56 | Name: KeyName, | ||
| 57 | Type: EventDescriptor(descriptorType), | ||
| 58 | }) | ||
| 59 | } | ||
| 60 | writer.TempAppendLine("\t\t\t\tKeys: %v", gameEventDescriptor.Keys) | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | const ( | ||
| 65 | String EventDescriptor = iota + 1 | ||
| 66 | Float | ||
| 67 | Int32 | ||
| 68 | Int16 | ||
| 69 | Int8 | ||
| 70 | Bool | ||
| 71 | UInt64 | ||
| 72 | ) | ||
| 73 | |||
| 74 | func (eventDescriptor EventDescriptor) String() string { | ||
| 75 | switch eventDescriptor { | ||
| 76 | case String: | ||
| 77 | return "String" | ||
| 78 | case Float: | ||
| 79 | return "Float" | ||
| 80 | case Int32: | ||
| 81 | return "Int32" | ||
| 82 | case Int16: | ||
| 83 | return "Int16" | ||
| 84 | case Int8: | ||
| 85 | return "Int8" | ||
| 86 | case Bool: | ||
| 87 | return "Bool" | ||
| 88 | case UInt64: | ||
| 89 | return "UInt64" | ||
| 90 | default: | ||
| 91 | return fmt.Sprintf("%d", eventDescriptor) | ||
| 92 | } | ||
| 93 | } | ||