diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-06-15 13:58:30 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-15 13:58:30 +0300 |
| commit | 77e4b066cb8d506b4bc944ab4eb2d6e4679e2202 (patch) | |
| tree | 1d549eca619ed36cb881e487cb054c4643ac8376 /pkg/classes/stringTables.go | |
| parent | change project name to sdp.go (diff) | |
| download | sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.gz sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.bz2 sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.zip | |
enable multithreading with goroutines (#20)
Diffstat (limited to 'pkg/classes/stringTables.go')
| -rw-r--r-- | pkg/classes/stringTables.go | 128 |
1 files changed, 64 insertions, 64 deletions
diff --git a/pkg/classes/stringTables.go b/pkg/classes/stringTables.go index 7848b1c..6e1510c 100644 --- a/pkg/classes/stringTables.go +++ b/pkg/classes/stringTables.go | |||
| @@ -5,58 +5,58 @@ import ( | |||
| 5 | "strings" | 5 | "strings" |
| 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 StringTables struct { | 11 | type StringTables struct { |
| 12 | Size int32 | 12 | Size int32 `json:"size"` |
| 13 | Data []StringTable | 13 | Data []StringTable `json:"data"` |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | type StringTable struct { | 16 | type StringTable struct { |
| 17 | Name string | 17 | Name string `json:"name"` |
| 18 | TableEntries []StringTableEntry | 18 | TableEntries []StringTableEntry `json:"table_entries"` |
| 19 | Classes []StringTableClass | 19 | Classes []StringTableClass `json:"classes"` |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | type StringTableClass struct { | 22 | type StringTableClass struct { |
| 23 | Name string | 23 | Name string `json:"name"` |
| 24 | Data string | 24 | Data string `json:"data"` |
| 25 | } | 25 | } |
| 26 | type StringTableEntry struct { | 26 | type StringTableEntry struct { |
| 27 | Name string | 27 | Name string `json:"name"` |
| 28 | EntryData any | 28 | EntryData any `json:"entry_data"` |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | func (stringTables *StringTables) ParseStringTables(reader *bitreader.Reader) { | 31 | func (stringTables *StringTables) ParseStringTables(reader *bitreader.Reader, demo *types.Demo) { |
| 32 | stringTables.Size = reader.TryReadSInt32() | 32 | stringTables.Size = reader.TryReadSInt32() |
| 33 | stringTableReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(uint64(stringTables.Size)), true) | 33 | stringTableReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(uint64(stringTables.Size)), true) |
| 34 | tableCount := stringTableReader.TryReadBits(8) | 34 | tableCount := stringTableReader.TryReadBits(8) |
| 35 | tables := make([]StringTable, tableCount) | 35 | tables := make([]StringTable, tableCount) |
| 36 | for i := 0; i < int(tableCount); i++ { | 36 | for i := 0; i < int(tableCount); i++ { |
| 37 | var table StringTable | 37 | var table StringTable |
| 38 | table.ParseStream(stringTableReader) | 38 | table.ParseStream(stringTableReader, demo) |
| 39 | tables[i] = table | 39 | tables[i] = table |
| 40 | } | 40 | } |
| 41 | stringTables.Data = tables | 41 | stringTables.Data = tables |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { | 44 | func (stringTable *StringTable) ParseStream(reader *bitreader.Reader, demo *types.Demo) { |
| 45 | stringTable.Name = reader.TryReadString() | 45 | stringTable.Name = reader.TryReadString() |
| 46 | entryCount := reader.TryReadBits(16) | 46 | entryCount := reader.TryReadBits(16) |
| 47 | writer.AppendLine("\tTable Name: %s", stringTable.Name) | 47 | demo.Writer.AppendLine("\tTable Name: %s", stringTable.Name) |
| 48 | stringTable.TableEntries = make([]StringTableEntry, entryCount) | 48 | stringTable.TableEntries = make([]StringTableEntry, entryCount) |
| 49 | 49 | ||
| 50 | for i := 0; i < int(entryCount); i++ { | 50 | for i := 0; i < int(entryCount); i++ { |
| 51 | var entry StringTableEntry | 51 | var entry StringTableEntry |
| 52 | entry.Parse(stringTable.Name, reader) | 52 | entry.Parse(stringTable.Name, reader, demo) |
| 53 | stringTable.TableEntries[i] = entry | 53 | stringTable.TableEntries[i] = entry |
| 54 | } | 54 | } |
| 55 | if entryCount != 0 { | 55 | if entryCount != 0 { |
| 56 | writer.AppendLine("\t\t%d Table Entries:", entryCount) | 56 | demo.Writer.AppendLine("\t\t%d Table Entries:", entryCount) |
| 57 | writer.AppendOutputFromTemp() | 57 | demo.Writer.AppendOutputFromTemp() |
| 58 | } else { | 58 | } else { |
| 59 | writer.AppendLine("\t\tNo Table Entries") | 59 | demo.Writer.AppendLine("\t\tNo Table Entries") |
| 60 | } | 60 | } |
| 61 | if reader.TryReadBool() { | 61 | if reader.TryReadBool() { |
| 62 | classCount := reader.TryReadBits(16) | 62 | classCount := reader.TryReadBits(16) |
| @@ -64,28 +64,28 @@ func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { | |||
| 64 | 64 | ||
| 65 | for i := 0; i < int(classCount); i++ { | 65 | for i := 0; i < int(classCount); i++ { |
| 66 | var class StringTableClass | 66 | var class StringTableClass |
| 67 | class.Parse(reader) | 67 | class.Parse(reader, demo) |
| 68 | stringTable.Classes[i] = class | 68 | stringTable.Classes[i] = class |
| 69 | } | 69 | } |
| 70 | writer.AppendLine("\t\t%d Classes:", classCount) | 70 | demo.Writer.AppendLine("\t\t%d Classes:", classCount) |
| 71 | writer.AppendOutputFromTemp() | 71 | demo.Writer.AppendOutputFromTemp() |
| 72 | } else { | 72 | } else { |
| 73 | writer.AppendLine("\t\tNo Class Entries") | 73 | demo.Writer.AppendLine("\t\tNo Class Entries") |
| 74 | } | 74 | } |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) { | 77 | func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader, demo *types.Demo) { |
| 78 | stringTableClass.Name = reader.TryReadString() | 78 | stringTableClass.Name = reader.TryReadString() |
| 79 | writer.TempAppendLine("\t\t\tName: %s", stringTableClass.Name) | 79 | demo.Writer.TempAppendLine("\t\t\tName: %s", stringTableClass.Name) |
| 80 | if reader.TryReadBool() { | 80 | if reader.TryReadBool() { |
| 81 | stringTableClass.Data = reader.TryReadStringLength(uint64(reader.TryReadUInt16())) | 81 | stringTableClass.Data = reader.TryReadStringLength(uint64(reader.TryReadUInt16())) |
| 82 | writer.TempAppendLine("\t\t\tData: %s", stringTableClass.Data) | 82 | demo.Writer.TempAppendLine("\t\t\tData: %s", stringTableClass.Data) |
| 83 | } | 83 | } |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | func (stringTableEntry *StringTableEntry) Parse(tableName string, reader *bitreader.Reader) { | 86 | func (stringTableEntry *StringTableEntry) Parse(tableName string, reader *bitreader.Reader, demo *types.Demo) { |
| 87 | stringTableEntry.Name = reader.TryReadString() | 87 | stringTableEntry.Name = reader.TryReadString() |
| 88 | writer.TempAppendLine("\t\t\tName: %s", stringTableEntry.Name) | 88 | demo.Writer.TempAppendLine("\t\t\tName: %s", stringTableEntry.Name) |
| 89 | if reader.TryReadBool() { | 89 | if reader.TryReadBool() { |
| 90 | byteLen, err := reader.ReadBits(16) | 90 | byteLen, err := reader.ReadBits(16) |
| 91 | if err != nil { | 91 | if err != nil { |
| @@ -94,30 +94,30 @@ func (stringTableEntry *StringTableEntry) Parse(tableName string, reader *bitrea | |||
| 94 | stringTableEntryReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(byteLen), true) | 94 | stringTableEntryReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(byteLen), true) |
| 95 | switch tableName { | 95 | switch tableName { |
| 96 | case StringTableUserInfo: | 96 | case StringTableUserInfo: |
| 97 | stringTableEntry.ParseUserInfo(stringTableEntryReader) | 97 | stringTableEntry.ParseUserInfo(stringTableEntryReader, demo) |
| 98 | case StringTableServerQueryInfo: | 98 | case StringTableServerQueryInfo: |
| 99 | stringTableEntry.ParseServerQueryInfo(stringTableEntryReader) | 99 | stringTableEntry.ParseServerQueryInfo(stringTableEntryReader, demo) |
| 100 | case StringTableGameRulesCreation: | 100 | case StringTableGameRulesCreation: |
| 101 | stringTableEntry.ParseGamesRulesCreation(stringTableEntryReader) | 101 | stringTableEntry.ParseGamesRulesCreation(stringTableEntryReader, demo) |
| 102 | case StringTableInfoPanel: | 102 | case StringTableInfoPanel: |
| 103 | stringTableEntry.ParseInfoPanel(stringTableEntryReader) | 103 | stringTableEntry.ParseInfoPanel(stringTableEntryReader, demo) |
| 104 | case StringTableLightStyles: | 104 | case StringTableLightStyles: |
| 105 | stringTableEntry.ParseLightStyles(stringTableEntryReader) | 105 | stringTableEntry.ParseLightStyles(stringTableEntryReader, demo) |
| 106 | case StringTableModelPreCache: | 106 | case StringTableModelPreCache: |
| 107 | stringTableEntry.ParsePrecacheData(stringTableEntryReader) | 107 | stringTableEntry.ParsePrecacheData(stringTableEntryReader, demo) |
| 108 | case StringTableGenericPreCache: | 108 | case StringTableGenericPreCache: |
| 109 | stringTableEntry.ParsePrecacheData(stringTableEntryReader) | 109 | stringTableEntry.ParsePrecacheData(stringTableEntryReader, demo) |
| 110 | case StringTableSoundPreCache: | 110 | case StringTableSoundPreCache: |
| 111 | stringTableEntry.ParsePrecacheData(stringTableEntryReader) | 111 | stringTableEntry.ParsePrecacheData(stringTableEntryReader, demo) |
| 112 | case StringTableDecalPreCache: | 112 | case StringTableDecalPreCache: |
| 113 | stringTableEntry.ParsePrecacheData(stringTableEntryReader) | 113 | stringTableEntry.ParsePrecacheData(stringTableEntryReader, demo) |
| 114 | default: | 114 | default: |
| 115 | stringTableEntry.ParseUnknown(stringTableEntryReader) | 115 | stringTableEntry.ParseUnknown(stringTableEntryReader, demo) |
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | func (stringTableEntry *StringTableEntry) ParseUserInfo(reader *bitreader.Reader) { | 120 | func (stringTableEntry *StringTableEntry) ParseUserInfo(reader *bitreader.Reader, demo *types.Demo) { |
| 121 | const SignedGuidLen int32 = 32 | 121 | const SignedGuidLen int32 = 32 |
| 122 | const MaxPlayerNameLength int32 = 32 | 122 | const MaxPlayerNameLength int32 = 32 |
| 123 | userInfo := struct { | 123 | userInfo := struct { |
| @@ -147,48 +147,48 @@ func (stringTableEntry *StringTableEntry) ParseUserInfo(reader *bitreader.Reader | |||
| 147 | userInfo.FilesDownloaded = reader.TryReadUInt8() | 147 | userInfo.FilesDownloaded = reader.TryReadUInt8() |
| 148 | reader.SkipBytes(3) | 148 | reader.SkipBytes(3) |
| 149 | stringTableEntry.EntryData = userInfo | 149 | stringTableEntry.EntryData = userInfo |
| 150 | writer.TempAppendLine("\t\t\t\tSteam Account ID: %d", uint32((userInfo.SteamID&0xFFFFFFFF00000000)|userInfo.SteamID)) | 150 | demo.Writer.TempAppendLine("\t\t\t\tSteam Account ID: %d", uint32((userInfo.SteamID&0xFFFFFFFF00000000)|userInfo.SteamID)) |
| 151 | writer.TempAppendLine("\t\t\t\tSteam Account Instance: %d", uint32(userInfo.SteamID>>32)&0x000FFFFF) | 151 | demo.Writer.TempAppendLine("\t\t\t\tSteam Account Instance: %d", uint32(userInfo.SteamID>>32)&0x000FFFFF) |
| 152 | writer.TempAppendLine("\t\t\t\tSteam Account Type: %d", uint32(userInfo.SteamID>>52)&0xF) | 152 | demo.Writer.TempAppendLine("\t\t\t\tSteam Account Type: %d", uint32(userInfo.SteamID>>52)&0xF) |
| 153 | writer.TempAppendLine("\t\t\t\tSteam Account Universe: %d", uint32(userInfo.SteamID>>56)&0xFF) | 153 | demo.Writer.TempAppendLine("\t\t\t\tSteam Account Universe: %d", uint32(userInfo.SteamID>>56)&0xFF) |
| 154 | writer.TempAppendLine("\t\t\t\tName: %s", userInfo.Name) | 154 | demo.Writer.TempAppendLine("\t\t\t\tName: %s", userInfo.Name) |
| 155 | writer.TempAppendLine("\t\t\t\tUser ID: %d", userInfo.UserID) | 155 | demo.Writer.TempAppendLine("\t\t\t\tUser ID: %d", userInfo.UserID) |
| 156 | writer.TempAppendLine("\t\t\t\tGUID: %s", userInfo.GUID) | 156 | demo.Writer.TempAppendLine("\t\t\t\tGUID: %s", userInfo.GUID) |
| 157 | writer.TempAppendLine("\t\t\t\tFriends ID: %d", userInfo.FriendsID) | 157 | demo.Writer.TempAppendLine("\t\t\t\tFriends ID: %d", userInfo.FriendsID) |
| 158 | writer.TempAppendLine("\t\t\t\tFriends Name: %s", userInfo.FriendsName) | 158 | demo.Writer.TempAppendLine("\t\t\t\tFriends Name: %s", userInfo.FriendsName) |
| 159 | writer.TempAppendLine("\t\t\t\tFake Player: %t", userInfo.FakePlayer) | 159 | demo.Writer.TempAppendLine("\t\t\t\tFake Player: %t", userInfo.FakePlayer) |
| 160 | writer.TempAppendLine("\t\t\t\tIs Htlv: %t", userInfo.IsHltv) | 160 | demo.Writer.TempAppendLine("\t\t\t\tIs Htlv: %t", userInfo.IsHltv) |
| 161 | if userInfo.CustomFiles != nil { | 161 | if userInfo.CustomFiles != nil { |
| 162 | writer.TempAppendLine("\t\t\t\tCustom File CRCs: [logo: 0x%d, sounds: 0x%d, models: 0x%d, txt: 0x%d]", userInfo.CustomFiles[0], userInfo.CustomFiles[1], userInfo.CustomFiles[2], userInfo.CustomFiles[3]) | 162 | demo.Writer.TempAppendLine("\t\t\t\tCustom File CRCs: [logo: 0x%d, sounds: 0x%d, models: 0x%d, txt: 0x%d]", userInfo.CustomFiles[0], userInfo.CustomFiles[1], userInfo.CustomFiles[2], userInfo.CustomFiles[3]) |
| 163 | } | 163 | } |
| 164 | writer.TempAppendLine("\t\t\t\tFiles Downloaded: %d", userInfo.FilesDownloaded) | 164 | demo.Writer.TempAppendLine("\t\t\t\tFiles Downloaded: %d", userInfo.FilesDownloaded) |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | func (stringTableEntry *StringTableEntry) ParseServerQueryInfo(reader *bitreader.Reader) { | 167 | func (stringTableEntry *StringTableEntry) ParseServerQueryInfo(reader *bitreader.Reader, demo *types.Demo) { |
| 168 | serverQueryInfo := struct{ Port uint32 }{ | 168 | serverQueryInfo := struct{ Port uint32 }{ |
| 169 | Port: reader.TryReadUInt32(), | 169 | Port: reader.TryReadUInt32(), |
| 170 | } | 170 | } |
| 171 | stringTableEntry.EntryData = serverQueryInfo | 171 | stringTableEntry.EntryData = serverQueryInfo |
| 172 | writer.TempAppendLine("\t\t\t\tPort: %d", serverQueryInfo.Port) | 172 | demo.Writer.TempAppendLine("\t\t\t\tPort: %d", serverQueryInfo.Port) |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | func (stringTableEntry *StringTableEntry) ParseGamesRulesCreation(reader *bitreader.Reader) { | 175 | func (stringTableEntry *StringTableEntry) ParseGamesRulesCreation(reader *bitreader.Reader, demo *types.Demo) { |
| 176 | gamesRulesCreation := struct{ Message string }{ | 176 | gamesRulesCreation := struct{ Message string }{ |
| 177 | Message: reader.TryReadString(), | 177 | Message: reader.TryReadString(), |
| 178 | } | 178 | } |
| 179 | stringTableEntry.EntryData = gamesRulesCreation | 179 | stringTableEntry.EntryData = gamesRulesCreation |
| 180 | writer.TempAppendLine("\t\t\t\tMessage: %s", gamesRulesCreation.Message) | 180 | demo.Writer.TempAppendLine("\t\t\t\tMessage: %s", gamesRulesCreation.Message) |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | func (stringTableEntry *StringTableEntry) ParseInfoPanel(reader *bitreader.Reader) { | 183 | func (stringTableEntry *StringTableEntry) ParseInfoPanel(reader *bitreader.Reader, demo *types.Demo) { |
| 184 | infoPanel := struct{ Message string }{ | 184 | infoPanel := struct{ Message string }{ |
| 185 | Message: reader.TryReadString(), | 185 | Message: reader.TryReadString(), |
| 186 | } | 186 | } |
| 187 | stringTableEntry.EntryData = infoPanel | 187 | stringTableEntry.EntryData = infoPanel |
| 188 | writer.TempAppendLine("\t\t\t\tMessage: %s", infoPanel.Message) | 188 | demo.Writer.TempAppendLine("\t\t\t\tMessage: %s", infoPanel.Message) |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | func (stringTableEntry *StringTableEntry) ParseLightStyles(reader *bitreader.Reader) { | 191 | func (stringTableEntry *StringTableEntry) ParseLightStyles(reader *bitreader.Reader, demo *types.Demo) { |
| 192 | lightStyles := struct{ Values []byte }{} | 192 | lightStyles := struct{ Values []byte }{} |
| 193 | str := reader.TryReadString() | 193 | str := reader.TryReadString() |
| 194 | if len(str) != 0 { | 194 | if len(str) != 0 { |
| @@ -199,13 +199,13 @@ func (stringTableEntry *StringTableEntry) ParseLightStyles(reader *bitreader.Rea | |||
| 199 | } | 199 | } |
| 200 | stringTableEntry.EntryData = lightStyles | 200 | stringTableEntry.EntryData = lightStyles |
| 201 | if lightStyles.Values == nil { | 201 | if lightStyles.Values == nil { |
| 202 | writer.TempAppendLine("\t\t\t\t0 Frames (256)") | 202 | demo.Writer.TempAppendLine("\t\t\t\t0 Frames (256)") |
| 203 | } else { | 203 | } else { |
| 204 | writer.TempAppendLine("\t\t\t\t%d frames: %v", len(lightStyles.Values), lightStyles.Values) | 204 | demo.Writer.TempAppendLine("\t\t\t\t%d frames: %v", len(lightStyles.Values), lightStyles.Values) |
| 205 | } | 205 | } |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | func (stringTableEntry *StringTableEntry) ParsePrecacheData(reader *bitreader.Reader) { | 208 | func (stringTableEntry *StringTableEntry) ParsePrecacheData(reader *bitreader.Reader, demo *types.Demo) { |
| 209 | type PrecacheFlag uint16 | 209 | type PrecacheFlag uint16 |
| 210 | const ( | 210 | const ( |
| 211 | None PrecacheFlag = 0 | 211 | None PrecacheFlag = 0 |
| @@ -225,16 +225,16 @@ func (stringTableEntry *StringTableEntry) ParsePrecacheData(reader *bitreader.Re | |||
| 225 | } | 225 | } |
| 226 | return flagStrings | 226 | return flagStrings |
| 227 | } | 227 | } |
| 228 | writer.TempAppendLine("\t\t\t\tFlags: %v", getFlags(PrecacheFlag(precacheData.Flags))) | 228 | demo.Writer.TempAppendLine("\t\t\t\tFlags: %v", getFlags(PrecacheFlag(precacheData.Flags))) |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | func (stringTableEntry *StringTableEntry) ParseUnknown(reader *bitreader.Reader) { | 231 | func (stringTableEntry *StringTableEntry) ParseUnknown(reader *bitreader.Reader, demo *types.Demo) { |
| 232 | unknown := reader.TryReadBitsToSlice(reader.TryReadRemainingBits()) | 232 | unknown := reader.TryReadBitsToSlice(reader.TryReadRemainingBits()) |
| 233 | binaryString := "" | 233 | binaryString := "" |
| 234 | for _, byteValue := range unknown { | 234 | for _, byteValue := range unknown { |
| 235 | binaryString += fmt.Sprintf("%08b ", byteValue) | 235 | binaryString += fmt.Sprintf("%08b ", byteValue) |
| 236 | } | 236 | } |
| 237 | writer.TempAppendLine("\t\t\t\tUnknown: (%s)", strings.TrimSpace(binaryString)) | 237 | demo.Writer.TempAppendLine("\t\t\t\tUnknown: (%s)", strings.TrimSpace(binaryString)) |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | const ( | 240 | const ( |