aboutsummaryrefslogtreecommitdiff
path: root/pkg/classes/stringTables.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/classes/stringTables.go')
-rw-r--r--pkg/classes/stringTables.go128
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
11type StringTables struct { 11type StringTables struct {
12 Size int32 12 Size int32 `json:"size"`
13 Data []StringTable 13 Data []StringTable `json:"data"`
14} 14}
15 15
16type StringTable struct { 16type 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
22type StringTableClass struct { 22type StringTableClass struct {
23 Name string 23 Name string `json:"name"`
24 Data string 24 Data string `json:"data"`
25} 25}
26type StringTableEntry struct { 26type StringTableEntry struct {
27 Name string 27 Name string `json:"name"`
28 EntryData any 28 EntryData any `json:"entry_data"`
29} 29}
30 30
31func (stringTables *StringTables) ParseStringTables(reader *bitreader.Reader) { 31func (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
44func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { 44func (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
77func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) { 77func (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
86func (stringTableEntry *StringTableEntry) Parse(tableName string, reader *bitreader.Reader) { 86func (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
120func (stringTableEntry *StringTableEntry) ParseUserInfo(reader *bitreader.Reader) { 120func (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
167func (stringTableEntry *StringTableEntry) ParseServerQueryInfo(reader *bitreader.Reader) { 167func (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
175func (stringTableEntry *StringTableEntry) ParseGamesRulesCreation(reader *bitreader.Reader) { 175func (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
183func (stringTableEntry *StringTableEntry) ParseInfoPanel(reader *bitreader.Reader) { 183func (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
191func (stringTableEntry *StringTableEntry) ParseLightStyles(reader *bitreader.Reader) { 191func (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
208func (stringTableEntry *StringTableEntry) ParsePrecacheData(reader *bitreader.Reader) { 208func (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
231func (stringTableEntry *StringTableEntry) ParseUnknown(reader *bitreader.Reader) { 231func (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
240const ( 240const (