From b73e472a972183386e8e787a6889ec452de0ef7f Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 27 Sep 2023 21:43:40 +0300 Subject: finish SvcGameEvent while editing SvcGameEventList (#15) --- pkg/messages/types/svcGameEvent.go | 45 ++++++++++++++++++++++++++--- 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 ( ) type SvcGameEvent struct { - Length uint16 - Data []byte // TODO: GameEvent[] + Length uint16 + EventID uint32 + EventDescription GameEventDescriptor + EventDescriptors []EventDescriptorKey +} + +type EventDescriptorKey struct { + Name string + Descriptor any } func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent { svcGameEvent := SvcGameEvent{ Length: uint16(reader.TryReadBits(11)), } - svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)) - writer.TempAppendLine("\t\tData: %v", svcGameEvent.Data) + gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true) + svcGameEvent.parseGameEvent(gameEventReader) return svcGameEvent } + +func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader) { + svcGameEvent.EventID = uint32(reader.TryReadBits(9)) + svcGameEvent.EventDescription = GameEventList.GameEventDescriptor[svcGameEvent.EventID] + writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID) + for _, descriptor := range svcGameEvent.EventDescription.Keys { + var value any + switch descriptor.Type { + case EventDescriptorString: + value = reader.TryReadString() + case EventDescriptorFloat: + value = reader.TryReadFloat32() + case EventDescriptorInt32: + value = reader.TryReadSInt32() + case EventDescriptorInt16: + value = reader.TryReadSInt16() + case EventDescriptorInt8: + value = reader.TryReadUInt8() + case EventDescriptorBool: + value = reader.TryReadBool() + case EventDescriptorUInt64: + value = reader.TryReadUInt64() + } + svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{ + Name: descriptor.Name, + Descriptor: value, + }) + writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value) + } +} 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 ( "github.com/pektezol/demoparser/pkg/writer" ) +var GameEventList *SvcGameEventList + type SvcGameEventList struct { Events int16 Length int32 @@ -16,10 +18,12 @@ type SvcGameEventList struct { type GameEventDescriptor struct { EventID uint32 Name string - Keys []struct { - Name string - Type EventDescriptor - } + Keys []GameEventDescriptorKey +} + +type GameEventDescriptorKey struct { + Name string + Type EventDescriptor } type EventDescriptor uint8 @@ -32,60 +36,58 @@ func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList { gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) svcGameEventList.parseGameEventDescriptor(gameEventListReader) + GameEventList = &svcGameEventList return svcGameEventList } func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) for event := 0; event < int(svcGameEventList.Events); event++ { - gameEventDescriptor := GameEventDescriptor{ + svcGameEventList.GameEventDescriptor[event] = GameEventDescriptor{ EventID: uint32(reader.TryReadBits(9)), Name: reader.TryReadString(), } - writer.TempAppendLine("\t\t\t%d: %s", gameEventDescriptor.EventID, gameEventDescriptor.Name) + writer.TempAppendLine("\t\t\t%d: %s", svcGameEventList.GameEventDescriptor[event].EventID, svcGameEventList.GameEventDescriptor[event].Name) for { descriptorType := reader.TryReadBits(3) if descriptorType == 0 { break } KeyName := reader.TryReadString() - gameEventDescriptor.Keys = append(gameEventDescriptor.Keys, struct { - Name string - Type EventDescriptor - }{ + svcGameEventList.GameEventDescriptor[event].Keys = append(svcGameEventList.GameEventDescriptor[event].Keys, GameEventDescriptorKey{ Name: KeyName, Type: EventDescriptor(descriptorType), }) } - writer.TempAppendLine("\t\t\t\tKeys: %v", gameEventDescriptor.Keys) + writer.TempAppendLine("\t\t\t\tKeys: %v", svcGameEventList.GameEventDescriptor[event].Keys) } } const ( - String EventDescriptor = iota + 1 - Float - Int32 - Int16 - Int8 - Bool - UInt64 + EventDescriptorString EventDescriptor = iota + 1 + EventDescriptorFloat + EventDescriptorInt32 + EventDescriptorInt16 + EventDescriptorInt8 + EventDescriptorBool + EventDescriptorUInt64 ) func (eventDescriptor EventDescriptor) String() string { switch eventDescriptor { - case String: + case EventDescriptorString: return "String" - case Float: + case EventDescriptorFloat: return "Float" - case Int32: + case EventDescriptorInt32: return "Int32" - case Int16: + case EventDescriptorInt16: return "Int16" - case Int8: + case EventDescriptorInt8: return "Int8" - case Bool: + case EventDescriptorBool: return "Bool" - case UInt64: + case EventDescriptorUInt64: return "UInt64" default: return fmt.Sprintf("%d", eventDescriptor) -- cgit v1.2.3