aboutsummaryrefslogtreecommitdiff
path: root/pkg/messages
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-06-15 13:58:30 +0300
committerGitHub <noreply@github.com>2024-06-15 13:58:30 +0300
commit77e4b066cb8d506b4bc944ab4eb2d6e4679e2202 (patch)
tree1d549eca619ed36cb881e487cb054c4643ac8376 /pkg/messages
parentchange project name to sdp.go (diff)
downloadsdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.gz
sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.bz2
sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.zip
enable multithreading with goroutines (#20)
Diffstat (limited to 'pkg/messages')
-rw-r--r--pkg/messages/messages.go76
-rw-r--r--pkg/messages/types/netDisconnect.go8
-rw-r--r--pkg/messages/types/netFile.go16
-rw-r--r--pkg/messages/types/netNop.go6
-rw-r--r--pkg/messages/types/netSetConVar.go16
-rw-r--r--pkg/messages/types/netSignOnState.go28
-rw-r--r--pkg/messages/types/netSplitScreenUser.go8
-rw-r--r--pkg/messages/types/netStringCmd.go8
-rw-r--r--pkg/messages/types/netTick.go16
-rw-r--r--pkg/messages/types/svcBspDecal.go28
-rw-r--r--pkg/messages/types/svcClassInfo.go24
-rw-r--r--pkg/messages/types/svcCmdKeyValues.go10
-rw-r--r--pkg/messages/types/svcCreateStringTable.go36
-rw-r--r--pkg/messages/types/svcCrosshairAngle.go18
-rw-r--r--pkg/messages/types/svcEntityMessage.go18
-rw-r--r--pkg/messages/types/svcFixAngle.go22
-rw-r--r--pkg/messages/types/svcGameEvent.go40
-rw-r--r--pkg/messages/types/svcGameEventList.go89
-rw-r--r--pkg/messages/types/svcGetCvarValue.go12
-rw-r--r--pkg/messages/types/svcMenu.go14
-rw-r--r--pkg/messages/types/svcPacketEntities.go34
-rw-r--r--pkg/messages/types/svcPaintmapData.go10
-rw-r--r--pkg/messages/types/svcPrefetch.go8
-rw-r--r--pkg/messages/types/svcPrint.go8
-rw-r--r--pkg/messages/types/svcSendTable.go16
-rw-r--r--pkg/messages/types/svcServerInfo.go68
-rw-r--r--pkg/messages/types/svcSetPause.go8
-rw-r--r--pkg/messages/types/svcSetView.go8
-rw-r--r--pkg/messages/types/svcSounds.go18
-rw-r--r--pkg/messages/types/svcSplitScreen.go14
-rw-r--r--pkg/messages/types/svcTempEntities.go14
-rw-r--r--pkg/messages/types/svcUpdateStringTable.go16
-rw-r--r--pkg/messages/types/svcUserMessage.go495
-rw-r--r--pkg/messages/types/svcVoiceData.go18
-rw-r--r--pkg/messages/types/svcVoiceInit.go16
35 files changed, 592 insertions, 652 deletions
diff --git a/pkg/messages/messages.go b/pkg/messages/messages.go
index 0dca169..1c6cf1f 100644
--- a/pkg/messages/messages.go
+++ b/pkg/messages/messages.go
@@ -5,84 +5,84 @@ import (
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 messages "github.com/pektezol/sdp.go/pkg/messages/types" 7 messages "github.com/pektezol/sdp.go/pkg/messages/types"
8 "github.com/pektezol/sdp.go/pkg/writer" 8 types "github.com/pektezol/sdp.go/pkg/types"
9) 9)
10 10
11func ParseMessages(messageType uint64, reader *bitreader.Reader) any { 11func ParseMessages(messageType uint64, reader *bitreader.Reader, demo *types.Demo) any {
12 var messageData any 12 var messageData any
13 switch messageType { 13 switch messageType {
14 case 0: 14 case 0:
15 messageData = messages.ParseNetNop(reader) 15 messageData = messages.ParseNetNop(reader, demo)
16 case 1: 16 case 1:
17 messageData = messages.ParseNetDisconnect(reader) 17 messageData = messages.ParseNetDisconnect(reader, demo)
18 case 2: 18 case 2:
19 messageData = messages.ParseNetFile(reader) 19 messageData = messages.ParseNetFile(reader, demo)
20 case 3: 20 case 3:
21 messageData = messages.ParseNetSplitScreenUser(reader) 21 messageData = messages.ParseNetSplitScreenUser(reader, demo)
22 case 4: 22 case 4:
23 messageData = messages.ParseNetTick(reader) 23 messageData = messages.ParseNetTick(reader, demo)
24 case 5: 24 case 5:
25 messageData = messages.ParseNetStringCmd(reader) 25 messageData = messages.ParseNetStringCmd(reader, demo)
26 case 6: 26 case 6:
27 messageData = messages.ParseNetSetConVar(reader) 27 messageData = messages.ParseNetSetConVar(reader, demo)
28 case 7: 28 case 7:
29 messageData = messages.ParseNetSignOnState(reader) 29 messageData = messages.ParseNetSignOnState(reader, demo)
30 case 8: 30 case 8:
31 messageData = messages.ParseSvcServerInfo(reader) 31 messageData = messages.ParseSvcServerInfo(reader, demo)
32 case 9: 32 case 9:
33 messageData = messages.ParseSvcSendTable(reader) 33 messageData = messages.ParseSvcSendTable(reader, demo)
34 case 10: 34 case 10:
35 messageData = messages.ParseSvcClassInfo(reader) 35 messageData = messages.ParseSvcClassInfo(reader, demo)
36 case 11: 36 case 11:
37 messageData = messages.ParseSvcSetPause(reader) 37 messageData = messages.ParseSvcSetPause(reader, demo)
38 case 12: 38 case 12:
39 messageData = messages.ParseSvcCreateStringTable(reader) // TODO: 39 messageData = messages.ParseSvcCreateStringTable(reader, demo) // TODO:
40 case 13: 40 case 13:
41 messageData = messages.ParseSvcUpdateStringTable(reader) // TODO: 41 messageData = messages.ParseSvcUpdateStringTable(reader, demo) // TODO:
42 case 14: 42 case 14:
43 messageData = messages.ParseSvcVoiceInit(reader) 43 messageData = messages.ParseSvcVoiceInit(reader, demo)
44 case 15: 44 case 15:
45 messageData = messages.ParseSvcVoiceData(reader) 45 messageData = messages.ParseSvcVoiceData(reader, demo)
46 case 16: 46 case 16:
47 messageData = messages.ParseSvcPrint(reader) 47 messageData = messages.ParseSvcPrint(reader, demo)
48 case 17: 48 case 17:
49 messageData = messages.ParseSvcSounds(reader) // TODO: 49 messageData = messages.ParseSvcSounds(reader, demo) // TODO:
50 case 18: 50 case 18:
51 messageData = messages.ParseSvcSetView(reader) 51 messageData = messages.ParseSvcSetView(reader, demo)
52 case 19: 52 case 19:
53 messageData = messages.ParseSvcFixAngle(reader) 53 messageData = messages.ParseSvcFixAngle(reader, demo)
54 case 20: 54 case 20:
55 messageData = messages.ParseSvcCrosshairAngle(reader) 55 messageData = messages.ParseSvcCrosshairAngle(reader, demo)
56 case 21: 56 case 21:
57 messageData = messages.ParseSvcBspDecal(reader) // untested 57 messageData = messages.ParseSvcBspDecal(reader, demo) // untested
58 case 22: 58 case 22:
59 messageData = messages.ParseSvcSplitScreen(reader) // skipped 59 messageData = messages.ParseSvcSplitScreen(reader, demo) // skipped
60 case 23: 60 case 23:
61 messageData = messages.ParseSvcUserMessage(reader) 61 messageData = messages.ParseSvcUserMessage(reader, demo)
62 case 24: 62 case 24:
63 messageData = messages.ParseSvcEntityMessage(reader) // skipped 63 messageData = messages.ParseSvcEntityMessage(reader, demo) // skipped
64 case 25: 64 case 25:
65 messageData = messages.ParseSvcGameEvent(reader) 65 messageData = messages.ParseSvcGameEvent(reader, demo)
66 case 26: 66 case 26:
67 messageData = messages.ParseSvcPacketEntities(reader) // TODO: 67 messageData = messages.ParseSvcPacketEntities(reader, demo) // TODO:
68 case 27: 68 case 27:
69 messageData = messages.ParseSvcTempEntities(reader) // skipped 69 messageData = messages.ParseSvcTempEntities(reader, demo) // skipped
70 case 28: 70 case 28:
71 messageData = messages.ParseSvcPrefetch(reader) 71 messageData = messages.ParseSvcPrefetch(reader, demo)
72 case 29: 72 case 29:
73 messageData = messages.ParseSvcMenu(reader) // skipped 73 messageData = messages.ParseSvcMenu(reader, demo) // skipped
74 case 30: 74 case 30:
75 messageData = messages.ParseSvcGameEventList(reader) 75 messageData = messages.ParseSvcGameEventList(reader, demo)
76 case 31: 76 case 31:
77 messageData = messages.ParseSvcGetCvarValue(reader) 77 messageData = messages.ParseSvcGetCvarValue(reader, demo)
78 case 32: 78 case 32:
79 messageData = messages.ParseSvcCmdKeyValues(reader) 79 messageData = messages.ParseSvcCmdKeyValues(reader, demo)
80 case 33: 80 case 33:
81 messageData = messages.ParseSvcPaintmapData(reader) // skipped 81 messageData = messages.ParseSvcPaintmapData(reader, demo) // skipped
82 default: 82 default:
83 return nil 83 return nil
84 } 84 }
85 writer.AppendLine("\tMessage: %s (%d):", reflect.ValueOf(messageData).Type(), messageType) 85 demo.Writer.AppendLine("\tMessage: %s (%d):", reflect.ValueOf(messageData).Type(), messageType)
86 writer.AppendOutputFromTemp() 86 demo.Writer.AppendOutputFromTemp()
87 return messageData 87 return messageData
88} 88}
diff --git a/pkg/messages/types/netDisconnect.go b/pkg/messages/types/netDisconnect.go
index c3c857e..c8514c0 100644
--- a/pkg/messages/types/netDisconnect.go
+++ b/pkg/messages/types/netDisconnect.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type NetDisconnect struct { 8type NetDisconnect struct {
9 Text string 9 Text string `json:"text"`
10} 10}
11 11
12func ParseNetDisconnect(reader *bitreader.Reader) NetDisconnect { 12func ParseNetDisconnect(reader *bitreader.Reader, demo *types.Demo) NetDisconnect {
13 netDisconnect := NetDisconnect{ 13 netDisconnect := NetDisconnect{
14 Text: reader.TryReadString(), 14 Text: reader.TryReadString(),
15 } 15 }
16 writer.TempAppendLine("\t\tText: %s", netDisconnect.Text) 16 demo.Writer.TempAppendLine("\t\tText: %s", netDisconnect.Text)
17 return netDisconnect 17 return netDisconnect
18} 18}
diff --git a/pkg/messages/types/netFile.go b/pkg/messages/types/netFile.go
index e74cdb3..837a4c0 100644
--- a/pkg/messages/types/netFile.go
+++ b/pkg/messages/types/netFile.go
@@ -4,13 +4,13 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type NetFile struct { 10type NetFile struct {
11 TransferId uint32 11 TransferId uint32 `json:"transfer_id"`
12 FileName string 12 FileName string `json:"file_name"`
13 FileFlags string 13 FileFlags string `json:"file_flags"`
14} 14}
15 15
16type NetFileFlags int 16type NetFileFlags int
@@ -34,14 +34,14 @@ func (netFileFlags NetFileFlags) String() string {
34 } 34 }
35} 35}
36 36
37func ParseNetFile(reader *bitreader.Reader) NetFile { 37func ParseNetFile(reader *bitreader.Reader, demo *types.Demo) NetFile {
38 netFile := NetFile{ 38 netFile := NetFile{
39 TransferId: reader.TryReadUInt32(), 39 TransferId: reader.TryReadUInt32(),
40 FileName: reader.TryReadString(), 40 FileName: reader.TryReadString(),
41 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(), 41 FileFlags: NetFileFlags(reader.TryReadBits(2)).String(),
42 } 42 }
43 writer.TempAppendLine("\t\tTransfer ID: %d", netFile.TransferId) 43 demo.Writer.TempAppendLine("\t\tTransfer ID: %d", netFile.TransferId)
44 writer.TempAppendLine("\t\tFile Name: %s", netFile.FileName) 44 demo.Writer.TempAppendLine("\t\tFile Name: %s", netFile.FileName)
45 writer.TempAppendLine("\t\tFile Flags: %s", netFile.FileFlags) 45 demo.Writer.TempAppendLine("\t\tFile Flags: %s", netFile.FileFlags)
46 return netFile 46 return netFile
47} 47}
diff --git a/pkg/messages/types/netNop.go b/pkg/messages/types/netNop.go
index c7ba66c..5405659 100644
--- a/pkg/messages/types/netNop.go
+++ b/pkg/messages/types/netNop.go
@@ -2,12 +2,12 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type NetNop struct{} 8type NetNop struct{}
9 9
10func ParseNetNop(reader *bitreader.Reader) NetNop { 10func ParseNetNop(reader *bitreader.Reader, demo *types.Demo) NetNop {
11 writer.TempAppendLine("\t\t{}") 11 demo.Writer.TempAppendLine("\t\t{}")
12 return NetNop{} 12 return NetNop{}
13} 13}
diff --git a/pkg/messages/types/netSetConVar.go b/pkg/messages/types/netSetConVar.go
index e9902b5..0c62fdd 100644
--- a/pkg/messages/types/netSetConVar.go
+++ b/pkg/messages/types/netSetConVar.go
@@ -2,29 +2,29 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type NetSetConVar struct { 8type NetSetConVar struct {
9 Length uint8 9 Length uint8 `json:"length"`
10 ConVars []conVar 10 ConVars []conVar `json:"con_vars"`
11} 11}
12 12
13type conVar struct { 13type conVar struct {
14 Name string 14 Name string `json:"name"`
15 Value string 15 Value string `json:"value"`
16} 16}
17 17
18func ParseNetSetConVar(reader *bitreader.Reader) NetSetConVar { 18func ParseNetSetConVar(reader *bitreader.Reader, demo *types.Demo) NetSetConVar {
19 length := reader.TryReadUInt8() 19 length := reader.TryReadUInt8()
20 convars := []conVar{} 20 convars := []conVar{}
21 writer.TempAppendLine("\t\tLength: %d", length) 21 demo.Writer.TempAppendLine("\t\tLength: %d", length)
22 for count := 0; count < int(length); count++ { 22 for count := 0; count < int(length); count++ {
23 convar := conVar{ 23 convar := conVar{
24 Name: reader.TryReadString(), 24 Name: reader.TryReadString(),
25 Value: reader.TryReadString(), 25 Value: reader.TryReadString(),
26 } 26 }
27 writer.TempAppendLine("\t\t[%d] %s: %s", count, convar.Name, convar.Value) 27 demo.Writer.TempAppendLine("\t\t[%d] %s: %s", count, convar.Name, convar.Value)
28 convars = append(convars, convar) 28 convars = append(convars, convar)
29 } 29 }
30 return NetSetConVar{ 30 return NetSetConVar{
diff --git a/pkg/messages/types/netSignOnState.go b/pkg/messages/types/netSignOnState.go
index e25eaed..0043465 100644
--- a/pkg/messages/types/netSignOnState.go
+++ b/pkg/messages/types/netSignOnState.go
@@ -4,17 +4,17 @@ import (
4 "fmt" 4 "fmt"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type NetSignOnState struct { 10type NetSignOnState struct {
11 SignOnState string 11 SignOnState string `json:"sign_on_state"`
12 SpawnCount int32 12 SpawnCount int32 `json:"spawn_count"`
13 NumServerPlayers uint32 13 NumServerPlayers uint32 `json:"num_server_players"`
14 IdsLength uint32 14 IdsLength uint32 `json:"ids_length"`
15 PlayersNetworksIds []byte 15 PlayersNetworksIds []byte `json:"players_networks_ids"`
16 MapNameLength uint32 16 MapNameLength uint32 `json:"map_name_length"`
17 MapName string 17 MapName string `json:"map_name"`
18} 18}
19 19
20type SignOnState int 20type SignOnState int
@@ -53,24 +53,24 @@ func (signOnState SignOnState) String() string {
53 } 53 }
54} 54}
55 55
56func ParseNetSignOnState(reader *bitreader.Reader) NetSignOnState { 56func ParseNetSignOnState(reader *bitreader.Reader, demo *types.Demo) NetSignOnState {
57 netSignOnState := NetSignOnState{ 57 netSignOnState := NetSignOnState{
58 SignOnState: SignOnState(reader.TryReadUInt8()).String(), 58 SignOnState: SignOnState(reader.TryReadUInt8()).String(),
59 SpawnCount: reader.TryReadSInt32(), 59 SpawnCount: reader.TryReadSInt32(),
60 NumServerPlayers: reader.TryReadUInt32(), 60 NumServerPlayers: reader.TryReadUInt32(),
61 IdsLength: reader.TryReadUInt32(), 61 IdsLength: reader.TryReadUInt32(),
62 } 62 }
63 writer.TempAppendLine("\t\tSign On State: %s", netSignOnState.SignOnState) 63 demo.Writer.TempAppendLine("\t\tSign On State: %s", netSignOnState.SignOnState)
64 writer.TempAppendLine("\t\tSpawn Count: %d", netSignOnState.SpawnCount) 64 demo.Writer.TempAppendLine("\t\tSpawn Count: %d", netSignOnState.SpawnCount)
65 writer.TempAppendLine("\t\tNumber Of Server Players: %d", netSignOnState.NumServerPlayers) 65 demo.Writer.TempAppendLine("\t\tNumber Of Server Players: %d", netSignOnState.NumServerPlayers)
66 if netSignOnState.IdsLength > 0 { 66 if netSignOnState.IdsLength > 0 {
67 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength)) 67 netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(uint64(netSignOnState.IdsLength))
68 writer.TempAppendLine("\t\tPlayer Network IDs: %v", netSignOnState.PlayersNetworksIds) 68 demo.Writer.TempAppendLine("\t\tPlayer Network IDs: %v", netSignOnState.PlayersNetworksIds)
69 } 69 }
70 netSignOnState.MapNameLength = reader.TryReadUInt32() 70 netSignOnState.MapNameLength = reader.TryReadUInt32()
71 if netSignOnState.MapNameLength > 0 { 71 if netSignOnState.MapNameLength > 0 {
72 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength)) 72 netSignOnState.MapName = reader.TryReadStringLength(uint64(netSignOnState.MapNameLength))
73 writer.TempAppendLine("\t\tMap Name: %s", netSignOnState.MapName) 73 demo.Writer.TempAppendLine("\t\tMap Name: %s", netSignOnState.MapName)
74 } 74 }
75 return netSignOnState 75 return netSignOnState
76} 76}
diff --git a/pkg/messages/types/netSplitScreenUser.go b/pkg/messages/types/netSplitScreenUser.go
index 535552a..691c723 100644
--- a/pkg/messages/types/netSplitScreenUser.go
+++ b/pkg/messages/types/netSplitScreenUser.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type NetSplitScreenUser struct { 8type NetSplitScreenUser struct {
9 Slot bool 9 Slot bool `json:"slot"`
10} 10}
11 11
12func ParseNetSplitScreenUser(reader *bitreader.Reader) NetSplitScreenUser { 12func ParseNetSplitScreenUser(reader *bitreader.Reader, demo *types.Demo) NetSplitScreenUser {
13 netSplitScreenUser := NetSplitScreenUser{ 13 netSplitScreenUser := NetSplitScreenUser{
14 Slot: reader.TryReadBool(), 14 Slot: reader.TryReadBool(),
15 } 15 }
16 writer.TempAppendLine("\t\tSlot: %t", netSplitScreenUser.Slot) 16 demo.Writer.TempAppendLine("\t\tSlot: %t", netSplitScreenUser.Slot)
17 return netSplitScreenUser 17 return netSplitScreenUser
18} 18}
diff --git a/pkg/messages/types/netStringCmd.go b/pkg/messages/types/netStringCmd.go
index 13d5a13..fb6af2e 100644
--- a/pkg/messages/types/netStringCmd.go
+++ b/pkg/messages/types/netStringCmd.go
@@ -4,17 +4,17 @@ import (
4 "strings" 4 "strings"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type NetStringCmd struct { 10type NetStringCmd struct {
11 Command string 11 Command string `json:"command"`
12} 12}
13 13
14func ParseNetStringCmd(reader *bitreader.Reader) NetStringCmd { 14func ParseNetStringCmd(reader *bitreader.Reader, demo *types.Demo) NetStringCmd {
15 netStringCmd := NetStringCmd{ 15 netStringCmd := NetStringCmd{
16 Command: reader.TryReadString(), 16 Command: reader.TryReadString(),
17 } 17 }
18 writer.TempAppendLine("\t\tCommand: \"%s\"", strings.TrimSpace(netStringCmd.Command)) 18 demo.Writer.TempAppendLine("\t\tCommand: \"%s\"", strings.TrimSpace(netStringCmd.Command))
19 return netStringCmd 19 return netStringCmd
20} 20}
diff --git a/pkg/messages/types/netTick.go b/pkg/messages/types/netTick.go
index 9ef1ce2..0bcbc05 100644
--- a/pkg/messages/types/netTick.go
+++ b/pkg/messages/types/netTick.go
@@ -2,23 +2,23 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type NetTick struct { 8type NetTick struct {
9 Tick uint32 9 Tick uint32 `json:"tick"`
10 HostFrameTime float32 10 HostFrameTime float32 `json:"host_frame_time"`
11 HostFrameTimeStdDeviation float32 11 HostFrameTimeStdDeviation float32 `json:"host_frame_time_std_deviation"`
12} 12}
13 13
14func ParseNetTick(reader *bitreader.Reader) NetTick { 14func ParseNetTick(reader *bitreader.Reader, demo *types.Demo) NetTick {
15 netTick := NetTick{ 15 netTick := NetTick{
16 Tick: reader.TryReadUInt32(), 16 Tick: reader.TryReadUInt32(),
17 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5, 17 HostFrameTime: float32(reader.TryReadUInt16()) / 1e5,
18 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5, 18 HostFrameTimeStdDeviation: float32(reader.TryReadUInt16()) / 1e5,
19 } 19 }
20 writer.TempAppendLine("\t\tTick: %d", netTick.Tick) 20 demo.Writer.TempAppendLine("\t\tTick: %d", netTick.Tick)
21 writer.TempAppendLine("\t\tHost Frame Time: %f", netTick.HostFrameTime) 21 demo.Writer.TempAppendLine("\t\tHost Frame Time: %f", netTick.HostFrameTime)
22 writer.TempAppendLine("\t\tHost Frame Time Std Deviation: %f", netTick.HostFrameTimeStdDeviation) 22 demo.Writer.TempAppendLine("\t\tHost Frame Time Std Deviation: %f", netTick.HostFrameTimeStdDeviation)
23 return netTick 23 return netTick
24} 24}
diff --git a/pkg/messages/types/svcBspDecal.go b/pkg/messages/types/svcBspDecal.go
index fc5698f..9ef2458 100644
--- a/pkg/messages/types/svcBspDecal.go
+++ b/pkg/messages/types/svcBspDecal.go
@@ -2,23 +2,23 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcBspDecal struct { 8type SvcBspDecal struct {
9 Pos []vectorCoord 9 Pos []vectorCoord `json:"pos"`
10 DecalTextureIndex int16 10 DecalTextureIndex int16 `json:"decal_texture_index"`
11 EntityIndex uint16 11 EntityIndex uint16 `json:"entity_index"`
12 ModelIndex uint16 12 ModelIndex uint16 `json:"model_index"`
13 LowPriority bool 13 LowPriority bool `json:"low_priority"`
14} 14}
15 15
16type vectorCoord struct { 16type vectorCoord struct {
17 Value float32 17 Value float32 `json:"value"`
18 Valid bool 18 Valid bool `json:"valid"`
19} 19}
20 20
21func ParseSvcBspDecal(reader *bitreader.Reader) SvcBspDecal { 21func ParseSvcBspDecal(reader *bitreader.Reader, demo *types.Demo) SvcBspDecal {
22 svcBspDecal := SvcBspDecal{ 22 svcBspDecal := SvcBspDecal{
23 Pos: readVectorCoords(reader), 23 Pos: readVectorCoords(reader),
24 DecalTextureIndex: int16(reader.TryReadBits(9)), 24 DecalTextureIndex: int16(reader.TryReadBits(9)),
@@ -28,11 +28,11 @@ func ParseSvcBspDecal(reader *bitreader.Reader) SvcBspDecal {
28 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11)) 28 svcBspDecal.ModelIndex = uint16(reader.TryReadBits(11))
29 } 29 }
30 svcBspDecal.LowPriority = reader.TryReadBool() 30 svcBspDecal.LowPriority = reader.TryReadBool()
31 writer.TempAppendLine("\t\tPosition: %v", svcBspDecal.Pos) 31 demo.Writer.TempAppendLine("\t\tPosition: %v", svcBspDecal.Pos)
32 writer.TempAppendLine("\t\tDecal Texture Index: %d", svcBspDecal.DecalTextureIndex) 32 demo.Writer.TempAppendLine("\t\tDecal Texture Index: %d", svcBspDecal.DecalTextureIndex)
33 writer.TempAppendLine("\t\tEntity Index: %d", svcBspDecal.EntityIndex) 33 demo.Writer.TempAppendLine("\t\tEntity Index: %d", svcBspDecal.EntityIndex)
34 writer.TempAppendLine("\t\tModel Index: %d", svcBspDecal.ModelIndex) 34 demo.Writer.TempAppendLine("\t\tModel Index: %d", svcBspDecal.ModelIndex)
35 writer.TempAppendLine("\t\tLow Priority: %t", svcBspDecal.LowPriority) 35 demo.Writer.TempAppendLine("\t\tLow Priority: %t", svcBspDecal.LowPriority)
36 return svcBspDecal 36 return svcBspDecal
37} 37}
38 38
diff --git a/pkg/messages/types/svcClassInfo.go b/pkg/messages/types/svcClassInfo.go
index af382a8..995c61d 100644
--- a/pkg/messages/types/svcClassInfo.go
+++ b/pkg/messages/types/svcClassInfo.go
@@ -4,40 +4,40 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type SvcClassInfo struct { 10type SvcClassInfo struct {
11 ClassCount uint16 11 ClassCount uint16 `json:"class_count"`
12 CreateOnClient bool 12 CreateOnClient bool `json:"create_on_client"`
13 ServerClasses []serverClass 13 ServerClasses []serverClass `json:"server_classes"`
14} 14}
15 15
16type serverClass struct { 16type serverClass struct {
17 ClassId int16 17 ClassId int16 `json:"class_id"`
18 ClassName string 18 ClassName string `json:"class_name"`
19 DataTableName string 19 DataTableName string `json:"data_table_name"`
20} 20}
21 21
22func ParseSvcClassInfo(reader *bitreader.Reader) SvcClassInfo { 22func ParseSvcClassInfo(reader *bitreader.Reader, demo *types.Demo) SvcClassInfo {
23 svcClassInfo := SvcClassInfo{ 23 svcClassInfo := SvcClassInfo{
24 ClassCount: reader.TryReadUInt16(), 24 ClassCount: reader.TryReadUInt16(),
25 CreateOnClient: reader.TryReadBool(), 25 CreateOnClient: reader.TryReadBool(),
26 } 26 }
27 classes := []serverClass{} 27 classes := []serverClass{}
28 writer.TempAppendLine("\t\tCreate On Client: %t", svcClassInfo.CreateOnClient) 28 demo.Writer.TempAppendLine("\t\tCreate On Client: %t", svcClassInfo.CreateOnClient)
29 if !svcClassInfo.CreateOnClient { 29 if !svcClassInfo.CreateOnClient {
30 writer.TempAppendLine("\t\t%d Server Classes:", svcClassInfo.ClassCount) 30 demo.Writer.TempAppendLine("\t\t%d Server Classes:", svcClassInfo.ClassCount)
31 for count := 0; count < int(svcClassInfo.ClassCount); count++ { 31 for count := 0; count < int(svcClassInfo.ClassCount); count++ {
32 classes = append(classes, serverClass{ 32 classes = append(classes, serverClass{
33 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))), 33 ClassId: int16(reader.TryReadBits(uint64(math.Log2(float64(svcClassInfo.ClassCount)) + 1))),
34 ClassName: reader.TryReadString(), 34 ClassName: reader.TryReadString(),
35 DataTableName: reader.TryReadString(), 35 DataTableName: reader.TryReadString(),
36 }) 36 })
37 writer.TempAppendLine("\t\t\t[%d] %s (%s)", classes[len(classes)-1].ClassId, classes[len(classes)-1].ClassName, classes[len(classes)-1].DataTableName) 37 demo.Writer.TempAppendLine("\t\t\t[%d] %s (%s)", classes[len(classes)-1].ClassId, classes[len(classes)-1].ClassName, classes[len(classes)-1].DataTableName)
38 } 38 }
39 } else { 39 } else {
40 writer.TempAppendLine("\t\t%d Server Classes", svcClassInfo.ClassCount) 40 demo.Writer.TempAppendLine("\t\t%d Server Classes", svcClassInfo.ClassCount)
41 } 41 }
42 svcClassInfo.ServerClasses = classes 42 svcClassInfo.ServerClasses = classes
43 return svcClassInfo 43 return svcClassInfo
diff --git a/pkg/messages/types/svcCmdKeyValues.go b/pkg/messages/types/svcCmdKeyValues.go
index a5d8f62..6ab9c99 100644
--- a/pkg/messages/types/svcCmdKeyValues.go
+++ b/pkg/messages/types/svcCmdKeyValues.go
@@ -2,19 +2,19 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcCmdKeyValues struct { 8type SvcCmdKeyValues struct {
9 Length uint32 9 Length uint32 `json:"length"`
10 Data []byte 10 Data []byte `json:"data"`
11} 11}
12 12
13func ParseSvcCmdKeyValues(reader *bitreader.Reader) SvcCmdKeyValues { 13func ParseSvcCmdKeyValues(reader *bitreader.Reader, demo *types.Demo) SvcCmdKeyValues {
14 svcCmdKeyValues := SvcCmdKeyValues{ 14 svcCmdKeyValues := SvcCmdKeyValues{
15 Length: reader.TryReadUInt32(), 15 Length: reader.TryReadUInt32(),
16 } 16 }
17 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length)) 17 svcCmdKeyValues.Data = reader.TryReadBytesToSlice(uint64(svcCmdKeyValues.Length))
18 writer.TempAppendLine("\t\tData: %v", svcCmdKeyValues.Data) 18 demo.Writer.TempAppendLine("\t\tData: %v", svcCmdKeyValues.Data)
19 return svcCmdKeyValues 19 return svcCmdKeyValues
20} 20}
diff --git a/pkg/messages/types/svcCreateStringTable.go b/pkg/messages/types/svcCreateStringTable.go
index 0fc07cd..9a0c3e0 100644
--- a/pkg/messages/types/svcCreateStringTable.go
+++ b/pkg/messages/types/svcCreateStringTable.go
@@ -4,22 +4,22 @@ import (
4 "math" 4 "math"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type SvcCreateStringTable struct { 10type SvcCreateStringTable struct {
11 Name string 11 Name string `json:"name"`
12 MaxEntries int16 12 MaxEntries int16 `json:"max_entries"`
13 NumEntries int8 13 NumEntries int8 `json:"num_entries"`
14 Length int32 14 Length int32 `json:"length"`
15 UserDataFixedSize bool 15 UserDataFixedSize bool `json:"user_data_fixed_size"`
16 UserDataSize int16 16 UserDataSize int16 `json:"user_data_size"`
17 UserDataSizeBits int8 17 UserDataSizeBits int8 `json:"user_data_size_bits"`
18 Flags int8 18 Flags int8 `json:"flags"`
19 StringData int 19 StringData int `json:"string_data"`
20} 20}
21 21
22func ParseSvcCreateStringTable(reader *bitreader.Reader) SvcCreateStringTable { 22func ParseSvcCreateStringTable(reader *bitreader.Reader, demo *types.Demo) SvcCreateStringTable {
23 svcCreateStringTable := SvcCreateStringTable{ 23 svcCreateStringTable := SvcCreateStringTable{
24 Name: reader.TryReadString(), 24 Name: reader.TryReadString(),
25 MaxEntries: reader.TryReadSInt16(), 25 MaxEntries: reader.TryReadSInt16(),
@@ -32,13 +32,13 @@ func ParseSvcCreateStringTable(reader *bitreader.Reader) SvcCreateStringTable {
32 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4)) 32 svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4))
33 } 33 }
34 svcCreateStringTable.Flags = int8(reader.TryReadBits(2)) 34 svcCreateStringTable.Flags = int8(reader.TryReadBits(2))
35 writer.TempAppendLine("\t\tName: %s", svcCreateStringTable.Name) 35 demo.Writer.TempAppendLine("\t\tName: %s", svcCreateStringTable.Name)
36 writer.TempAppendLine("\t\tMax Enties: %d", svcCreateStringTable.MaxEntries) 36 demo.Writer.TempAppendLine("\t\tMax Enties: %d", svcCreateStringTable.MaxEntries)
37 writer.TempAppendLine("\t\tNumber Of Entiries: %d", svcCreateStringTable.NumEntries) 37 demo.Writer.TempAppendLine("\t\tNumber Of Entiries: %d", svcCreateStringTable.NumEntries)
38 writer.TempAppendLine("\t\tUser Data Fixed Size: %t", svcCreateStringTable.UserDataFixedSize) 38 demo.Writer.TempAppendLine("\t\tUser Data Fixed Size: %t", svcCreateStringTable.UserDataFixedSize)
39 writer.TempAppendLine("\t\tUser Data Size: %d", svcCreateStringTable.UserDataSize) 39 demo.Writer.TempAppendLine("\t\tUser Data Size: %d", svcCreateStringTable.UserDataSize)
40 writer.TempAppendLine("\t\tUser Data Size In Bits: %d", svcCreateStringTable.UserDataSizeBits) 40 demo.Writer.TempAppendLine("\t\tUser Data Size In Bits: %d", svcCreateStringTable.UserDataSizeBits)
41 writer.TempAppendLine("\t\tFlags: %d", svcCreateStringTable.Flags) 41 demo.Writer.TempAppendLine("\t\tFlags: %d", svcCreateStringTable.Flags)
42 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing 42 reader.SkipBits(uint64(svcCreateStringTable.Length)) // TODO: StringTable parsing
43 return svcCreateStringTable 43 return svcCreateStringTable
44} 44}
diff --git a/pkg/messages/types/svcCrosshairAngle.go b/pkg/messages/types/svcCrosshairAngle.go
index dd57f79..31da616 100644
--- a/pkg/messages/types/svcCrosshairAngle.go
+++ b/pkg/messages/types/svcCrosshairAngle.go
@@ -2,20 +2,20 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcCrosshairAngle struct { 8type SvcCrosshairAngle struct {
9 Angle crosshairAngles 9 Angle crosshairAngles `json:"angle"`
10} 10}
11 11
12type crosshairAngles struct { 12type crosshairAngles struct {
13 X float32 13 X float32 `json:"x"`
14 Y float32 14 Y float32 `json:"y"`
15 Z float32 15 Z float32 `json:"z"`
16} 16}
17 17
18func ParseSvcCrosshairAngle(reader *bitreader.Reader) SvcCrosshairAngle { 18func ParseSvcCrosshairAngle(reader *bitreader.Reader, demo *types.Demo) SvcCrosshairAngle {
19 svcCrosshairAngle := SvcCrosshairAngle{ 19 svcCrosshairAngle := SvcCrosshairAngle{
20 Angle: crosshairAngles{ 20 Angle: crosshairAngles{
21 X: float32(reader.TryReadBits(16)), 21 X: float32(reader.TryReadBits(16)),
@@ -23,8 +23,8 @@ func ParseSvcCrosshairAngle(reader *bitreader.Reader) SvcCrosshairAngle {
23 Z: float32(reader.TryReadBits(16)), 23 Z: float32(reader.TryReadBits(16)),
24 }, 24 },
25 } 25 }
26 writer.TempAppendLine("\t\tX: %f", svcCrosshairAngle.Angle.X) 26 demo.Writer.TempAppendLine("\t\tX: %f", svcCrosshairAngle.Angle.X)
27 writer.TempAppendLine("\t\tY: %f", svcCrosshairAngle.Angle.Y) 27 demo.Writer.TempAppendLine("\t\tY: %f", svcCrosshairAngle.Angle.Y)
28 writer.TempAppendLine("\t\tZ: %f", svcCrosshairAngle.Angle.Z) 28 demo.Writer.TempAppendLine("\t\tZ: %f", svcCrosshairAngle.Angle.Z)
29 return svcCrosshairAngle 29 return svcCrosshairAngle
30} 30}
diff --git a/pkg/messages/types/svcEntityMessage.go b/pkg/messages/types/svcEntityMessage.go
index b955da5..87d7e1b 100644
--- a/pkg/messages/types/svcEntityMessage.go
+++ b/pkg/messages/types/svcEntityMessage.go
@@ -2,25 +2,25 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcEntityMessage struct { 8type SvcEntityMessage struct {
9 EntityIndex uint16 9 EntityIndex uint16 `json:"entity_index"`
10 ClassId uint16 10 ClassId uint16 `json:"class_id"`
11 Length uint16 11 Length uint16 `json:"length"`
12 Data []byte 12 Data []byte `json:"data"`
13} 13}
14 14
15func ParseSvcEntityMessage(reader *bitreader.Reader) SvcEntityMessage { 15func ParseSvcEntityMessage(reader *bitreader.Reader, demo *types.Demo) SvcEntityMessage {
16 svcEntityMessage := SvcEntityMessage{ 16 svcEntityMessage := SvcEntityMessage{
17 EntityIndex: uint16(reader.TryReadBits(11)), 17 EntityIndex: uint16(reader.TryReadBits(11)),
18 ClassId: uint16(reader.TryReadBits(9)), 18 ClassId: uint16(reader.TryReadBits(9)),
19 Length: uint16(reader.TryReadBits(11)), 19 Length: uint16(reader.TryReadBits(11)),
20 } 20 }
21 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length)) 21 svcEntityMessage.Data = reader.TryReadBitsToSlice(uint64(svcEntityMessage.Length))
22 writer.TempAppendLine("\t\tEntity Index: %d", svcEntityMessage.EntityIndex) 22 demo.Writer.TempAppendLine("\t\tEntity Index: %d", svcEntityMessage.EntityIndex)
23 writer.TempAppendLine("\t\tClass ID: %d", svcEntityMessage.ClassId) 23 demo.Writer.TempAppendLine("\t\tClass ID: %d", svcEntityMessage.ClassId)
24 writer.TempAppendLine("\t\tData: %v", svcEntityMessage.Data) 24 demo.Writer.TempAppendLine("\t\tData: %v", svcEntityMessage.Data)
25 return svcEntityMessage 25 return svcEntityMessage
26} 26}
diff --git a/pkg/messages/types/svcFixAngle.go b/pkg/messages/types/svcFixAngle.go
index d5e7b0f..924bba2 100644
--- a/pkg/messages/types/svcFixAngle.go
+++ b/pkg/messages/types/svcFixAngle.go
@@ -2,21 +2,21 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcFixAngle struct { 8type SvcFixAngle struct {
9 Relative bool 9 Relative bool `json:"relative"`
10 Angle fixAngles 10 Angle fixAngles `json:"angle"`
11} 11}
12 12
13type fixAngles struct { 13type fixAngles struct {
14 X float32 14 X float32 `json:"x"`
15 Y float32 15 Y float32 `json:"y"`
16 Z float32 16 Z float32 `json:"z"`
17} 17}
18 18
19func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle { 19func ParseSvcFixAngle(reader *bitreader.Reader, demo *types.Demo) SvcFixAngle {
20 svcFixAngle := SvcFixAngle{ 20 svcFixAngle := SvcFixAngle{
21 Relative: reader.TryReadBool(), 21 Relative: reader.TryReadBool(),
22 Angle: fixAngles{ 22 Angle: fixAngles{
@@ -25,9 +25,9 @@ func ParseSvcFixAngle(reader *bitreader.Reader) SvcFixAngle {
25 Z: float32(reader.TryReadBits(16)), 25 Z: float32(reader.TryReadBits(16)),
26 }, 26 },
27 } 27 }
28 writer.TempAppendLine("\t\tRelative: %t", svcFixAngle.Relative) 28 demo.Writer.TempAppendLine("\t\tRelative: %t", svcFixAngle.Relative)
29 writer.TempAppendLine("\t\tX: %f", svcFixAngle.Angle.X) 29 demo.Writer.TempAppendLine("\t\tX: %f", svcFixAngle.Angle.X)
30 writer.TempAppendLine("\t\tY: %f", svcFixAngle.Angle.Y) 30 demo.Writer.TempAppendLine("\t\tY: %f", svcFixAngle.Angle.Y)
31 writer.TempAppendLine("\t\tZ: %f", svcFixAngle.Angle.Z) 31 demo.Writer.TempAppendLine("\t\tZ: %f", svcFixAngle.Angle.Z)
32 return svcFixAngle 32 return svcFixAngle
33} 33}
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go
index b325472..cb1e91d 100644
--- a/pkg/messages/types/svcGameEvent.go
+++ b/pkg/messages/types/svcGameEvent.go
@@ -2,56 +2,56 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcGameEvent struct { 8type SvcGameEvent struct {
9 Length uint16 9 Length uint16 `json:"length"`
10 EventID uint32 10 EventID uint32 `json:"event_id"`
11 EventDescription GameEventDescriptor 11 EventDescription types.GameEventDescriptor `json:"event_description"`
12 EventDescriptors []EventDescriptorKey 12 EventDescriptors []EventDescriptorKey `json:"event_descriptors"`
13} 13}
14 14
15type EventDescriptorKey struct { 15type EventDescriptorKey struct {
16 Name string 16 Name string `json:"name"`
17 Descriptor any 17 Descriptor any `json:"descriptor"`
18} 18}
19 19
20func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent { 20func ParseSvcGameEvent(reader *bitreader.Reader, demo *types.Demo) SvcGameEvent {
21 svcGameEvent := SvcGameEvent{ 21 svcGameEvent := SvcGameEvent{
22 Length: uint16(reader.TryReadBits(11)), 22 Length: uint16(reader.TryReadBits(11)),
23 } 23 }
24 gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true) 24 gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true)
25 svcGameEvent.parseGameEvent(gameEventReader) 25 svcGameEvent.parseGameEvent(gameEventReader, demo)
26 return svcGameEvent 26 return svcGameEvent
27} 27}
28 28
29func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader) { 29func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader, demo *types.Demo) {
30 svcGameEvent.EventID = uint32(reader.TryReadBits(9)) 30 svcGameEvent.EventID = uint32(reader.TryReadBits(9))
31 svcGameEvent.EventDescription = GameEventList.GameEventDescriptor[svcGameEvent.EventID] 31 svcGameEvent.EventDescription = demo.GameEventList.GameEventDescriptor[svcGameEvent.EventID]
32 writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID) 32 demo.Writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID)
33 for _, descriptor := range svcGameEvent.EventDescription.Keys { 33 for _, descriptor := range svcGameEvent.EventDescription.Keys {
34 var value any 34 var value any
35 switch descriptor.Type { 35 switch descriptor.Type {
36 case EventDescriptorString: 36 case types.EventDescriptorString:
37 value = reader.TryReadString() 37 value = reader.TryReadString()
38 case EventDescriptorFloat: 38 case types.EventDescriptorFloat:
39 value = reader.TryReadFloat32() 39 value = reader.TryReadFloat32()
40 case EventDescriptorInt32: 40 case types.EventDescriptorInt32:
41 value = reader.TryReadSInt32() 41 value = reader.TryReadSInt32()
42 case EventDescriptorInt16: 42 case types.EventDescriptorInt16:
43 value = reader.TryReadSInt16() 43 value = reader.TryReadSInt16()
44 case EventDescriptorInt8: 44 case types.EventDescriptorInt8:
45 value = reader.TryReadUInt8() 45 value = reader.TryReadUInt8()
46 case EventDescriptorBool: 46 case types.EventDescriptorBool:
47 value = reader.TryReadBool() 47 value = reader.TryReadBool()
48 case EventDescriptorUInt64: 48 case types.EventDescriptorUInt64:
49 value = reader.TryReadUInt64() 49 value = reader.TryReadUInt64()
50 } 50 }
51 svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{ 51 svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{
52 Name: descriptor.Name, 52 Name: descriptor.Name,
53 Descriptor: value, 53 Descriptor: value,
54 }) 54 })
55 writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value) 55 demo.Writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value)
56 } 56 }
57} 57}
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go
index 9a194fd..dafe9b7 100644
--- a/pkg/messages/types/svcGameEventList.go
+++ b/pkg/messages/types/svcGameEventList.go
@@ -1,95 +1,18 @@
1package messages 1package messages
2 2
3import ( 3import (
4 "fmt"
5
6 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
8) 6)
9 7
10var GameEventList *SvcGameEventList 8func ParseSvcGameEventList(reader *bitreader.Reader, demo *types.Demo) types.SvcGameEventList {
11 9 svcGameEventList := types.SvcGameEventList{
12type SvcGameEventList struct {
13 Events int16
14 Length int32
15 GameEventDescriptor []GameEventDescriptor
16}
17
18type GameEventDescriptor struct {
19 EventID uint32
20 Name string
21 Keys []GameEventDescriptorKey
22}
23
24type GameEventDescriptorKey struct {
25 Name string
26 Type EventDescriptor
27}
28
29type EventDescriptor uint8
30
31func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList {
32 svcGameEventList := SvcGameEventList{
33 Events: int16(reader.TryReadBits(9)), 10 Events: int16(reader.TryReadBits(9)),
34 Length: int32(reader.TryReadBits(20)), 11 Length: int32(reader.TryReadBits(20)),
35 } 12 }
36 gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) 13 gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true)
37 writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) 14 demo.Writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events)
38 svcGameEventList.parseGameEventDescriptor(gameEventListReader) 15 svcGameEventList.ParseGameEventDescriptor(gameEventListReader, demo)
39 GameEventList = &svcGameEventList 16 demo.GameEventList = &svcGameEventList
40 return svcGameEventList 17 return svcGameEventList
41} 18}
42
43func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) {
44 svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events)
45 for event := 0; event < int(svcGameEventList.Events); event++ {
46 svcGameEventList.GameEventDescriptor[event] = GameEventDescriptor{
47 EventID: uint32(reader.TryReadBits(9)),
48 Name: reader.TryReadString(),
49 }
50 writer.TempAppendLine("\t\t\t%d: %s", svcGameEventList.GameEventDescriptor[event].EventID, svcGameEventList.GameEventDescriptor[event].Name)
51 for {
52 descriptorType := reader.TryReadBits(3)
53 if descriptorType == 0 {
54 break
55 }
56 KeyName := reader.TryReadString()
57 svcGameEventList.GameEventDescriptor[event].Keys = append(svcGameEventList.GameEventDescriptor[event].Keys, GameEventDescriptorKey{
58 Name: KeyName,
59 Type: EventDescriptor(descriptorType),
60 })
61 }
62 writer.TempAppendLine("\t\t\t\tKeys: %v", svcGameEventList.GameEventDescriptor[event].Keys)
63 }
64}
65
66const (
67 EventDescriptorString EventDescriptor = iota + 1
68 EventDescriptorFloat
69 EventDescriptorInt32
70 EventDescriptorInt16
71 EventDescriptorInt8
72 EventDescriptorBool
73 EventDescriptorUInt64
74)
75
76func (eventDescriptor EventDescriptor) String() string {
77 switch eventDescriptor {
78 case EventDescriptorString:
79 return "String"
80 case EventDescriptorFloat:
81 return "Float"
82 case EventDescriptorInt32:
83 return "Int32"
84 case EventDescriptorInt16:
85 return "Int16"
86 case EventDescriptorInt8:
87 return "Int8"
88 case EventDescriptorBool:
89 return "Bool"
90 case EventDescriptorUInt64:
91 return "UInt64"
92 default:
93 return fmt.Sprintf("%d", eventDescriptor)
94 }
95}
diff --git a/pkg/messages/types/svcGetCvarValue.go b/pkg/messages/types/svcGetCvarValue.go
index 5deb9ef..1c3e54c 100644
--- a/pkg/messages/types/svcGetCvarValue.go
+++ b/pkg/messages/types/svcGetCvarValue.go
@@ -2,20 +2,20 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcGetCvarValue struct { 8type SvcGetCvarValue struct {
9 Cookie int32 9 Cookie int32 `json:"cookie"`
10 CvarName string 10 CvarName string `json:"cvar_name"`
11} 11}
12 12
13func ParseSvcGetCvarValue(reader *bitreader.Reader) SvcGetCvarValue { 13func ParseSvcGetCvarValue(reader *bitreader.Reader, demo *types.Demo) SvcGetCvarValue {
14 svcGetCvarValue := SvcGetCvarValue{ 14 svcGetCvarValue := SvcGetCvarValue{
15 Cookie: reader.TryReadSInt32(), 15 Cookie: reader.TryReadSInt32(),
16 CvarName: reader.TryReadString(), 16 CvarName: reader.TryReadString(),
17 } 17 }
18 writer.TempAppendLine("\t\tCookie: %d", svcGetCvarValue.Cookie) 18 demo.Writer.TempAppendLine("\t\tCookie: %d", svcGetCvarValue.Cookie)
19 writer.TempAppendLine("\t\tCvar: \"%s\"", svcGetCvarValue.CvarName) 19 demo.Writer.TempAppendLine("\t\tCvar: \"%s\"", svcGetCvarValue.CvarName)
20 return svcGetCvarValue 20 return svcGetCvarValue
21} 21}
diff --git a/pkg/messages/types/svcMenu.go b/pkg/messages/types/svcMenu.go
index ffbb86b..b1da594 100644
--- a/pkg/messages/types/svcMenu.go
+++ b/pkg/messages/types/svcMenu.go
@@ -2,22 +2,22 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcMenu struct { 8type SvcMenu struct {
9 Type uint16 9 Type uint16 `json:"type"`
10 Length uint32 10 Length uint32 `json:"length"`
11 Data []byte 11 Data []byte `json:"data"`
12} 12}
13 13
14func ParseSvcMenu(reader *bitreader.Reader) SvcMenu { 14func ParseSvcMenu(reader *bitreader.Reader, demo *types.Demo) SvcMenu {
15 svcMenu := SvcMenu{ 15 svcMenu := SvcMenu{
16 Type: reader.TryReadUInt16(), 16 Type: reader.TryReadUInt16(),
17 Length: reader.TryReadUInt32(), 17 Length: reader.TryReadUInt32(),
18 } 18 }
19 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length)) 19 svcMenu.Data = reader.TryReadBitsToSlice(uint64(svcMenu.Length))
20 writer.TempAppendLine("\t\tType: %d", svcMenu.Type) 20 demo.Writer.TempAppendLine("\t\tType: %d", svcMenu.Type)
21 writer.TempAppendLine("\t\tData: %v", svcMenu.Data) 21 demo.Writer.TempAppendLine("\t\tData: %v", svcMenu.Data)
22 return svcMenu 22 return svcMenu
23} 23}
diff --git a/pkg/messages/types/svcPacketEntities.go b/pkg/messages/types/svcPacketEntities.go
index 188f827..abef83d 100644
--- a/pkg/messages/types/svcPacketEntities.go
+++ b/pkg/messages/types/svcPacketEntities.go
@@ -2,21 +2,21 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcPacketEntities struct { 8type SvcPacketEntities struct {
9 MaxEntries uint16 9 MaxEntries uint16 `json:"max_entries"`
10 IsDelta bool 10 IsDelta bool `json:"is_delta"`
11 DeltaFrom int32 11 DeltaFrom int32 `json:"delta_from"`
12 BaseLine bool 12 BaseLine bool `json:"base_line"`
13 UpdatedEntries uint16 13 UpdatedEntries uint16 `json:"updated_entries"`
14 Length uint32 14 Length uint32 `json:"length"`
15 UpdatedBaseline bool 15 UpdatedBaseline bool `json:"updated_baseline"`
16 Data []byte 16 Data []byte `json:"data"`
17} 17}
18 18
19func ParseSvcPacketEntities(reader *bitreader.Reader) SvcPacketEntities { 19func ParseSvcPacketEntities(reader *bitreader.Reader, demo *types.Demo) SvcPacketEntities {
20 svcPacketEntities := SvcPacketEntities{ 20 svcPacketEntities := SvcPacketEntities{
21 MaxEntries: uint16(reader.TryReadBits(11)), 21 MaxEntries: uint16(reader.TryReadBits(11)),
22 IsDelta: reader.TryReadBool(), 22 IsDelta: reader.TryReadBool(),
@@ -31,12 +31,12 @@ func ParseSvcPacketEntities(reader *bitreader.Reader) SvcPacketEntities {
31 svcPacketEntities.Length = uint32(reader.TryReadBits(20)) 31 svcPacketEntities.Length = uint32(reader.TryReadBits(20))
32 svcPacketEntities.UpdatedBaseline = reader.TryReadBool() 32 svcPacketEntities.UpdatedBaseline = reader.TryReadBool()
33 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length)) 33 svcPacketEntities.Data = reader.TryReadBitsToSlice(uint64(svcPacketEntities.Length))
34 writer.TempAppendLine("\t\tMax Entries: %d", svcPacketEntities.MaxEntries) 34 demo.Writer.TempAppendLine("\t\tMax Entries: %d", svcPacketEntities.MaxEntries)
35 writer.TempAppendLine("\t\tIs Delta: %t", svcPacketEntities.IsDelta) 35 demo.Writer.TempAppendLine("\t\tIs Delta: %t", svcPacketEntities.IsDelta)
36 writer.TempAppendLine("\t\tDelta From: %d", svcPacketEntities.DeltaFrom) 36 demo.Writer.TempAppendLine("\t\tDelta From: %d", svcPacketEntities.DeltaFrom)
37 writer.TempAppendLine("\t\tBaseline: %t", svcPacketEntities.BaseLine) 37 demo.Writer.TempAppendLine("\t\tBaseline: %t", svcPacketEntities.BaseLine)
38 writer.TempAppendLine("\t\tUpdated Baseline: %t", svcPacketEntities.UpdatedBaseline) 38 demo.Writer.TempAppendLine("\t\tUpdated Baseline: %t", svcPacketEntities.UpdatedBaseline)
39 writer.TempAppendLine("\t\t%d Updated Entries:", svcPacketEntities.UpdatedEntries) 39 demo.Writer.TempAppendLine("\t\t%d Updated Entries:", svcPacketEntities.UpdatedEntries)
40 writer.TempAppendLine("\t\tData: %v", svcPacketEntities.Data) 40 demo.Writer.TempAppendLine("\t\tData: %v", svcPacketEntities.Data)
41 return svcPacketEntities 41 return svcPacketEntities
42} 42}
diff --git a/pkg/messages/types/svcPaintmapData.go b/pkg/messages/types/svcPaintmapData.go
index 10f8031..2455f83 100644
--- a/pkg/messages/types/svcPaintmapData.go
+++ b/pkg/messages/types/svcPaintmapData.go
@@ -2,19 +2,19 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcPaintmapData struct { 8type SvcPaintmapData struct {
9 Length uint32 9 Length uint32 `json:"length"`
10 Data []byte 10 Data []byte `json:"data"`
11} 11}
12 12
13func ParseSvcPaintmapData(reader *bitreader.Reader) SvcPaintmapData { 13func ParseSvcPaintmapData(reader *bitreader.Reader, demo *types.Demo) SvcPaintmapData {
14 svcPaintmapData := SvcPaintmapData{ 14 svcPaintmapData := SvcPaintmapData{
15 Length: reader.TryReadUInt32(), 15 Length: reader.TryReadUInt32(),
16 } 16 }
17 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length)) 17 svcPaintmapData.Data = reader.TryReadBitsToSlice(uint64(svcPaintmapData.Length))
18 writer.TempAppendLine("\t\tData: %v", svcPaintmapData.Data) 18 demo.Writer.TempAppendLine("\t\tData: %v", svcPaintmapData.Data)
19 return svcPaintmapData 19 return svcPaintmapData
20} 20}
diff --git a/pkg/messages/types/svcPrefetch.go b/pkg/messages/types/svcPrefetch.go
index 6aa39aa..55b6713 100644
--- a/pkg/messages/types/svcPrefetch.go
+++ b/pkg/messages/types/svcPrefetch.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcPrefetch struct { 8type SvcPrefetch struct {
9 SoundIndex int16 9 SoundIndex int16 `json:"sound_index"`
10} 10}
11 11
12func ParseSvcPrefetch(reader *bitreader.Reader) SvcPrefetch { 12func ParseSvcPrefetch(reader *bitreader.Reader, demo *types.Demo) SvcPrefetch {
13 svcPrefetch := SvcPrefetch{ 13 svcPrefetch := SvcPrefetch{
14 SoundIndex: int16(reader.TryReadBits(13)), 14 SoundIndex: int16(reader.TryReadBits(13)),
15 } 15 }
16 writer.TempAppendLine("\t\tSound Index: %d", svcPrefetch.SoundIndex) 16 demo.Writer.TempAppendLine("\t\tSound Index: %d", svcPrefetch.SoundIndex)
17 return svcPrefetch 17 return svcPrefetch
18} 18}
diff --git a/pkg/messages/types/svcPrint.go b/pkg/messages/types/svcPrint.go
index 56f0d08..0db7ffd 100644
--- a/pkg/messages/types/svcPrint.go
+++ b/pkg/messages/types/svcPrint.go
@@ -4,18 +4,18 @@ import (
4 "strings" 4 "strings"
5 5
6 "github.com/pektezol/bitreader" 6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/sdp.go/pkg/writer" 7 "github.com/pektezol/sdp.go/pkg/types"
8) 8)
9 9
10type SvcPrint struct { 10type SvcPrint struct {
11 Message string 11 Message string `json:"message"`
12} 12}
13 13
14func ParseSvcPrint(reader *bitreader.Reader) SvcPrint { 14func ParseSvcPrint(reader *bitreader.Reader, demo *types.Demo) SvcPrint {
15 svcPrint := SvcPrint{ 15 svcPrint := SvcPrint{
16 Message: reader.TryReadString(), 16 Message: reader.TryReadString(),
17 } 17 }
18 // common psycopath behaviour 18 // common psycopath behaviour
19 writer.TempAppendLine("\t\t%s", strings.Replace(strings.ReplaceAll(strings.ReplaceAll(svcPrint.Message, "\n", "\n\t\t"), "\n\t\t\n\t\t", ""), "\n\t\t", "", 1)) 19 demo.Writer.TempAppendLine("\t\t%s", strings.Replace(strings.ReplaceAll(strings.ReplaceAll(svcPrint.Message, "\n", "\n\t\t"), "\n\t\t\n\t\t", ""), "\n\t\t", "", 1))
20 return svcPrint 20 return svcPrint
21} 21}
diff --git a/pkg/messages/types/svcSendTable.go b/pkg/messages/types/svcSendTable.go
index d0def36..fc98eb6 100644
--- a/pkg/messages/types/svcSendTable.go
+++ b/pkg/messages/types/svcSendTable.go
@@ -2,23 +2,23 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcSendTable struct { 8type SvcSendTable struct {
9 NeedsDecoder bool 9 NeedsDecoder bool `json:"needs_decoder"`
10 Length uint8 10 Length uint8 `json:"length"`
11 Props uint32 11 Props uint32 `json:"props"`
12} 12}
13 13
14func ParseSvcSendTable(reader *bitreader.Reader) SvcSendTable { 14func ParseSvcSendTable(reader *bitreader.Reader, demo *types.Demo) SvcSendTable {
15 svcSendTable := SvcSendTable{ 15 svcSendTable := SvcSendTable{
16 NeedsDecoder: reader.TryReadBool(), 16 NeedsDecoder: reader.TryReadBool(),
17 Length: reader.TryReadUInt8(), 17 Length: reader.TryReadUInt8(),
18 } 18 }
19 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length))) 19 svcSendTable.Props = uint32(reader.TryReadBits(uint64(svcSendTable.Length)))
20 writer.TempAppendLine("\t\tNeeds Decoder: %t", svcSendTable.NeedsDecoder) 20 demo.Writer.TempAppendLine("\t\tNeeds Decoder: %t", svcSendTable.NeedsDecoder)
21 writer.TempAppendLine("\t\tLength: %d", svcSendTable.Length) 21 demo.Writer.TempAppendLine("\t\tLength: %d", svcSendTable.Length)
22 writer.TempAppendLine("\t\tProps: %d", svcSendTable.Props) 22 demo.Writer.TempAppendLine("\t\tProps: %d", svcSendTable.Props)
23 return svcSendTable 23 return svcSendTable
24} 24}
diff --git a/pkg/messages/types/svcServerInfo.go b/pkg/messages/types/svcServerInfo.go
index 9e3113c..2aabccd 100644
--- a/pkg/messages/types/svcServerInfo.go
+++ b/pkg/messages/types/svcServerInfo.go
@@ -2,29 +2,29 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcServerInfo struct { 8type SvcServerInfo struct {
9 Protocol uint16 9 Protocol uint16 `json:"protocol"`
10 ServerCount uint32 10 ServerCount uint32 `json:"server_count"`
11 IsHltv bool 11 IsHltv bool `json:"is_hltv"`
12 IsDedicated bool 12 IsDedicated bool `json:"is_dedicated"`
13 ClientCrc int32 13 ClientCrc int32 `json:"client_crc"`
14 StringTableCrc uint32 14 StringTableCrc uint32 `json:"string_table_crc"`
15 MaxServerClasses uint16 15 MaxServerClasses uint16 `json:"max_server_classes"`
16 MapCrc uint32 16 MapCrc uint32 `json:"map_crc"`
17 PlayerCount uint8 17 PlayerCount uint8 `json:"player_count"`
18 MaxClients uint8 18 MaxClients uint8 `json:"max_clients"`
19 TickInterval float32 19 TickInterval float32 `json:"tick_interval"`
20 Platform string 20 Platform string `json:"platform"`
21 GameDir string 21 GameDir string `json:"game_dir"`
22 MapName string 22 MapName string `json:"map_name"`
23 SkyName string 23 SkyName string `json:"sky_name"`
24 HostName string 24 HostName string `json:"host_name"`
25} 25}
26 26
27func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo { 27func ParseSvcServerInfo(reader *bitreader.Reader, demo *types.Demo) SvcServerInfo {
28 svcServerInfo := SvcServerInfo{ 28 svcServerInfo := SvcServerInfo{
29 Protocol: reader.TryReadUInt16(), 29 Protocol: reader.TryReadUInt16(),
30 ServerCount: reader.TryReadUInt32(), 30 ServerCount: reader.TryReadUInt32(),
@@ -43,21 +43,21 @@ func ParseSvcServerInfo(reader *bitreader.Reader) SvcServerInfo {
43 SkyName: reader.TryReadString(), 43 SkyName: reader.TryReadString(),
44 HostName: reader.TryReadString(), 44 HostName: reader.TryReadString(),
45 } 45 }
46 writer.TempAppendLine("\t\tNetwork Protocol: %d", svcServerInfo.Protocol) 46 demo.Writer.TempAppendLine("\t\tNetwork Protocol: %d", svcServerInfo.Protocol)
47 writer.TempAppendLine("\t\tServer Count: %d", svcServerInfo.ServerCount) 47 demo.Writer.TempAppendLine("\t\tServer Count: %d", svcServerInfo.ServerCount)
48 writer.TempAppendLine("\t\tIs Hltv: %t", svcServerInfo.IsHltv) 48 demo.Writer.TempAppendLine("\t\tIs Hltv: %t", svcServerInfo.IsHltv)
49 writer.TempAppendLine("\t\tIs Dedicated: %t", svcServerInfo.IsDedicated) 49 demo.Writer.TempAppendLine("\t\tIs Dedicated: %t", svcServerInfo.IsDedicated)
50 writer.TempAppendLine("\t\tServer Client CRC: %d", svcServerInfo.ClientCrc) 50 demo.Writer.TempAppendLine("\t\tServer Client CRC: %d", svcServerInfo.ClientCrc)
51 writer.TempAppendLine("\t\tString Table CRC: %d", svcServerInfo.StringTableCrc) 51 demo.Writer.TempAppendLine("\t\tString Table CRC: %d", svcServerInfo.StringTableCrc)
52 writer.TempAppendLine("\t\tMax Server Classes: %d", svcServerInfo.MaxServerClasses) 52 demo.Writer.TempAppendLine("\t\tMax Server Classes: %d", svcServerInfo.MaxServerClasses)
53 writer.TempAppendLine("\t\tServer Map CRC: %d", svcServerInfo.MapCrc) 53 demo.Writer.TempAppendLine("\t\tServer Map CRC: %d", svcServerInfo.MapCrc)
54 writer.TempAppendLine("\t\tCurrent Player Count: %d", svcServerInfo.PlayerCount) 54 demo.Writer.TempAppendLine("\t\tCurrent Player Count: %d", svcServerInfo.PlayerCount)
55 writer.TempAppendLine("\t\tMax Player Count: %d", svcServerInfo.MaxClients) 55 demo.Writer.TempAppendLine("\t\tMax Player Count: %d", svcServerInfo.MaxClients)
56 writer.TempAppendLine("\t\tInterval Per Tick: %f", svcServerInfo.TickInterval) 56 demo.Writer.TempAppendLine("\t\tInterval Per Tick: %f", svcServerInfo.TickInterval)
57 writer.TempAppendLine("\t\tPlatform: %s", svcServerInfo.Platform) 57 demo.Writer.TempAppendLine("\t\tPlatform: %s", svcServerInfo.Platform)
58 writer.TempAppendLine("\t\tGame Directory: %s", svcServerInfo.GameDir) 58 demo.Writer.TempAppendLine("\t\tGame Directory: %s", svcServerInfo.GameDir)
59 writer.TempAppendLine("\t\tMap Name: %s", svcServerInfo.MapName) 59 demo.Writer.TempAppendLine("\t\tMap Name: %s", svcServerInfo.MapName)
60 writer.TempAppendLine("\t\tSky Name: %s", svcServerInfo.SkyName) 60 demo.Writer.TempAppendLine("\t\tSky Name: %s", svcServerInfo.SkyName)
61 writer.TempAppendLine("\t\tHost Name: %s", svcServerInfo.HostName) 61 demo.Writer.TempAppendLine("\t\tHost Name: %s", svcServerInfo.HostName)
62 return svcServerInfo 62 return svcServerInfo
63} 63}
diff --git a/pkg/messages/types/svcSetPause.go b/pkg/messages/types/svcSetPause.go
index b69779f..ad9f2d5 100644
--- a/pkg/messages/types/svcSetPause.go
+++ b/pkg/messages/types/svcSetPause.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcSetPause struct { 8type SvcSetPause struct {
9 Paused bool 9 Paused bool `json:"paused"`
10} 10}
11 11
12func ParseSvcSetPause(reader *bitreader.Reader) SvcSetPause { 12func ParseSvcSetPause(reader *bitreader.Reader, demo *types.Demo) SvcSetPause {
13 svcSetPause := SvcSetPause{ 13 svcSetPause := SvcSetPause{
14 Paused: reader.TryReadBool(), 14 Paused: reader.TryReadBool(),
15 } 15 }
16 writer.TempAppendLine("\t\tPaused: %t", svcSetPause.Paused) 16 demo.Writer.TempAppendLine("\t\tPaused: %t", svcSetPause.Paused)
17 return svcSetPause 17 return svcSetPause
18} 18}
diff --git a/pkg/messages/types/svcSetView.go b/pkg/messages/types/svcSetView.go
index a392d36..55b2065 100644
--- a/pkg/messages/types/svcSetView.go
+++ b/pkg/messages/types/svcSetView.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcSetView struct { 8type SvcSetView struct {
9 EntityIndex uint16 9 EntityIndex uint16 `json:"entity_index"`
10} 10}
11 11
12func ParseSvcSetView(reader *bitreader.Reader) SvcSetView { 12func ParseSvcSetView(reader *bitreader.Reader, demo *types.Demo) SvcSetView {
13 svcSetView := SvcSetView{ 13 svcSetView := SvcSetView{
14 EntityIndex: uint16(reader.TryReadBits(11)), 14 EntityIndex: uint16(reader.TryReadBits(11)),
15 } 15 }
16 writer.TempAppendLine("\t\tEntity Index: %d", svcSetView.EntityIndex) 16 demo.Writer.TempAppendLine("\t\tEntity Index: %d", svcSetView.EntityIndex)
17 return svcSetView 17 return svcSetView
18} 18}
diff --git a/pkg/messages/types/svcSounds.go b/pkg/messages/types/svcSounds.go
index 5391af1..cc155e5 100644
--- a/pkg/messages/types/svcSounds.go
+++ b/pkg/messages/types/svcSounds.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcSounds struct { 8type SvcSounds struct {
9 ReliableSound bool 9 ReliableSound bool `json:"reliable_sound"`
10 SoundCount uint8 10 SoundCount uint8 `json:"sound_count"`
11 Length uint16 11 Length uint16 `json:"length"`
12 Data []byte 12 Data []byte `json:"data"`
13} 13}
14 14
15func ParseSvcSounds(reader *bitreader.Reader) SvcSounds { 15func ParseSvcSounds(reader *bitreader.Reader, demo *types.Demo) SvcSounds {
16 svcSounds := SvcSounds{ 16 svcSounds := SvcSounds{
17 ReliableSound: reader.TryReadBool(), 17 ReliableSound: reader.TryReadBool(),
18 } 18 }
@@ -24,8 +24,8 @@ func ParseSvcSounds(reader *bitreader.Reader) SvcSounds {
24 svcSounds.Length = reader.TryReadUInt16() 24 svcSounds.Length = reader.TryReadUInt16()
25 } 25 }
26 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length)) 26 svcSounds.Data = reader.TryReadBitsToSlice(uint64(svcSounds.Length))
27 writer.TempAppendLine("\t\tReliable Sound: %t", svcSounds.ReliableSound) 27 demo.Writer.TempAppendLine("\t\tReliable Sound: %t", svcSounds.ReliableSound)
28 writer.TempAppendLine("\t\tSound Count: %d", svcSounds.SoundCount) 28 demo.Writer.TempAppendLine("\t\tSound Count: %d", svcSounds.SoundCount)
29 writer.TempAppendLine("\t\tData: %v", svcSounds.Data) 29 demo.Writer.TempAppendLine("\t\tData: %v", svcSounds.Data)
30 return svcSounds 30 return svcSounds
31} 31}
diff --git a/pkg/messages/types/svcSplitScreen.go b/pkg/messages/types/svcSplitScreen.go
index e7f77c0..a4d4e48 100644
--- a/pkg/messages/types/svcSplitScreen.go
+++ b/pkg/messages/types/svcSplitScreen.go
@@ -2,22 +2,22 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcSplitScreen struct { 8type SvcSplitScreen struct {
9 RemoveUser bool 9 RemoveUser bool `json:"remove_user"`
10 Length uint16 10 Length uint16 `json:"length"`
11 Data []byte 11 Data []byte `json:"data"`
12} 12}
13 13
14func ParseSvcSplitScreen(reader *bitreader.Reader) SvcSplitScreen { 14func ParseSvcSplitScreen(reader *bitreader.Reader, demo *types.Demo) SvcSplitScreen {
15 svcSplitScreen := SvcSplitScreen{ 15 svcSplitScreen := SvcSplitScreen{
16 RemoveUser: reader.TryReadBool(), 16 RemoveUser: reader.TryReadBool(),
17 Length: uint16(reader.TryReadBits(11)), 17 Length: uint16(reader.TryReadBits(11)),
18 } 18 }
19 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length)) 19 svcSplitScreen.Data = reader.TryReadBitsToSlice(uint64(svcSplitScreen.Length))
20 writer.TempAppendLine("\t\tRemove User: %t", svcSplitScreen.RemoveUser) 20 demo.Writer.TempAppendLine("\t\tRemove User: %t", svcSplitScreen.RemoveUser)
21 writer.TempAppendLine("\t\tData: %v", svcSplitScreen.Data) 21 demo.Writer.TempAppendLine("\t\tData: %v", svcSplitScreen.Data)
22 return svcSplitScreen 22 return svcSplitScreen
23} 23}
diff --git a/pkg/messages/types/svcTempEntities.go b/pkg/messages/types/svcTempEntities.go
index 08c0af4..452e712 100644
--- a/pkg/messages/types/svcTempEntities.go
+++ b/pkg/messages/types/svcTempEntities.go
@@ -2,22 +2,22 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcTempEntities struct { 8type SvcTempEntities struct {
9 NumEntries uint8 9 NumEntries uint8 `json:"num_entries"`
10 Length uint32 10 Length uint32 `json:"length"`
11 Data []byte 11 Data []byte `json:"data"`
12} 12}
13 13
14func ParseSvcTempEntities(reader *bitreader.Reader) SvcTempEntities { 14func ParseSvcTempEntities(reader *bitreader.Reader, demo *types.Demo) SvcTempEntities {
15 svcTempEntities := SvcTempEntities{ 15 svcTempEntities := SvcTempEntities{
16 NumEntries: reader.TryReadUInt8(), 16 NumEntries: reader.TryReadUInt8(),
17 Length: uint32(reader.TryReadBits(17)), 17 Length: uint32(reader.TryReadBits(17)),
18 } 18 }
19 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length)) 19 svcTempEntities.Data = reader.TryReadBitsToSlice(uint64(svcTempEntities.Length))
20 writer.TempAppendLine("\t\tNumber Of Entries: %d", svcTempEntities.NumEntries) 20 demo.Writer.TempAppendLine("\t\tNumber Of Entries: %d", svcTempEntities.NumEntries)
21 writer.TempAppendLine("\t\tData: %v", svcTempEntities.Data) 21 demo.Writer.TempAppendLine("\t\tData: %v", svcTempEntities.Data)
22 return svcTempEntities 22 return svcTempEntities
23} 23}
diff --git a/pkg/messages/types/svcUpdateStringTable.go b/pkg/messages/types/svcUpdateStringTable.go
index 11e63d4..7e15cd2 100644
--- a/pkg/messages/types/svcUpdateStringTable.go
+++ b/pkg/messages/types/svcUpdateStringTable.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcUpdateStringTable struct { 8type SvcUpdateStringTable struct {
9 TableId uint8 9 TableId uint8 `json:"table_id"`
10 NumChangedEntries uint16 10 NumChangedEntries uint16 `json:"num_changed_entries"`
11 Length int32 11 Length int32 `json:"length"`
12 Data []byte 12 Data []byte `json:"data"`
13} 13}
14 14
15func ParseSvcUpdateStringTable(reader *bitreader.Reader) SvcUpdateStringTable { 15func ParseSvcUpdateStringTable(reader *bitreader.Reader, demo *types.Demo) SvcUpdateStringTable {
16 svcUpdateStringTable := SvcUpdateStringTable{ 16 svcUpdateStringTable := SvcUpdateStringTable{
17 TableId: uint8(reader.TryReadBits(5)), 17 TableId: uint8(reader.TryReadBits(5)),
18 } 18 }
@@ -21,7 +21,7 @@ func ParseSvcUpdateStringTable(reader *bitreader.Reader) SvcUpdateStringTable {
21 } 21 }
22 svcUpdateStringTable.Length = int32(reader.TryReadBits(20)) 22 svcUpdateStringTable.Length = int32(reader.TryReadBits(20))
23 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length)) 23 svcUpdateStringTable.Data = reader.TryReadBitsToSlice(uint64(svcUpdateStringTable.Length))
24 writer.TempAppendLine("\t\tTable ID: %d", svcUpdateStringTable.TableId) 24 demo.Writer.TempAppendLine("\t\tTable ID: %d", svcUpdateStringTable.TableId)
25 writer.TempAppendLine("\t\tNumber Of Changed Entries: %d", svcUpdateStringTable.NumChangedEntries) 25 demo.Writer.TempAppendLine("\t\tNumber Of Changed Entries: %d", svcUpdateStringTable.NumChangedEntries)
26 return svcUpdateStringTable 26 return svcUpdateStringTable
27} 27}
diff --git a/pkg/messages/types/svcUserMessage.go b/pkg/messages/types/svcUserMessage.go
index 138f8d3..1bb0e0e 100644
--- a/pkg/messages/types/svcUserMessage.go
+++ b/pkg/messages/types/svcUserMessage.go
@@ -5,134 +5,134 @@ import (
5 "math" 5 "math"
6 6
7 "github.com/pektezol/bitreader" 7 "github.com/pektezol/bitreader"
8 "github.com/pektezol/sdp.go/pkg/writer" 8 "github.com/pektezol/sdp.go/pkg/types"
9) 9)
10 10
11type SvcUserMessage struct { 11type SvcUserMessage struct {
12 Type int8 12 Type int8 `json:"type"`
13 Length int16 13 Length int16 `json:"length"`
14 Data any 14 Data any `json:"data"`
15} 15}
16 16
17func ParseSvcUserMessage(reader *bitreader.Reader) SvcUserMessage { 17func ParseSvcUserMessage(reader *bitreader.Reader, demo *types.Demo) SvcUserMessage {
18 svcUserMessage := SvcUserMessage{ 18 svcUserMessage := SvcUserMessage{
19 Type: int8(reader.TryReadBits(8)), 19 Type: int8(reader.TryReadBits(8)),
20 Length: int16(reader.TryReadBits(12)), 20 Length: int16(reader.TryReadBits(12)),
21 } 21 }
22 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length)) 22 svcUserMessage.Data = reader.TryReadBitsToSlice(uint64(svcUserMessage.Length))
23 userMessageReader := bitreader.NewReaderFromBytes(svcUserMessage.Data.([]byte), true) 23 userMessageReader := bitreader.NewReaderFromBytes(svcUserMessage.Data.([]byte), true)
24 writer.TempAppendLine("\t\t%s (%d):", UserMessageType(svcUserMessage.Type).String(), svcUserMessage.Type) 24 demo.Writer.TempAppendLine("\t\t%s (%d):", UserMessageType(svcUserMessage.Type).String(), svcUserMessage.Type)
25 switch UserMessageType(svcUserMessage.Type) { 25 switch UserMessageType(svcUserMessage.Type) {
26 case EUserMessageTypeGeiger: 26 case EUserMessageTypeGeiger:
27 svcUserMessage.parseGeiger(userMessageReader) 27 svcUserMessage.parseGeiger(userMessageReader, demo)
28 case EUserMessageTypeTrain: 28 case EUserMessageTypeTrain:
29 svcUserMessage.parseTrain(userMessageReader) 29 svcUserMessage.parseTrain(userMessageReader, demo)
30 case EUserMessageTypeHudText: 30 case EUserMessageTypeHudText:
31 svcUserMessage.parseHUDText(userMessageReader) 31 svcUserMessage.parseHUDText(userMessageReader, demo)
32 case EUserMessageTypeSayText: 32 case EUserMessageTypeSayText:
33 svcUserMessage.parseSayText(userMessageReader) 33 svcUserMessage.parseSayText(userMessageReader, demo)
34 case EUserMessageTypeSayText2: 34 case EUserMessageTypeSayText2:
35 svcUserMessage.parseSayText2(userMessageReader) 35 svcUserMessage.parseSayText2(userMessageReader, demo)
36 case EUserMessageTypeTextMsg: 36 case EUserMessageTypeTextMsg:
37 svcUserMessage.parseTextMsg(userMessageReader) 37 svcUserMessage.parseTextMsg(userMessageReader, demo)
38 case EUserMessageTypeHUDMsg: 38 case EUserMessageTypeHUDMsg:
39 svcUserMessage.parseHUDMsg(userMessageReader) 39 svcUserMessage.parseHUDMsg(userMessageReader, demo)
40 case EUserMessageTypeResetHUD: 40 case EUserMessageTypeResetHUD:
41 svcUserMessage.parseResetHUD(userMessageReader) 41 svcUserMessage.parseResetHUD(userMessageReader, demo)
42 case EUserMessageTypeShake: 42 case EUserMessageTypeShake:
43 svcUserMessage.parseShake(userMessageReader) 43 svcUserMessage.parseShake(userMessageReader, demo)
44 case EUserMessageTypeFade: 44 case EUserMessageTypeFade:
45 svcUserMessage.parseFade(userMessageReader) 45 svcUserMessage.parseFade(userMessageReader, demo)
46 case EUserMessageTypeVGUIMenu: 46 case EUserMessageTypeVGUIMenu:
47 svcUserMessage.parseVguiMenu(userMessageReader) 47 svcUserMessage.parseVguiMenu(userMessageReader, demo)
48 case EUserMessageTypeRumble: 48 case EUserMessageTypeRumble:
49 svcUserMessage.parseRumble(userMessageReader) 49 svcUserMessage.parseRumble(userMessageReader, demo)
50 case EUserMessageTypeBattery: 50 case EUserMessageTypeBattery:
51 svcUserMessage.parseBattery(userMessageReader) 51 svcUserMessage.parseBattery(userMessageReader, demo)
52 case EUserMessageTypeDamage: 52 case EUserMessageTypeDamage:
53 svcUserMessage.parseDamage(userMessageReader) 53 svcUserMessage.parseDamage(userMessageReader, demo)
54 case EUserMessageTypeVoiceMask: 54 case EUserMessageTypeVoiceMask:
55 svcUserMessage.parseVoiceMask(userMessageReader) 55 svcUserMessage.parseVoiceMask(userMessageReader, demo)
56 case EUserMessageTypeCloseCaption: 56 case EUserMessageTypeCloseCaption:
57 svcUserMessage.parseCloseCaption(userMessageReader) 57 svcUserMessage.parseCloseCaption(userMessageReader, demo)
58 case EUserMessageTypeKeyHintText: 58 case EUserMessageTypeKeyHintText:
59 svcUserMessage.parseKeyHintText(userMessageReader) 59 svcUserMessage.parseKeyHintText(userMessageReader, demo)
60 case EUserMessageTypeLogoTimeMsg: 60 case EUserMessageTypeLogoTimeMsg:
61 svcUserMessage.parseLogoTimeMsg(userMessageReader) 61 svcUserMessage.parseLogoTimeMsg(userMessageReader, demo)
62 case EUserMessageTypeAchievementEvent: 62 case EUserMessageTypeAchievementEvent:
63 svcUserMessage.parseAchivementEvent(userMessageReader) 63 svcUserMessage.parseAchivementEvent(userMessageReader, demo)
64 case EUserMessageTypeCurrentTimescale: 64 case EUserMessageTypeCurrentTimescale:
65 svcUserMessage.parseCurrentTimescale(userMessageReader) 65 svcUserMessage.parseCurrentTimescale(userMessageReader, demo)
66 case EUserMessageTypeDesiredTimescale: 66 case EUserMessageTypeDesiredTimescale:
67 svcUserMessage.parseDesiredTimescale(userMessageReader) 67 svcUserMessage.parseDesiredTimescale(userMessageReader, demo)
68 case EUserMessageTypeMPMapCompleted: 68 case EUserMessageTypeMPMapCompleted:
69 svcUserMessage.parseMpMapCompleted(userMessageReader) 69 svcUserMessage.parseMpMapCompleted(userMessageReader, demo)
70 case EUserMessageTypeMPMapIncomplete: 70 case EUserMessageTypeMPMapIncomplete:
71 svcUserMessage.parseMpMapIncomplete(userMessageReader) 71 svcUserMessage.parseMpMapIncomplete(userMessageReader, demo)
72 case EUserMessageTypeMPTauntEarned: 72 case EUserMessageTypeMPTauntEarned:
73 svcUserMessage.parseMpTauntEarned(userMessageReader) 73 svcUserMessage.parseMpTauntEarned(userMessageReader, demo)
74 case EUserMessageTypeMPTauntLocked: 74 case EUserMessageTypeMPTauntLocked:
75 svcUserMessage.parseMpTauntLocked(userMessageReader) 75 svcUserMessage.parseMpTauntLocked(userMessageReader, demo)
76 case EUserMessageTypePortalFX_Surface: 76 case EUserMessageTypePortalFX_Surface:
77 svcUserMessage.parsePortalFxSurface(userMessageReader) 77 svcUserMessage.parsePortalFxSurface(userMessageReader, demo)
78 case EUserMessageTypePaintWorld: 78 case EUserMessageTypePaintWorld:
79 svcUserMessage.parsePaintWorld(userMessageReader) 79 svcUserMessage.parsePaintWorld(userMessageReader, demo)
80 case EUserMessageTypeTransitionFade: 80 case EUserMessageTypeTransitionFade:
81 svcUserMessage.parseTransitionFade(userMessageReader) 81 svcUserMessage.parseTransitionFade(userMessageReader, demo)
82 case EUserMessageTypeScoreboardTempUpdate: 82 case EUserMessageTypeScoreboardTempUpdate:
83 svcUserMessage.parseScoreboardTempUpdate(userMessageReader) 83 svcUserMessage.parseScoreboardTempUpdate(userMessageReader, demo)
84 default: 84 default:
85 writer.TempAppendLine("\t\t\tData: %v", svcUserMessage.Data) 85 demo.Writer.TempAppendLine("\t\t\tData: %v", svcUserMessage.Data)
86 } 86 }
87 return svcUserMessage 87 return svcUserMessage
88} 88}
89 89
90func (svcUserMessage *SvcUserMessage) parseGeiger(reader *bitreader.Reader) { 90func (svcUserMessage *SvcUserMessage) parseGeiger(reader *bitreader.Reader, demo *types.Demo) {
91 geiger := struct{ Range uint8 }{ 91 geiger := struct{ Range uint8 }{
92 Range: reader.TryReadUInt8(), 92 Range: reader.TryReadUInt8(),
93 } 93 }
94 svcUserMessage.Data = geiger 94 svcUserMessage.Data = geiger
95 writer.TempAppendLine("\t\t\tGeiger Range: %d", geiger.Range) 95 demo.Writer.TempAppendLine("\t\t\tGeiger Range: %d", geiger.Range)
96} 96}
97 97
98func (svcUserMessage *SvcUserMessage) parseTrain(reader *bitreader.Reader) { 98func (svcUserMessage *SvcUserMessage) parseTrain(reader *bitreader.Reader, demo *types.Demo) {
99 train := struct{ Pos uint8 }{ 99 train := struct{ Pos uint8 }{
100 Pos: reader.TryReadUInt8(), 100 Pos: reader.TryReadUInt8(),
101 } 101 }
102 svcUserMessage.Data = train 102 svcUserMessage.Data = train
103 writer.TempAppendLine("\t\t\tPos: %d", train.Pos) 103 demo.Writer.TempAppendLine("\t\t\tPos: %d", train.Pos)
104} 104}
105 105
106func (svcUserMessage *SvcUserMessage) parseHUDText(reader *bitreader.Reader) { 106func (svcUserMessage *SvcUserMessage) parseHUDText(reader *bitreader.Reader, demo *types.Demo) {
107 hudText := struct{ Text string }{ 107 hudText := struct{ Text string }{
108 Text: reader.TryReadString(), 108 Text: reader.TryReadString(),
109 } 109 }
110 svcUserMessage.Data = hudText 110 svcUserMessage.Data = hudText
111 writer.TempAppendLine("\t\t\tText: %s", hudText.Text) 111 demo.Writer.TempAppendLine("\t\t\tText: %s", hudText.Text)
112} 112}
113 113
114func (svcUserMessage *SvcUserMessage) parseSayText(reader *bitreader.Reader) { 114func (svcUserMessage *SvcUserMessage) parseSayText(reader *bitreader.Reader, demo *types.Demo) {
115 sayText := struct { 115 sayText := struct {
116 Client uint8 116 Client uint8 `json:"client"`
117 Message string 117 Message string `json:"message"`
118 WantsToChat bool 118 WantsToChat bool `json:"wants_to_chat"`
119 }{ 119 }{
120 Client: reader.TryReadUInt8(), 120 Client: reader.TryReadUInt8(),
121 Message: reader.TryReadString(), 121 Message: reader.TryReadString(),
122 WantsToChat: reader.TryReadUInt8() != 0, 122 WantsToChat: reader.TryReadUInt8() != 0,
123 } 123 }
124 svcUserMessage.Data = sayText 124 svcUserMessage.Data = sayText
125 writer.TempAppendLine("\t\t\tClient: %d", sayText.Client) 125 demo.Writer.TempAppendLine("\t\t\tClient: %d", sayText.Client)
126 writer.TempAppendLine("\t\t\tMessage: %s", sayText.Message) 126 demo.Writer.TempAppendLine("\t\t\tMessage: %s", sayText.Message)
127 writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText.WantsToChat) 127 demo.Writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText.WantsToChat)
128} 128}
129 129
130func (svcUserMessage *SvcUserMessage) parseSayText2(reader *bitreader.Reader) { 130func (svcUserMessage *SvcUserMessage) parseSayText2(reader *bitreader.Reader, demo *types.Demo) {
131 sayText2 := struct { 131 sayText2 := struct {
132 Client uint8 132 Client uint8 `json:"client"`
133 WantsToChat bool 133 WantsToChat bool `json:"wants_to_chat"`
134 MessageName string 134 MessageName string `json:"message_name"`
135 Messages []string 135 Messages []string `json:"messages"`
136 }{ 136 }{
137 Client: reader.TryReadUInt8(), 137 Client: reader.TryReadUInt8(),
138 WantsToChat: reader.TryReadUInt8() != 0, 138 WantsToChat: reader.TryReadUInt8() != 0,
@@ -140,15 +140,15 @@ func (svcUserMessage *SvcUserMessage) parseSayText2(reader *bitreader.Reader) {
140 Messages: []string{reader.TryReadString(), reader.TryReadString(), reader.TryReadString()}, 140 Messages: []string{reader.TryReadString(), reader.TryReadString(), reader.TryReadString()},
141 } 141 }
142 svcUserMessage.Data = sayText2 142 svcUserMessage.Data = sayText2
143 writer.TempAppendLine("\t\t\tClient: %d", sayText2.Client) 143 demo.Writer.TempAppendLine("\t\t\tClient: %d", sayText2.Client)
144 writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText2.WantsToChat) 144 demo.Writer.TempAppendLine("\t\t\tWants To Chat: %t", sayText2.WantsToChat)
145 writer.TempAppendLine("\t\t\tName: %s", sayText2.MessageName) 145 demo.Writer.TempAppendLine("\t\t\tName: %s", sayText2.MessageName)
146 for index, message := range sayText2.Messages { 146 for index, message := range sayText2.Messages {
147 writer.TempAppendLine("\t\t\tMessage %d: %s", index, message) 147 demo.Writer.TempAppendLine("\t\t\tMessage %d: %s", index, message)
148 } 148 }
149} 149}
150 150
151func (svcUserMessage *SvcUserMessage) parseTextMsg(reader *bitreader.Reader) { 151func (svcUserMessage *SvcUserMessage) parseTextMsg(reader *bitreader.Reader, demo *types.Demo) {
152 const MessageCount int = 5 152 const MessageCount int = 5
153 textMsg := struct { 153 textMsg := struct {
154 Destination uint8 154 Destination uint8
@@ -161,47 +161,57 @@ func (svcUserMessage *SvcUserMessage) parseTextMsg(reader *bitreader.Reader) {
161 textMsg.Messages[i] = reader.TryReadString() 161 textMsg.Messages[i] = reader.TryReadString()
162 } 162 }
163 svcUserMessage.Data = textMsg 163 svcUserMessage.Data = textMsg
164 writer.TempAppendLine("\t\t\tDestination: %d", textMsg.Destination) 164 demo.Writer.TempAppendLine("\t\t\tDestination: %d", textMsg.Destination)
165 for i := 0; i < MessageCount; i++ { 165 for i := 0; i < MessageCount; i++ {
166 writer.TempAppendLine("\t\t\tMessage %d: %s", i+1, textMsg.Messages) 166 demo.Writer.TempAppendLine("\t\t\tMessage %d: %s", i+1, textMsg.Messages)
167 } 167 }
168} 168}
169 169
170func (svcUserMessage *SvcUserMessage) parseHUDMsg(reader *bitreader.Reader) { 170func (svcUserMessage *SvcUserMessage) parseHUDMsg(reader *bitreader.Reader, demo *types.Demo) {
171 const MaxNetMessage uint8 = 6 171 const MaxNetMessage uint8 = 6
172 hudMsg := struct { 172 hudMsg := struct {
173 Channel uint8 173 Channel uint8 `json:"channel"`
174 Info struct { 174 Info struct {
175 X, Y float32 // 0-1 & resolution independent, -1 means center in each dimension 175 X float32 `json:"x"` // 0-1 & resolution independent, -1 means center in each dimension
176 R1, G1, B1, A1 uint8 176 Y float32 `json:"y"`
177 R2, G2, B2, A2 uint8 177 R1 uint8 `json:"r_1"`
178 Effect uint8 178 G1 uint8 `json:"g_1"`
179 FadeIn, FadeOut, HoldTime, FxTime float32 // the fade times seem to be per character 179 B1 uint8 `json:"b_1"`
180 Message string 180 A1 uint8 `json:"a_1"`
181 } 181 R2 uint8 `json:"r_2"`
182 G2 uint8 `json:"g_2"`
183 B2 uint8 `json:"b_2"`
184 A2 uint8 `json:"a_2"`
185 Effect uint8 `json:"effect"`
186 FadeIn float32 `json:"fade_in"` // the fade times seem to be per character
187 FadeOut float32 `json:"fade_out"`
188 HoldTime float32 `json:"hold_time"`
189 FxTime float32 `json:"fx_time"`
190 Message string `json:"message"`
191 } `json:"info"`
182 }{ 192 }{
183 Channel: reader.TryReadUInt8() % MaxNetMessage, 193 Channel: reader.TryReadUInt8() % MaxNetMessage,
184 } 194 }
185 svcUserMessage.Data = hudMsg 195 svcUserMessage.Data = hudMsg
186 writer.TempAppendLine("\t\t\tChannel: %d", hudMsg.Channel) 196 demo.Writer.TempAppendLine("\t\t\tChannel: %d", hudMsg.Channel)
187 if reader.TryReadRemainingBits() >= 148 { 197 if reader.TryReadRemainingBits() >= 148 {
188 hudMsg.Info = struct { 198 hudMsg.Info = struct {
189 X float32 199 X float32 `json:"x"`
190 Y float32 200 Y float32 `json:"y"`
191 R1 uint8 201 R1 uint8 `json:"r_1"`
192 G1 uint8 202 G1 uint8 `json:"g_1"`
193 B1 uint8 203 B1 uint8 `json:"b_1"`
194 A1 uint8 204 A1 uint8 `json:"a_1"`
195 R2 uint8 205 R2 uint8 `json:"r_2"`
196 G2 uint8 206 G2 uint8 `json:"g_2"`
197 B2 uint8 207 B2 uint8 `json:"b_2"`
198 A2 uint8 208 A2 uint8 `json:"a_2"`
199 Effect uint8 209 Effect uint8 `json:"effect"`
200 FadeIn float32 210 FadeIn float32 `json:"fade_in"`
201 FadeOut float32 211 FadeOut float32 `json:"fade_out"`
202 HoldTime float32 212 HoldTime float32 `json:"hold_time"`
203 FxTime float32 213 FxTime float32 `json:"fx_time"`
204 Message string 214 Message string `json:"message"`
205 }{ 215 }{
206 X: reader.TryReadFloat32(), 216 X: reader.TryReadFloat32(),
207 Y: reader.TryReadFloat32(), 217 Y: reader.TryReadFloat32(),
@@ -221,27 +231,27 @@ func (svcUserMessage *SvcUserMessage) parseHUDMsg(reader *bitreader.Reader) {
221 Message: reader.TryReadString(), 231 Message: reader.TryReadString(),
222 } 232 }
223 svcUserMessage.Data = hudMsg 233 svcUserMessage.Data = hudMsg
224 writer.TempAppendLine("\t\t\tX: %f, Y: %f", hudMsg.Info.X, hudMsg.Info.Y) 234 demo.Writer.TempAppendLine("\t\t\tX: %f, Y: %f", hudMsg.Info.X, hudMsg.Info.Y)
225 writer.TempAppendLine("\t\t\tRGBA1: %3d %3d %3d %3d", hudMsg.Info.R1, hudMsg.Info.G1, hudMsg.Info.B1, hudMsg.Info.A1) 235 demo.Writer.TempAppendLine("\t\t\tRGBA1: %3d %3d %3d %3d", hudMsg.Info.R1, hudMsg.Info.G1, hudMsg.Info.B1, hudMsg.Info.A1)
226 writer.TempAppendLine("\t\t\tRGBA2: %3d %3d %3d %3d", hudMsg.Info.R2, hudMsg.Info.G2, hudMsg.Info.B2, hudMsg.Info.A2) 236 demo.Writer.TempAppendLine("\t\t\tRGBA2: %3d %3d %3d %3d", hudMsg.Info.R2, hudMsg.Info.G2, hudMsg.Info.B2, hudMsg.Info.A2)
227 writer.TempAppendLine("\t\t\tEffect: %d", hudMsg.Info.Effect) 237 demo.Writer.TempAppendLine("\t\t\tEffect: %d", hudMsg.Info.Effect)
228 writer.TempAppendLine("\t\t\tFade In: %f", hudMsg.Info.FadeIn) 238 demo.Writer.TempAppendLine("\t\t\tFade In: %f", hudMsg.Info.FadeIn)
229 writer.TempAppendLine("\t\t\tFade Out: %f", hudMsg.Info.FadeOut) 239 demo.Writer.TempAppendLine("\t\t\tFade Out: %f", hudMsg.Info.FadeOut)
230 writer.TempAppendLine("\t\t\tHold Time: %f", hudMsg.Info.HoldTime) 240 demo.Writer.TempAppendLine("\t\t\tHold Time: %f", hudMsg.Info.HoldTime)
231 writer.TempAppendLine("\t\t\tFX Time: %f", hudMsg.Info.FxTime) 241 demo.Writer.TempAppendLine("\t\t\tFX Time: %f", hudMsg.Info.FxTime)
232 writer.TempAppendLine("\t\t\tMessage: %s", hudMsg.Info.Message) 242 demo.Writer.TempAppendLine("\t\t\tMessage: %s", hudMsg.Info.Message)
233 } 243 }
234} 244}
235 245
236func (svcUserMessage *SvcUserMessage) parseResetHUD(reader *bitreader.Reader) { 246func (svcUserMessage *SvcUserMessage) parseResetHUD(reader *bitreader.Reader, demo *types.Demo) {
237 resetHUD := struct{ Unknown uint8 }{ 247 resetHUD := struct{ Unknown uint8 }{
238 Unknown: reader.TryReadUInt8(), 248 Unknown: reader.TryReadUInt8(),
239 } 249 }
240 svcUserMessage.Data = resetHUD 250 svcUserMessage.Data = resetHUD
241 writer.TempAppendLine("\t\t\tUnknown: %d", resetHUD.Unknown) 251 demo.Writer.TempAppendLine("\t\t\tUnknown: %d", resetHUD.Unknown)
242} 252}
243 253
244func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader) { 254func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader, demo *types.Demo) {
245 type ShakeCommand uint8 255 type ShakeCommand uint8
246 const ( 256 const (
247 Start ShakeCommand = iota // Starts the screen shake for all players within the radius. 257 Start ShakeCommand = iota // Starts the screen shake for all players within the radius.
@@ -252,10 +262,10 @@ func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader) {
252 NoRumble // Starts a shake that does NOT rumble the controller. 262 NoRumble // Starts a shake that does NOT rumble the controller.
253 ) 263 )
254 shake := struct { 264 shake := struct {
255 Command uint8 265 Command uint8 `json:"command"`
256 Amplitude float32 266 Amplitude float32 `json:"amplitude"`
257 Frequency float32 267 Frequency float32 `json:"frequency"`
258 Duration float32 268 Duration float32 `json:"duration"`
259 }{ 269 }{
260 Command: reader.TryReadUInt8(), 270 Command: reader.TryReadUInt8(),
261 Amplitude: reader.TryReadFloat32(), 271 Amplitude: reader.TryReadFloat32(),
@@ -281,13 +291,13 @@ func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader) {
281 } 291 }
282 } 292 }
283 svcUserMessage.Data = shake 293 svcUserMessage.Data = shake
284 writer.TempAppendLine("\t\t\tCommand: %s", shakeCommandToString(ShakeCommand(shake.Command))) 294 demo.Writer.TempAppendLine("\t\t\tCommand: %s", shakeCommandToString(ShakeCommand(shake.Command)))
285 writer.TempAppendLine("\t\t\tAmplitude: %f", shake.Amplitude) 295 demo.Writer.TempAppendLine("\t\t\tAmplitude: %f", shake.Amplitude)
286 writer.TempAppendLine("\t\t\tFrequency: %f", shake.Frequency) 296 demo.Writer.TempAppendLine("\t\t\tFrequency: %f", shake.Frequency)
287 writer.TempAppendLine("\t\t\tDuration: %f", shake.Duration) 297 demo.Writer.TempAppendLine("\t\t\tDuration: %f", shake.Duration)
288} 298}
289 299
290func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader) { 300func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader, demo *types.Demo) {
291 type FadeFlag uint16 301 type FadeFlag uint16
292 const ( 302 const (
293 None FadeFlag = 0 303 None FadeFlag = 0
@@ -298,13 +308,13 @@ func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader) {
298 Purge FadeFlag = 1 << 4 // Purges all other fades, replacing them with this one 308 Purge FadeFlag = 1 << 4 // Purges all other fades, replacing them with this one
299 ) 309 )
300 fade := struct { 310 fade := struct {
301 Duration float32 311 Duration float32 `json:"duration"`
302 HoldTime uint16 312 HoldTime uint16 `json:"hold_time"`
303 Flags uint16 313 Flags uint16 `json:"flags"`
304 R uint8 314 R uint8 `json:"r"`
305 G uint8 315 G uint8 `json:"g"`
306 B uint8 316 B uint8 `json:"b"`
307 A uint8 317 A uint8 `json:"a"`
308 }{ 318 }{
309 Duration: float32(reader.TryReadUInt16()) / float32(1<<9), // might be useful: #define SCREENFADE_FRACBITS 9 319 Duration: float32(reader.TryReadUInt16()) / float32(1<<9), // might be useful: #define SCREENFADE_FRACBITS 9
310 HoldTime: reader.TryReadUInt16(), 320 HoldTime: reader.TryReadUInt16(),
@@ -334,17 +344,17 @@ func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader) {
334 return flagStrings 344 return flagStrings
335 } 345 }
336 svcUserMessage.Data = fade 346 svcUserMessage.Data = fade
337 writer.TempAppendLine("\t\t\tDuration: %f", fade.Duration) 347 demo.Writer.TempAppendLine("\t\t\tDuration: %f", fade.Duration)
338 writer.TempAppendLine("\t\t\tHold Time: %d", fade.HoldTime) 348 demo.Writer.TempAppendLine("\t\t\tHold Time: %d", fade.HoldTime)
339 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(FadeFlag(fade.Flags))) 349 demo.Writer.TempAppendLine("\t\t\tFlags: %v", getFlags(FadeFlag(fade.Flags)))
340 writer.TempAppendLine("\t\t\tRGBA: %3d %3d %3d %3d", fade.R, fade.G, fade.B, fade.A) 350 demo.Writer.TempAppendLine("\t\t\tRGBA: %3d %3d %3d %3d", fade.R, fade.G, fade.B, fade.A)
341} 351}
342 352
343func (svcUserMessage *SvcUserMessage) parseVguiMenu(reader *bitreader.Reader) { 353func (svcUserMessage *SvcUserMessage) parseVguiMenu(reader *bitreader.Reader, demo *types.Demo) {
344 vguiMenu := struct { 354 vguiMenu := struct {
345 Message string 355 Message string `json:"message"`
346 Show bool 356 Show bool `json:"show"`
347 KeyValues []map[string]string 357 KeyValues []map[string]string `json:"key_values"`
348 }{ 358 }{
349 Message: reader.TryReadString(), 359 Message: reader.TryReadString(),
350 Show: reader.TryReadUInt8() != 0, 360 Show: reader.TryReadUInt8() != 0,
@@ -354,19 +364,19 @@ func (svcUserMessage *SvcUserMessage) parseVguiMenu(reader *bitreader.Reader) {
354 vguiMenu.KeyValues = append(vguiMenu.KeyValues, map[string]string{"Key": reader.TryReadString(), "Value": reader.TryReadString()}) 364 vguiMenu.KeyValues = append(vguiMenu.KeyValues, map[string]string{"Key": reader.TryReadString(), "Value": reader.TryReadString()})
355 } 365 }
356 svcUserMessage.Data = vguiMenu 366 svcUserMessage.Data = vguiMenu
357 writer.TempAppendLine("\t\t\tMessage: %s", vguiMenu.Message) 367 demo.Writer.TempAppendLine("\t\t\tMessage: %s", vguiMenu.Message)
358 writer.TempAppendLine("\t\t\tShow: %t", vguiMenu.Show) 368 demo.Writer.TempAppendLine("\t\t\tShow: %t", vguiMenu.Show)
359 if len(vguiMenu.KeyValues) > 0 { 369 if len(vguiMenu.KeyValues) > 0 {
360 writer.TempAppendLine("\t\t\t%d Key Value Pairs:", len(vguiMenu.KeyValues)) 370 demo.Writer.TempAppendLine("\t\t\t%d Key Value Pairs:", len(vguiMenu.KeyValues))
361 for _, kv := range vguiMenu.KeyValues { 371 for _, kv := range vguiMenu.KeyValues {
362 writer.TempAppendLine("\t\t\t\t%s: %s", kv["Key"], kv["Value"]) 372 demo.Writer.TempAppendLine("\t\t\t\t%s: %s", kv["Key"], kv["Value"])
363 } 373 }
364 } else { 374 } else {
365 writer.TempAppendLine("\t\t\tNo Key Value Pairs") 375 demo.Writer.TempAppendLine("\t\t\tNo Key Value Pairs")
366 } 376 }
367} 377}
368 378
369func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader) { 379func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader, demo *types.Demo) {
370 type RumbleLookup int8 380 type RumbleLookup int8
371 const ( 381 const (
372 RumbleInvalid RumbleLookup = -1 382 RumbleInvalid RumbleLookup = -1
@@ -418,9 +428,9 @@ func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader) {
418 InitialScale RumbleFlag = 1 << 4 // Data is the initial scale to start this effect ( * 100 ) 428 InitialScale RumbleFlag = 1 << 4 // Data is the initial scale to start this effect ( * 100 )
419 ) 429 )
420 rumble := struct { 430 rumble := struct {
421 Type int8 431 Type int8 `json:"type"`
422 Scale float32 432 Scale float32 `json:"scale"`
423 Flags uint8 433 Flags uint8 `json:"flags"`
424 }{ 434 }{
425 Type: reader.TryReadSInt8(), 435 Type: reader.TryReadSInt8(),
426 Scale: float32(reader.TryReadUInt8()) / 100, 436 Scale: float32(reader.TryReadUInt8()) / 100,
@@ -452,25 +462,25 @@ func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader) {
452 return flagStrings 462 return flagStrings
453 } 463 }
454 svcUserMessage.Data = rumble 464 svcUserMessage.Data = rumble
455 writer.TempAppendLine("\t\t\tType: %s", getRumbleLookup(RumbleLookup(rumble.Type))) 465 demo.Writer.TempAppendLine("\t\t\tType: %s", getRumbleLookup(RumbleLookup(rumble.Type)))
456 writer.TempAppendLine("\t\t\tScale: %f", rumble.Scale) 466 demo.Writer.TempAppendLine("\t\t\tScale: %f", rumble.Scale)
457 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(RumbleFlag(rumble.Flags))) 467 demo.Writer.TempAppendLine("\t\t\tFlags: %v", getFlags(RumbleFlag(rumble.Flags)))
458} 468}
459 469
460func (svcUserMessage *SvcUserMessage) parseBattery(reader *bitreader.Reader) { 470func (svcUserMessage *SvcUserMessage) parseBattery(reader *bitreader.Reader, demo *types.Demo) {
461 battery := struct{ BatteryVal uint16 }{ 471 battery := struct{ BatteryVal uint16 }{
462 BatteryVal: reader.TryReadUInt16(), 472 BatteryVal: reader.TryReadUInt16(),
463 } 473 }
464 svcUserMessage.Data = battery 474 svcUserMessage.Data = battery
465 writer.TempAppendLine("\t\t\tBattery: %d", battery.BatteryVal) 475 demo.Writer.TempAppendLine("\t\t\tBattery: %d", battery.BatteryVal)
466} 476}
467 477
468func (svcUserMessage *SvcUserMessage) parseDamage(reader *bitreader.Reader) { 478func (svcUserMessage *SvcUserMessage) parseDamage(reader *bitreader.Reader, demo *types.Demo) {
469 damage := struct { 479 damage := struct {
470 Armor uint8 480 Armor uint8 `json:"armor"`
471 DamageTaken uint8 481 DamageTaken uint8 `json:"damage_taken"`
472 BitsDamage int32 482 BitsDamage int32 `json:"bits_damage"`
473 VecFrom []float32 483 VecFrom []float32 `json:"vec_from"`
474 }{ 484 }{
475 Armor: reader.TryReadUInt8(), 485 Armor: reader.TryReadUInt8(),
476 DamageTaken: reader.TryReadUInt8(), 486 DamageTaken: reader.TryReadUInt8(),
@@ -478,24 +488,24 @@ func (svcUserMessage *SvcUserMessage) parseDamage(reader *bitreader.Reader) {
478 VecFrom: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, 488 VecFrom: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()},
479 } 489 }
480 svcUserMessage.Data = damage 490 svcUserMessage.Data = damage
481 writer.TempAppendLine("\t\t\tArmor: %d", damage.Armor) 491 demo.Writer.TempAppendLine("\t\t\tArmor: %d", damage.Armor)
482 writer.TempAppendLine("\t\t\tDamage Taken: %d", damage.DamageTaken) 492 demo.Writer.TempAppendLine("\t\t\tDamage Taken: %d", damage.DamageTaken)
483 writer.TempAppendLine("\t\t\tBits Damage: %d", damage.BitsDamage) 493 demo.Writer.TempAppendLine("\t\t\tBits Damage: %d", damage.BitsDamage)
484 writer.TempAppendLine("\t\t\tVecFrom: %v", damage.VecFrom) 494 demo.Writer.TempAppendLine("\t\t\tVecFrom: %v", damage.VecFrom)
485} 495}
486 496
487func (svcUserMessage *SvcUserMessage) parseVoiceMask(reader *bitreader.Reader) { 497func (svcUserMessage *SvcUserMessage) parseVoiceMask(reader *bitreader.Reader, demo *types.Demo) {
488 // const VoiceMaxPlayers = 2 498 // const VoiceMaxPlayers = 2
489 voiceMask := struct { 499 voiceMask := struct {
490 PlayerMasks []struct { 500 PlayerMasks []struct {
491 GameRulesMask int32 501 GameRulesMask int32 `json:"game_rules_mask"`
492 BanMask int32 502 BanMask int32 `json:"ban_mask"`
493 } 503 } `json:"player_masks"`
494 PlayerModEnable bool 504 PlayerModEnable bool `json:"player_mod_enable"`
495 }{ 505 }{
496 PlayerMasks: []struct { 506 PlayerMasks: []struct {
497 GameRulesMask int32 507 GameRulesMask int32 `json:"game_rules_mask"`
498 BanMask int32 508 BanMask int32 `json:"ban_mask"`
499 }{ 509 }{
500 { 510 {
501 GameRulesMask: reader.TryReadSInt32(), 511 GameRulesMask: reader.TryReadSInt32(),
@@ -509,15 +519,15 @@ func (svcUserMessage *SvcUserMessage) parseVoiceMask(reader *bitreader.Reader) {
509 PlayerModEnable: reader.TryReadUInt8() != 0, 519 PlayerModEnable: reader.TryReadUInt8() != 0,
510 } 520 }
511 svcUserMessage.Data = voiceMask 521 svcUserMessage.Data = voiceMask
512 writer.TempAppendLine("\t\t\tPlayer Masks:") 522 demo.Writer.TempAppendLine("\t\t\tPlayer Masks:")
513 writer.TempAppendLine("\t\t\t\t[0] Game Rules Mask: %d", voiceMask.PlayerMasks[0].GameRulesMask) 523 demo.Writer.TempAppendLine("\t\t\t\t[0] Game Rules Mask: %d", voiceMask.PlayerMasks[0].GameRulesMask)
514 writer.TempAppendLine("\t\t\t\t[0] Ban Mask: %d", voiceMask.PlayerMasks[0].BanMask) 524 demo.Writer.TempAppendLine("\t\t\t\t[0] Ban Mask: %d", voiceMask.PlayerMasks[0].BanMask)
515 writer.TempAppendLine("\t\t\t\t[1] Game Rules Mask: %d", voiceMask.PlayerMasks[1].GameRulesMask) 525 demo.Writer.TempAppendLine("\t\t\t\t[1] Game Rules Mask: %d", voiceMask.PlayerMasks[1].GameRulesMask)
516 writer.TempAppendLine("\t\t\t\t[1] Ban Mask: %d", voiceMask.PlayerMasks[1].BanMask) 526 demo.Writer.TempAppendLine("\t\t\t\t[1] Ban Mask: %d", voiceMask.PlayerMasks[1].BanMask)
517 writer.TempAppendLine("\t\t\t\tPlayer Mod Enable: %t", voiceMask.PlayerModEnable) 527 demo.Writer.TempAppendLine("\t\t\t\tPlayer Mod Enable: %t", voiceMask.PlayerModEnable)
518} 528}
519 529
520func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader) { 530func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader, demo *types.Demo) {
521 type CloseCaptionFlag uint8 531 type CloseCaptionFlag uint8
522 const ( 532 const (
523 None CloseCaptionFlag = 0 533 None CloseCaptionFlag = 0
@@ -527,9 +537,9 @@ func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader
527 GenderFemale CloseCaptionFlag = 1 << 3 537 GenderFemale CloseCaptionFlag = 1 << 3
528 ) 538 )
529 closeCaption := struct { 539 closeCaption := struct {
530 TokenName string 540 TokenName string `json:"token_name"`
531 Duration float32 541 Duration float32 `json:"duration"`
532 Flags uint8 542 Flags uint8 `json:"flags"`
533 }{ 543 }{
534 TokenName: reader.TryReadString(), 544 TokenName: reader.TryReadString(),
535 Duration: float32(reader.TryReadSInt16()) * 0.1, 545 Duration: float32(reader.TryReadSInt16()) * 0.1,
@@ -552,54 +562,58 @@ func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader
552 return flagStrings 562 return flagStrings
553 } 563 }
554 svcUserMessage.Data = closeCaption 564 svcUserMessage.Data = closeCaption
555 writer.TempAppendLine("\t\t\tToken Name: %s", closeCaption.TokenName) 565 demo.Writer.TempAppendLine("\t\t\tToken Name: %s", closeCaption.TokenName)
556 writer.TempAppendLine("\t\t\tDuration: %f", closeCaption.Duration) 566 demo.Writer.TempAppendLine("\t\t\tDuration: %f", closeCaption.Duration)
557 writer.TempAppendLine("\t\t\tFlags: %v", getFlags(CloseCaptionFlag(closeCaption.Flags))) 567 demo.Writer.TempAppendLine("\t\t\tFlags: %v", getFlags(CloseCaptionFlag(closeCaption.Flags)))
558} 568}
559 569
560func (svcUserMessage *SvcUserMessage) parseKeyHintText(reader *bitreader.Reader) { 570func (svcUserMessage *SvcUserMessage) parseKeyHintText(reader *bitreader.Reader, demo *types.Demo) {
561 keyHintText := struct { 571 keyHintText := struct {
562 Count uint8 572 Count uint8 `json:"count"`
563 KeyString string 573 KeyString string `json:"key_string"`
564 }{ 574 }{
565 Count: reader.TryReadUInt8(), 575 Count: reader.TryReadUInt8(),
566 KeyString: reader.TryReadString(), 576 KeyString: reader.TryReadString(),
567 } 577 }
568 svcUserMessage.Data = keyHintText 578 svcUserMessage.Data = keyHintText
569 writer.TempAppendLine("\t\t\tCount: %d", keyHintText.Count) 579 demo.Writer.TempAppendLine("\t\t\tCount: %d", keyHintText.Count)
570 writer.TempAppendLine("\t\t\tString: %s", keyHintText.KeyString) 580 demo.Writer.TempAppendLine("\t\t\tString: %s", keyHintText.KeyString)
571} 581}
572 582
573func (svcUserMessage *SvcUserMessage) parseLogoTimeMsg(reader *bitreader.Reader) { 583func (svcUserMessage *SvcUserMessage) parseLogoTimeMsg(reader *bitreader.Reader, demo *types.Demo) {
574 logoTimeMsg := struct{ Time float32 }{ 584 logoTimeMsg := struct {
585 Time float32 `json:"time"`
586 }{
575 Time: reader.TryReadFloat32(), 587 Time: reader.TryReadFloat32(),
576 } 588 }
577 svcUserMessage.Data = logoTimeMsg 589 svcUserMessage.Data = logoTimeMsg
578 writer.TempAppendLine("\t\t\tTime: %f", logoTimeMsg.Time) 590 demo.Writer.TempAppendLine("\t\t\tTime: %f", logoTimeMsg.Time)
579} 591}
580 592
581func (svcUserMessage *SvcUserMessage) parseAchivementEvent(reader *bitreader.Reader) { 593func (svcUserMessage *SvcUserMessage) parseAchivementEvent(reader *bitreader.Reader, demo *types.Demo) {
582 achivementEvent := struct{ AchivementID int32 }{ 594 achivementEvent := struct{ AchivementID int32 }{
583 AchivementID: reader.TryReadSInt32(), 595 AchivementID: reader.TryReadSInt32(),
584 } 596 }
585 svcUserMessage.Data = achivementEvent 597 svcUserMessage.Data = achivementEvent
586 writer.TempAppendLine("\t\t\tAchivement ID: %d", achivementEvent.AchivementID) 598 demo.Writer.TempAppendLine("\t\t\tAchivement ID: %d", achivementEvent.AchivementID)
587} 599}
588 600
589func (svcUserMessage *SvcUserMessage) parseCurrentTimescale(reader *bitreader.Reader) { 601func (svcUserMessage *SvcUserMessage) parseCurrentTimescale(reader *bitreader.Reader, demo *types.Demo) {
590 currentTimescale := struct{ Timescale float32 }{ 602 currentTimescale := struct {
603 Timescale float32 `json:"timescale"`
604 }{
591 Timescale: reader.TryReadFloat32(), 605 Timescale: reader.TryReadFloat32(),
592 } 606 }
593 svcUserMessage.Data = currentTimescale 607 svcUserMessage.Data = currentTimescale
594 writer.TempAppendLine("\t\t\tTimescale: %f", currentTimescale.Timescale) 608 demo.Writer.TempAppendLine("\t\t\tTimescale: %f", currentTimescale.Timescale)
595} 609}
596 610
597func (svcUserMessage *SvcUserMessage) parseDesiredTimescale(reader *bitreader.Reader) { 611func (svcUserMessage *SvcUserMessage) parseDesiredTimescale(reader *bitreader.Reader, demo *types.Demo) {
598 desiredTimescale := struct { 612 desiredTimescale := struct {
599 Unk1 float32 613 Unk1 float32 `json:"unk_1"`
600 Unk2 float32 614 Unk2 float32 `json:"unk_2"`
601 Unk3 uint8 615 Unk3 uint8 `json:"unk_3"`
602 Unk4 float32 616 Unk4 float32 `json:"unk_4"`
603 }{ 617 }{
604 Unk1: reader.TryReadFloat32(), 618 Unk1: reader.TryReadFloat32(),
605 Unk2: reader.TryReadFloat32(), 619 Unk2: reader.TryReadFloat32(),
@@ -607,49 +621,52 @@ func (svcUserMessage *SvcUserMessage) parseDesiredTimescale(reader *bitreader.Re
607 Unk4: reader.TryReadFloat32(), 621 Unk4: reader.TryReadFloat32(),
608 } 622 }
609 svcUserMessage.Data = desiredTimescale 623 svcUserMessage.Data = desiredTimescale
610 writer.TempAppendLine("\t\t\tUnk1: %f", desiredTimescale.Unk1) 624 demo.Writer.TempAppendLine("\t\t\tUnk1: %f", desiredTimescale.Unk1)
611 writer.TempAppendLine("\t\t\tUnk2: %f", desiredTimescale.Unk2) 625 demo.Writer.TempAppendLine("\t\t\tUnk2: %f", desiredTimescale.Unk2)
612 writer.TempAppendLine("\t\t\tUnk3: %d", desiredTimescale.Unk3) 626 demo.Writer.TempAppendLine("\t\t\tUnk3: %d", desiredTimescale.Unk3)
613 writer.TempAppendLine("\t\t\tUnk4: %f", desiredTimescale.Unk4) 627 demo.Writer.TempAppendLine("\t\t\tUnk4: %f", desiredTimescale.Unk4)
614} 628}
615 629
616func (svcUserMessage *SvcUserMessage) parseMpMapCompleted(reader *bitreader.Reader) { 630func (svcUserMessage *SvcUserMessage) parseMpMapCompleted(reader *bitreader.Reader, demo *types.Demo) {
617 mpMapCompleted := struct { 631 mpMapCompleted := struct {
618 Branch uint8 632 Branch uint8 `json:"branch"`
619 Level uint8 633 Level uint8 `json:"level"`
620 }{ 634 }{
621 Branch: reader.TryReadUInt8(), 635 Branch: reader.TryReadUInt8(),
622 Level: reader.TryReadUInt8(), 636 Level: reader.TryReadUInt8(),
623 } 637 }
624 svcUserMessage.Data = mpMapCompleted 638 svcUserMessage.Data = mpMapCompleted
625 writer.TempAppendLine("\t\t\tBranch: %d", mpMapCompleted.Branch) 639 demo.Writer.TempAppendLine("\t\t\tBranch: %d", mpMapCompleted.Branch)
626 writer.TempAppendLine("\t\t\tLevel: %d", mpMapCompleted.Level) 640 demo.Writer.TempAppendLine("\t\t\tLevel: %d", mpMapCompleted.Level)
627} 641}
628 642
629func (svcUserMessage *SvcUserMessage) parseMpMapIncomplete(reader *bitreader.Reader) {} 643func (svcUserMessage *SvcUserMessage) parseMpMapIncomplete(reader *bitreader.Reader, demo *types.Demo) {
644}
630 645
631func (svcUserMessage *SvcUserMessage) parseMpTauntEarned(reader *bitreader.Reader) { 646func (svcUserMessage *SvcUserMessage) parseMpTauntEarned(reader *bitreader.Reader, demo *types.Demo) {
632 mpTauntEarned := struct { 647 mpTauntEarned := struct {
633 TauntName string 648 TauntName string `json:"taunt_name"`
634 AwardSilently bool 649 AwardSilently bool `json:"award_silently"`
635 }{ 650 }{
636 TauntName: reader.TryReadString(), 651 TauntName: reader.TryReadString(),
637 AwardSilently: reader.TryReadBool(), 652 AwardSilently: reader.TryReadBool(),
638 } 653 }
639 svcUserMessage.Data = mpTauntEarned 654 svcUserMessage.Data = mpTauntEarned
640 writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntEarned.TauntName) 655 demo.Writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntEarned.TauntName)
641 writer.TempAppendLine("\t\t\tAward Silently: %t", mpTauntEarned.AwardSilently) 656 demo.Writer.TempAppendLine("\t\t\tAward Silently: %t", mpTauntEarned.AwardSilently)
642} 657}
643 658
644func (svcUserMessage *SvcUserMessage) parseMpTauntLocked(reader *bitreader.Reader) { 659func (svcUserMessage *SvcUserMessage) parseMpTauntLocked(reader *bitreader.Reader, demo *types.Demo) {
645 mpTauntLocked := struct{ TauntName string }{ 660 mpTauntLocked := struct {
661 TauntName string `json:"taunt_name"`
662 }{
646 TauntName: reader.TryReadString(), 663 TauntName: reader.TryReadString(),
647 } 664 }
648 svcUserMessage.Data = mpTauntLocked 665 svcUserMessage.Data = mpTauntLocked
649 writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntLocked.TauntName) 666 demo.Writer.TempAppendLine("\t\t\tTaunt Name: %s", mpTauntLocked.TauntName)
650} 667}
651 668
652func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Reader) { 669func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Reader, demo *types.Demo) {
653 type PortalFizzleType int8 670 type PortalFizzleType int8
654 const ( 671 const (
655 PortalFizzleSuccess PortalFizzleType = iota // Placed fine (no fizzle) 672 PortalFizzleSuccess PortalFizzleType = iota // Placed fine (no fizzle)
@@ -693,13 +710,13 @@ func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Rea
693 } 710 }
694 } 711 }
695 portalFxSurface := struct { 712 portalFxSurface := struct {
696 PortalEnt uint16 713 PortalEnt uint16 `json:"portal_ent"`
697 OwnerEnt uint16 714 OwnerEnt uint16 `json:"owner_ent"`
698 Team uint8 715 Team uint8 `json:"team"`
699 PortalNum uint8 716 PortalNum uint8 `json:"portal_num"`
700 Effect uint8 717 Effect uint8 `json:"effect"`
701 Origin []float32 718 Origin []float32 `json:"origin"`
702 Angles []float32 719 Angles []float32 `json:"angles"`
703 }{ 720 }{
704 PortalEnt: reader.TryReadUInt16(), 721 PortalEnt: reader.TryReadUInt16(),
705 OwnerEnt: reader.TryReadUInt16(), 722 OwnerEnt: reader.TryReadUInt16(),
@@ -743,23 +760,23 @@ func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Rea
743 } 760 }
744 svcUserMessage.Data = portalFxSurface 761 svcUserMessage.Data = portalFxSurface
745 _ = getPortalFizzleType(PortalFizzleType(2)) 762 _ = getPortalFizzleType(PortalFizzleType(2))
746 writer.TempAppendLine("\t\t\tPortal Entity: %d", portalFxSurface.PortalEnt) 763 demo.Writer.TempAppendLine("\t\t\tPortal Entity: %d", portalFxSurface.PortalEnt)
747 writer.TempAppendLine("\t\t\tOwner Entity: %d", portalFxSurface.OwnerEnt) 764 demo.Writer.TempAppendLine("\t\t\tOwner Entity: %d", portalFxSurface.OwnerEnt)
748 writer.TempAppendLine("\t\t\tTeam: %d", portalFxSurface.Team) 765 demo.Writer.TempAppendLine("\t\t\tTeam: %d", portalFxSurface.Team)
749 writer.TempAppendLine("\t\t\tPortal Number: %d", portalFxSurface.PortalNum) 766 demo.Writer.TempAppendLine("\t\t\tPortal Number: %d", portalFxSurface.PortalNum)
750 writer.TempAppendLine("\t\t\tEffect: %s", getPortalFizzleType(PortalFizzleType(portalFxSurface.Effect))) 767 demo.Writer.TempAppendLine("\t\t\tEffect: %s", getPortalFizzleType(PortalFizzleType(portalFxSurface.Effect)))
751 writer.TempAppendLine("\t\t\tOrigin: %v", portalFxSurface.Origin) 768 demo.Writer.TempAppendLine("\t\t\tOrigin: %v", portalFxSurface.Origin)
752 writer.TempAppendLine("\t\t\tAngles: %v", portalFxSurface.Angles) 769 demo.Writer.TempAppendLine("\t\t\tAngles: %v", portalFxSurface.Angles)
753} 770}
754 771
755func (svcUserMessage *SvcUserMessage) parsePaintWorld(reader *bitreader.Reader) { 772func (svcUserMessage *SvcUserMessage) parsePaintWorld(reader *bitreader.Reader, demo *types.Demo) {
756 paintWorld := struct { 773 paintWorld := struct {
757 Type uint8 774 Type uint8 `json:"type"`
758 EHandle uint32 775 EHandle uint32 `json:"e_handle"`
759 UnkHf1 float32 776 UnkHf1 float32 `json:"unk_hf_1"`
760 UnkHf2 float32 777 UnkHf2 float32 `json:"unk_hf_2"`
761 Center []float32 778 Center []float32 `json:"center"`
762 Positions [][]float32 779 Positions [][]float32 `json:"positions"`
763 }{ 780 }{
764 Type: reader.TryReadUInt8(), 781 Type: reader.TryReadUInt8(),
765 EHandle: reader.TryReadUInt32(), 782 EHandle: reader.TryReadUInt32(),
@@ -775,37 +792,37 @@ func (svcUserMessage *SvcUserMessage) parsePaintWorld(reader *bitreader.Reader)
775 paintWorld.Positions[i] = []float32{paintWorld.Center[0] + float32(reader.TryReadSInt16()), paintWorld.Center[1] + float32(reader.TryReadSInt16()), paintWorld.Center[2] + float32(reader.TryReadSInt16())} 792 paintWorld.Positions[i] = []float32{paintWorld.Center[0] + float32(reader.TryReadSInt16()), paintWorld.Center[1] + float32(reader.TryReadSInt16()), paintWorld.Center[2] + float32(reader.TryReadSInt16())}
776 } 793 }
777 svcUserMessage.Data = paintWorld 794 svcUserMessage.Data = paintWorld
778 writer.TempAppendLine("\t\t\tType: %d", paintWorld.Type) 795 demo.Writer.TempAppendLine("\t\t\tType: %d", paintWorld.Type)
779 writer.TempAppendLine("\t\t\tEHandle: %d", paintWorld.EHandle) 796 demo.Writer.TempAppendLine("\t\t\tEHandle: %d", paintWorld.EHandle)
780 writer.TempAppendLine("\t\t\tUnkHf1: %f", paintWorld.UnkHf1) 797 demo.Writer.TempAppendLine("\t\t\tUnkHf1: %f", paintWorld.UnkHf1)
781 writer.TempAppendLine("\t\t\tUnkHf2: %f", paintWorld.UnkHf2) 798 demo.Writer.TempAppendLine("\t\t\tUnkHf2: %f", paintWorld.UnkHf2)
782 writer.TempAppendLine("\t\t\tCenter: %v", paintWorld.Center) 799 demo.Writer.TempAppendLine("\t\t\tCenter: %v", paintWorld.Center)
783 writer.TempAppendLine("\t\t\tPositions: %v", paintWorld.Positions) 800 demo.Writer.TempAppendLine("\t\t\tPositions: %v", paintWorld.Positions)
784} 801}
785 802
786func (svcUserMessage *SvcUserMessage) parseTransitionFade(reader *bitreader.Reader) { 803func (svcUserMessage *SvcUserMessage) parseTransitionFade(reader *bitreader.Reader, demo *types.Demo) {
787 transitionFade := struct { 804 transitionFade := struct {
788 Seconds float32 805 Seconds float32 `json:"seconds"`
789 }{ 806 }{
790 Seconds: reader.TryReadFloat32(), 807 Seconds: reader.TryReadFloat32(),
791 } 808 }
792 svcUserMessage.Data = transitionFade 809 svcUserMessage.Data = transitionFade
793 writer.TempAppendLine("\t\t\tSeconds: %f", transitionFade.Seconds) 810 demo.Writer.TempAppendLine("\t\t\tSeconds: %f", transitionFade.Seconds)
794} 811}
795 812
796func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreader.Reader) { 813func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreader.Reader, demo *types.Demo) {
797 scoreboardTempUpdate := struct { 814 scoreboardTempUpdate := struct {
798 NumPortals int32 815 NumPortals int32 `json:"num_portals"`
799 TimeTaken int32 816 TimeTaken int32 `json:"time_taken"`
800 }{ 817 }{
801 NumPortals: reader.TryReadSInt32(), 818 NumPortals: reader.TryReadSInt32(),
802 TimeTaken: reader.TryReadSInt32(), 819 TimeTaken: reader.TryReadSInt32(),
803 } 820 }
804 svcUserMessage.Data = scoreboardTempUpdate 821 svcUserMessage.Data = scoreboardTempUpdate
805 writer.TempAppendLine("\t\t\tPortal Count: %d", scoreboardTempUpdate.NumPortals) 822 demo.Writer.TempAppendLine("\t\t\tPortal Count: %d", scoreboardTempUpdate.NumPortals)
806 writer.TempAppendLine("\t\t\tTime Taken: %.2f", float32(scoreboardTempUpdate.TimeTaken)/100.0) 823 demo.Writer.TempAppendLine("\t\t\tTime Taken: %.2f", float32(scoreboardTempUpdate.TimeTaken)/100.0)
807 824
808 writer.TempAppendLine("\t\t\tTicks Taken: %d", int(math.Round(float64((float32(scoreboardTempUpdate.TimeTaken)/100.0)/float32(1.0/60.0))))) 825 demo.Writer.TempAppendLine("\t\t\tTicks Taken: %d", int(math.Round(float64((float32(scoreboardTempUpdate.TimeTaken)/100.0)/float32(1.0/60.0)))))
809} 826}
810 827
811type UserMessageType uint8 828type UserMessageType uint8
diff --git a/pkg/messages/types/svcVoiceData.go b/pkg/messages/types/svcVoiceData.go
index 30436eb..dbc07a6 100644
--- a/pkg/messages/types/svcVoiceData.go
+++ b/pkg/messages/types/svcVoiceData.go
@@ -2,17 +2,17 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcVoiceData struct { 8type SvcVoiceData struct {
9 FromClient uint8 9 FromClient uint8 `json:"from_client"`
10 Proximity bool 10 Proximity bool `json:"proximity"`
11 Length int16 11 Length int16 `json:"length"`
12 Data []byte 12 Data []byte `json:"data"`
13} 13}
14 14
15func ParseSvcVoiceData(reader *bitreader.Reader) SvcVoiceData { 15func ParseSvcVoiceData(reader *bitreader.Reader, demo *types.Demo) SvcVoiceData {
16 svcVoiceData := SvcVoiceData{ 16 svcVoiceData := SvcVoiceData{
17 FromClient: reader.TryReadUInt8(), 17 FromClient: reader.TryReadUInt8(),
18 } 18 }
@@ -21,8 +21,8 @@ func ParseSvcVoiceData(reader *bitreader.Reader) SvcVoiceData {
21 svcVoiceData.Proximity = true 21 svcVoiceData.Proximity = true
22 } 22 }
23 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length)) 23 svcVoiceData.Data = reader.TryReadBitsToSlice(uint64(svcVoiceData.Length))
24 writer.TempAppendLine("\t\tFrom Client: %d", svcVoiceData.FromClient) 24 demo.Writer.TempAppendLine("\t\tFrom Client: %d", svcVoiceData.FromClient)
25 writer.TempAppendLine("\t\tProximity: %t", svcVoiceData.Proximity) 25 demo.Writer.TempAppendLine("\t\tProximity: %t", svcVoiceData.Proximity)
26 writer.TempAppendLine("\t\tData: %v", svcVoiceData.Data) 26 demo.Writer.TempAppendLine("\t\tData: %v", svcVoiceData.Data)
27 return svcVoiceData 27 return svcVoiceData
28} 28}
diff --git a/pkg/messages/types/svcVoiceInit.go b/pkg/messages/types/svcVoiceInit.go
index bdab51a..1baa971 100644
--- a/pkg/messages/types/svcVoiceInit.go
+++ b/pkg/messages/types/svcVoiceInit.go
@@ -2,16 +2,16 @@ package messages
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type SvcVoiceInit struct { 8type SvcVoiceInit struct {
9 Codec string 9 Codec string `json:"codec"`
10 Quality uint8 10 Quality uint8 `json:"quality"`
11 SampleRate int32 11 SampleRate int32 `json:"sample_rate"`
12} 12}
13 13
14func ParseSvcVoiceInit(reader *bitreader.Reader) SvcVoiceInit { 14func ParseSvcVoiceInit(reader *bitreader.Reader, demo *types.Demo) SvcVoiceInit {
15 svcVoiceInit := SvcVoiceInit{ 15 svcVoiceInit := SvcVoiceInit{
16 Codec: reader.TryReadString(), 16 Codec: reader.TryReadString(),
17 Quality: reader.TryReadUInt8(), 17 Quality: reader.TryReadUInt8(),
@@ -25,8 +25,8 @@ func ParseSvcVoiceInit(reader *bitreader.Reader) SvcVoiceInit {
25 svcVoiceInit.SampleRate = 11025 25 svcVoiceInit.SampleRate = 11025
26 } 26 }
27 } 27 }
28 writer.TempAppendLine("\t\tCodec: %s", svcVoiceInit.Codec) 28 demo.Writer.TempAppendLine("\t\tCodec: %s", svcVoiceInit.Codec)
29 writer.TempAppendLine("\t\tQuality: %d", svcVoiceInit.Quality) 29 demo.Writer.TempAppendLine("\t\tQuality: %d", svcVoiceInit.Quality)
30 writer.TempAppendLine("\t\tSample Rate: %d", svcVoiceInit.SampleRate) 30 demo.Writer.TempAppendLine("\t\tSample Rate: %d", svcVoiceInit.SampleRate)
31 return svcVoiceInit 31 return svcVoiceInit
32} 32}