aboutsummaryrefslogtreecommitdiff
path: root/pkg/messages/types/svcGameEvent.go
blob: 4410369650be5429aeb8b0234b63ff4dec20803f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package messages

import (
	"github.com/pektezol/bitreader"
	"github.com/pektezol/demoparser/pkg/writer"
)

type SvcGameEvent struct {
	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)),
	}
	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)
	}
}