aboutsummaryrefslogtreecommitdiff
path: root/pkg/messages/types/svcUserMessage.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/messages/types/svcUserMessage.go')
-rw-r--r--pkg/messages/types/svcUserMessage.go495
1 files changed, 256 insertions, 239 deletions
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