aboutsummaryrefslogtreecommitdiff
path: root/pkg/messages/types/svcGameEvent.go
blob: cb1e91d0d54e44115434fd36c0b560f5c3c10946 (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/sdp.go/pkg/types"
)

type SvcGameEvent struct {
	Length           uint16                    `json:"length"`
	EventID          uint32                    `json:"event_id"`
	EventDescription types.GameEventDescriptor `json:"event_description"`
	EventDescriptors []EventDescriptorKey      `json:"event_descriptors"`
}

type EventDescriptorKey struct {
	Name       string `json:"name"`
	Descriptor any    `json:"descriptor"`
}

func ParseSvcGameEvent(reader *bitreader.Reader, demo *types.Demo) SvcGameEvent {
	svcGameEvent := SvcGameEvent{
		Length: uint16(reader.TryReadBits(11)),
	}
	gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true)
	svcGameEvent.parseGameEvent(gameEventReader, demo)
	return svcGameEvent
}

func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader, demo *types.Demo) {
	svcGameEvent.EventID = uint32(reader.TryReadBits(9))
	svcGameEvent.EventDescription = demo.GameEventList.GameEventDescriptor[svcGameEvent.EventID]
	demo.Writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID)
	for _, descriptor := range svcGameEvent.EventDescription.Keys {
		var value any
		switch descriptor.Type {
		case types.EventDescriptorString:
			value = reader.TryReadString()
		case types.EventDescriptorFloat:
			value = reader.TryReadFloat32()
		case types.EventDescriptorInt32:
			value = reader.TryReadSInt32()
		case types.EventDescriptorInt16:
			value = reader.TryReadSInt16()
		case types.EventDescriptorInt8:
			value = reader.TryReadUInt8()
		case types.EventDescriptorBool:
			value = reader.TryReadBool()
		case types.EventDescriptorUInt64:
			value = reader.TryReadUInt64()
		}
		svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{
			Name:       descriptor.Name,
			Descriptor: value,
		})
		demo.Writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value)
	}
}