diff options
Diffstat (limited to 'pkg/messages/types')
| -rw-r--r-- | pkg/messages/types/svcGameEvent.go | 45 | ||||
| -rw-r--r-- | pkg/messages/types/svcGameEventList.go | 52 |
2 files changed, 68 insertions, 29 deletions
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go index e12d75a..4410369 100644 --- a/pkg/messages/types/svcGameEvent.go +++ b/pkg/messages/types/svcGameEvent.go | |||
| @@ -6,15 +6,52 @@ import ( | |||
| 6 | ) | 6 | ) |
| 7 | 7 | ||
| 8 | type SvcGameEvent struct { | 8 | type SvcGameEvent struct { |
| 9 | Length uint16 | 9 | Length uint16 |
| 10 | Data []byte // TODO: GameEvent[] | 10 | EventID uint32 |
| 11 | EventDescription GameEventDescriptor | ||
| 12 | EventDescriptors []EventDescriptorKey | ||
| 13 | } | ||
| 14 | |||
| 15 | type EventDescriptorKey struct { | ||
| 16 | Name string | ||
| 17 | Descriptor any | ||
| 11 | } | 18 | } |
| 12 | 19 | ||
| 13 | func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent { | 20 | func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent { |
| 14 | svcGameEvent := SvcGameEvent{ | 21 | svcGameEvent := SvcGameEvent{ |
| 15 | Length: uint16(reader.TryReadBits(11)), | 22 | Length: uint16(reader.TryReadBits(11)), |
| 16 | } | 23 | } |
| 17 | svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)) | 24 | gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true) |
| 18 | writer.TempAppendLine("\t\tData: %v", svcGameEvent.Data) | 25 | svcGameEvent.parseGameEvent(gameEventReader) |
| 19 | return svcGameEvent | 26 | return svcGameEvent |
| 20 | } | 27 | } |
| 28 | |||
| 29 | func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader) { | ||
| 30 | svcGameEvent.EventID = uint32(reader.TryReadBits(9)) | ||
| 31 | svcGameEvent.EventDescription = GameEventList.GameEventDescriptor[svcGameEvent.EventID] | ||
| 32 | writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID) | ||
| 33 | for _, descriptor := range svcGameEvent.EventDescription.Keys { | ||
| 34 | var value any | ||
| 35 | switch descriptor.Type { | ||
| 36 | case EventDescriptorString: | ||
| 37 | value = reader.TryReadString() | ||
| 38 | case EventDescriptorFloat: | ||
| 39 | value = reader.TryReadFloat32() | ||
| 40 | case EventDescriptorInt32: | ||
| 41 | value = reader.TryReadSInt32() | ||
| 42 | case EventDescriptorInt16: | ||
| 43 | value = reader.TryReadSInt16() | ||
| 44 | case EventDescriptorInt8: | ||
| 45 | value = reader.TryReadUInt8() | ||
| 46 | case EventDescriptorBool: | ||
| 47 | value = reader.TryReadBool() | ||
| 48 | case EventDescriptorUInt64: | ||
| 49 | value = reader.TryReadUInt64() | ||
| 50 | } | ||
| 51 | svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{ | ||
| 52 | Name: descriptor.Name, | ||
| 53 | Descriptor: value, | ||
| 54 | }) | ||
| 55 | writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value) | ||
| 56 | } | ||
| 57 | } | ||
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go index d020feb..f1cfffb 100644 --- a/pkg/messages/types/svcGameEventList.go +++ b/pkg/messages/types/svcGameEventList.go | |||
| @@ -7,6 +7,8 @@ import ( | |||
| 7 | "github.com/pektezol/demoparser/pkg/writer" | 7 | "github.com/pektezol/demoparser/pkg/writer" |
| 8 | ) | 8 | ) |
| 9 | 9 | ||
| 10 | var GameEventList *SvcGameEventList | ||
| 11 | |||
| 10 | type SvcGameEventList struct { | 12 | type SvcGameEventList struct { |
| 11 | Events int16 | 13 | Events int16 |
| 12 | Length int32 | 14 | Length int32 |
| @@ -16,10 +18,12 @@ type SvcGameEventList struct { | |||
| 16 | type GameEventDescriptor struct { | 18 | type GameEventDescriptor struct { |
| 17 | EventID uint32 | 19 | EventID uint32 |
| 18 | Name string | 20 | Name string |
| 19 | Keys []struct { | 21 | Keys []GameEventDescriptorKey |
| 20 | Name string | 22 | } |
| 21 | Type EventDescriptor | 23 | |
| 22 | } | 24 | type GameEventDescriptorKey struct { |
| 25 | Name string | ||
| 26 | Type EventDescriptor | ||
| 23 | } | 27 | } |
| 24 | 28 | ||
| 25 | type EventDescriptor uint8 | 29 | type EventDescriptor uint8 |
| @@ -32,60 +36,58 @@ func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList { | |||
| 32 | gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) | 36 | gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) |
| 33 | writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) | 37 | writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) |
| 34 | svcGameEventList.parseGameEventDescriptor(gameEventListReader) | 38 | svcGameEventList.parseGameEventDescriptor(gameEventListReader) |
| 39 | GameEventList = &svcGameEventList | ||
| 35 | return svcGameEventList | 40 | return svcGameEventList |
| 36 | } | 41 | } |
| 37 | 42 | ||
| 38 | func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { | 43 | func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { |
| 39 | svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) | 44 | svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) |
| 40 | for event := 0; event < int(svcGameEventList.Events); event++ { | 45 | for event := 0; event < int(svcGameEventList.Events); event++ { |
| 41 | gameEventDescriptor := GameEventDescriptor{ | 46 | svcGameEventList.GameEventDescriptor[event] = GameEventDescriptor{ |
| 42 | EventID: uint32(reader.TryReadBits(9)), | 47 | EventID: uint32(reader.TryReadBits(9)), |
| 43 | Name: reader.TryReadString(), | 48 | Name: reader.TryReadString(), |
| 44 | } | 49 | } |
| 45 | writer.TempAppendLine("\t\t\t%d: %s", gameEventDescriptor.EventID, gameEventDescriptor.Name) | 50 | writer.TempAppendLine("\t\t\t%d: %s", svcGameEventList.GameEventDescriptor[event].EventID, svcGameEventList.GameEventDescriptor[event].Name) |
| 46 | for { | 51 | for { |
| 47 | descriptorType := reader.TryReadBits(3) | 52 | descriptorType := reader.TryReadBits(3) |
| 48 | if descriptorType == 0 { | 53 | if descriptorType == 0 { |
| 49 | break | 54 | break |
| 50 | } | 55 | } |
| 51 | KeyName := reader.TryReadString() | 56 | KeyName := reader.TryReadString() |
| 52 | gameEventDescriptor.Keys = append(gameEventDescriptor.Keys, struct { | 57 | svcGameEventList.GameEventDescriptor[event].Keys = append(svcGameEventList.GameEventDescriptor[event].Keys, GameEventDescriptorKey{ |
| 53 | Name string | ||
| 54 | Type EventDescriptor | ||
| 55 | }{ | ||
| 56 | Name: KeyName, | 58 | Name: KeyName, |
| 57 | Type: EventDescriptor(descriptorType), | 59 | Type: EventDescriptor(descriptorType), |
| 58 | }) | 60 | }) |
| 59 | } | 61 | } |
| 60 | writer.TempAppendLine("\t\t\t\tKeys: %v", gameEventDescriptor.Keys) | 62 | writer.TempAppendLine("\t\t\t\tKeys: %v", svcGameEventList.GameEventDescriptor[event].Keys) |
| 61 | } | 63 | } |
| 62 | } | 64 | } |
| 63 | 65 | ||
| 64 | const ( | 66 | const ( |
| 65 | String EventDescriptor = iota + 1 | 67 | EventDescriptorString EventDescriptor = iota + 1 |
| 66 | Float | 68 | EventDescriptorFloat |
| 67 | Int32 | 69 | EventDescriptorInt32 |
| 68 | Int16 | 70 | EventDescriptorInt16 |
| 69 | Int8 | 71 | EventDescriptorInt8 |
| 70 | Bool | 72 | EventDescriptorBool |
| 71 | UInt64 | 73 | EventDescriptorUInt64 |
| 72 | ) | 74 | ) |
| 73 | 75 | ||
| 74 | func (eventDescriptor EventDescriptor) String() string { | 76 | func (eventDescriptor EventDescriptor) String() string { |
| 75 | switch eventDescriptor { | 77 | switch eventDescriptor { |
| 76 | case String: | 78 | case EventDescriptorString: |
| 77 | return "String" | 79 | return "String" |
| 78 | case Float: | 80 | case EventDescriptorFloat: |
| 79 | return "Float" | 81 | return "Float" |
| 80 | case Int32: | 82 | case EventDescriptorInt32: |
| 81 | return "Int32" | 83 | return "Int32" |
| 82 | case Int16: | 84 | case EventDescriptorInt16: |
| 83 | return "Int16" | 85 | return "Int16" |
| 84 | case Int8: | 86 | case EventDescriptorInt8: |
| 85 | return "Int8" | 87 | return "Int8" |
| 86 | case Bool: | 88 | case EventDescriptorBool: |
| 87 | return "Bool" | 89 | return "Bool" |
| 88 | case UInt64: | 90 | case EventDescriptorUInt64: |
| 89 | return "UInt64" | 91 | return "UInt64" |
| 90 | default: | 92 | default: |
| 91 | return fmt.Sprintf("%d", eventDescriptor) | 93 | return fmt.Sprintf("%d", eventDescriptor) |