diff options
Diffstat (limited to 'pkg/messages/types/svcUserMessage.go')
| -rw-r--r-- | pkg/messages/types/svcUserMessage.go | 495 |
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 | ||
| 11 | type SvcUserMessage struct { | 11 | type 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 | ||
| 17 | func ParseSvcUserMessage(reader *bitreader.Reader) SvcUserMessage { | 17 | func 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 | ||
| 90 | func (svcUserMessage *SvcUserMessage) parseGeiger(reader *bitreader.Reader) { | 90 | func (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 | ||
| 98 | func (svcUserMessage *SvcUserMessage) parseTrain(reader *bitreader.Reader) { | 98 | func (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 | ||
| 106 | func (svcUserMessage *SvcUserMessage) parseHUDText(reader *bitreader.Reader) { | 106 | func (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 | ||
| 114 | func (svcUserMessage *SvcUserMessage) parseSayText(reader *bitreader.Reader) { | 114 | func (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 | ||
| 130 | func (svcUserMessage *SvcUserMessage) parseSayText2(reader *bitreader.Reader) { | 130 | func (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 | ||
| 151 | func (svcUserMessage *SvcUserMessage) parseTextMsg(reader *bitreader.Reader) { | 151 | func (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 | ||
| 170 | func (svcUserMessage *SvcUserMessage) parseHUDMsg(reader *bitreader.Reader) { | 170 | func (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 | ||
| 236 | func (svcUserMessage *SvcUserMessage) parseResetHUD(reader *bitreader.Reader) { | 246 | func (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 | ||
| 244 | func (svcUserMessage *SvcUserMessage) parseShake(reader *bitreader.Reader) { | 254 | func (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 | ||
| 290 | func (svcUserMessage *SvcUserMessage) parseFade(reader *bitreader.Reader) { | 300 | func (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 | ||
| 343 | func (svcUserMessage *SvcUserMessage) parseVguiMenu(reader *bitreader.Reader) { | 353 | func (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 | ||
| 369 | func (svcUserMessage *SvcUserMessage) parseRumble(reader *bitreader.Reader) { | 379 | func (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 | ||
| 460 | func (svcUserMessage *SvcUserMessage) parseBattery(reader *bitreader.Reader) { | 470 | func (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 | ||
| 468 | func (svcUserMessage *SvcUserMessage) parseDamage(reader *bitreader.Reader) { | 478 | func (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 | ||
| 487 | func (svcUserMessage *SvcUserMessage) parseVoiceMask(reader *bitreader.Reader) { | 497 | func (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 | ||
| 520 | func (svcUserMessage *SvcUserMessage) parseCloseCaption(reader *bitreader.Reader) { | 530 | func (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 | ||
| 560 | func (svcUserMessage *SvcUserMessage) parseKeyHintText(reader *bitreader.Reader) { | 570 | func (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 | ||
| 573 | func (svcUserMessage *SvcUserMessage) parseLogoTimeMsg(reader *bitreader.Reader) { | 583 | func (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 | ||
| 581 | func (svcUserMessage *SvcUserMessage) parseAchivementEvent(reader *bitreader.Reader) { | 593 | func (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 | ||
| 589 | func (svcUserMessage *SvcUserMessage) parseCurrentTimescale(reader *bitreader.Reader) { | 601 | func (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 | ||
| 597 | func (svcUserMessage *SvcUserMessage) parseDesiredTimescale(reader *bitreader.Reader) { | 611 | func (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 | ||
| 616 | func (svcUserMessage *SvcUserMessage) parseMpMapCompleted(reader *bitreader.Reader) { | 630 | func (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 | ||
| 629 | func (svcUserMessage *SvcUserMessage) parseMpMapIncomplete(reader *bitreader.Reader) {} | 643 | func (svcUserMessage *SvcUserMessage) parseMpMapIncomplete(reader *bitreader.Reader, demo *types.Demo) { |
| 644 | } | ||
| 630 | 645 | ||
| 631 | func (svcUserMessage *SvcUserMessage) parseMpTauntEarned(reader *bitreader.Reader) { | 646 | func (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 | ||
| 644 | func (svcUserMessage *SvcUserMessage) parseMpTauntLocked(reader *bitreader.Reader) { | 659 | func (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 | ||
| 652 | func (svcUserMessage *SvcUserMessage) parsePortalFxSurface(reader *bitreader.Reader) { | 669 | func (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 | ||
| 755 | func (svcUserMessage *SvcUserMessage) parsePaintWorld(reader *bitreader.Reader) { | 772 | func (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 | ||
| 786 | func (svcUserMessage *SvcUserMessage) parseTransitionFade(reader *bitreader.Reader) { | 803 | func (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 | ||
| 796 | func (svcUserMessage *SvcUserMessage) parseScoreboardTempUpdate(reader *bitreader.Reader) { | 813 | func (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 | ||
| 811 | type UserMessageType uint8 | 828 | type UserMessageType uint8 |