Skip to content

Commit 21b17a2

Browse files
committed
fix s1 stringtables
1 parent cfbc213 commit 21b17a2

File tree

2 files changed

+48
-32
lines changed

2 files changed

+48
-32
lines changed

pkg/demoinfocs/parser.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ type sendTableParser interface {
3232
OnPacketEntities(m *msgs2.CSVCMsg_PacketEntities) error
3333
}
3434

35+
type createStringTable struct {
36+
*msgs2.CSVCMsg_CreateStringTable
37+
isS2 bool
38+
s1MaxEntries *int32
39+
}
40+
3541
/*
3642
Parser can parse a CS:GO demo.
3743
Creating a new instance is done via NewParser().
@@ -91,7 +97,7 @@ type parser struct {
9197
triggers map[int]*boundingBoxInformation // Maps entity IDs to triggers (used for bombsites)
9298
gameEventDescs map[int32]*msg.CSVCMsg_GameEventListDescriptorT // Maps game-event IDs to descriptors
9399
grenadeModelIndices map[int]common.EquipmentType // Used to map model indices to grenades (used for grenade projectiles)
94-
stringTables []*msgs2.CSVCMsg_CreateStringTable // Contains all created sendtables, needed when updating them
100+
stringTables []createStringTable // Contains all created sendtables, needed when updating them
95101
delayedEventHandlers []func() // Contains event handlers that need to be executed at the end of a tick (e.g. flash events because FlashDuration isn't updated before that)
96102
}
97103

pkg/demoinfocs/stringtables.go

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -152,23 +152,27 @@ func (p *parser) handleUpdateStringTable(tab *msgs2.CSVCMsg_UpdateStringTable, s
152152
case stNameInstanceBaseline:
153153
// Only handle updates for the above types
154154
// Create fake CreateStringTable and handle it like one of those
155-
p.processStringTable(&msgs2.CSVCMsg_CreateStringTable{
156-
Name: cTab.Name,
157-
NumEntries: tab.NumChangedEntries,
158-
UserDataFixedSize: cTab.UserDataFixedSize,
159-
UserDataSize: cTab.UserDataSize,
160-
UserDataSizeBits: cTab.UserDataSizeBits,
161-
Flags: cTab.Flags,
162-
StringData: tab.StringData,
163-
}, s2)
155+
p.processStringTable(createStringTable{
156+
CSVCMsg_CreateStringTable: &msgs2.CSVCMsg_CreateStringTable{
157+
Name: cTab.Name,
158+
NumEntries: tab.NumChangedEntries,
159+
UserDataFixedSize: cTab.UserDataFixedSize,
160+
UserDataSize: cTab.UserDataSize,
161+
UserDataSizeBits: cTab.UserDataSizeBits,
162+
Flags: cTab.Flags,
163+
StringData: tab.StringData,
164+
},
165+
isS2: s2,
166+
s1MaxEntries: cTab.s1MaxEntries,
167+
})
164168
}
165169
}
166170

167171
func (p *parser) handleUpdateStringTableS2(tab *msgs2.CSVCMsg_UpdateStringTable) {
168172
p.handleUpdateStringTable(tab, true)
169173
}
170174

171-
func (p *parser) handleCreateStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s2 bool) {
175+
func (p *parser) handleCreateStringTable(tab createStringTable) {
172176
defer func() {
173177
p.setError(recoverFromUnexpectedEOF(recover()))
174178
}()
@@ -179,7 +183,7 @@ func (p *parser) handleCreateStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s
179183
case stNameModelPreCache:
180184
fallthrough
181185
case stNameInstanceBaseline:
182-
p.processStringTable(tab, s2)
186+
p.processStringTable(tab)
183187
}
184188

185189
p.stringTables = append(p.stringTables, tab)
@@ -188,23 +192,26 @@ func (p *parser) handleCreateStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s
188192
}
189193

190194
func (p *parser) handleCreateStringTableS2(tab *msgs2.CSVCMsg_CreateStringTable) {
191-
p.handleCreateStringTable(tab, true)
195+
p.handleCreateStringTable(createStringTable{
196+
CSVCMsg_CreateStringTable: tab,
197+
isS2: true,
198+
})
192199
}
193200

194-
func (p *parser) processStringTableS1(tab *msgs2.CSVCMsg_CreateStringTable, br *bit.BitReader) {
201+
func (p *parser) processStringTableS1(tab createStringTable, br *bit.BitReader) {
195202
hist := make([]string, 0)
196203
idx := -1
197204

198-
entryBits := int(math.Ceil(math.Log2(float64(tab.GetNumEntries()))))
205+
nEntryBits := int(math.Ceil(math.Log2(float64(*tab.s1MaxEntries))))
199206

200207
for i := 0; i < int(tab.GetNumEntries()); i++ {
201208
if br.ReadBit() {
202209
idx++
203210
} else {
204-
idx = int(br.ReadInt(entryBits))
211+
idx = int(br.ReadInt(nEntryBits))
205212
}
206213

207-
if idx < 0 || idx >= int(tab.GetNumEntries()) {
214+
if idx < 0 || idx >= int(*tab.s1MaxEntries) {
208215
panic("Something went to shit")
209216
}
210217

@@ -388,7 +395,7 @@ func parseStringTable(buf []byte, numUpdates int32, name string, userDataFixed b
388395
return items
389396
}
390397

391-
func (p *parser) processStringTableS2(tab *msgs2.CSVCMsg_CreateStringTable, br *bit.BitReader) {
398+
func (p *parser) processStringTableS2(tab createStringTable, br *bit.BitReader) {
392399
items := parseStringTable(tab.StringData, tab.GetNumEntries(), tab.GetName(), tab.GetUserDataFixedSize(), tab.GetUserDataSize(), tab.GetFlags())
393400

394401
for _, item := range items {
@@ -409,8 +416,7 @@ func (p *parser) processStringTableS2(tab *msgs2.CSVCMsg_CreateStringTable, br *
409416
}
410417
}
411418

412-
//nolint:funlen,gocognit
413-
func (p *parser) processStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s2 bool) {
419+
func (p *parser) processStringTable(tab createStringTable) {
414420
if tab.GetName() == stNameModelPreCache {
415421
for i := len(p.modelPreCache); i < int(tab.GetNumEntries()); i++ {
416422
p.modelPreCache = append(p.modelPreCache, "")
@@ -419,6 +425,7 @@ func (p *parser) processStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s2 boo
419425

420426
if tab.GetDataCompressed() {
421427
tmp := make([]byte, tab.GetUncompressedSize())
428+
422429
b, err := snappy.Decode(tmp, tab.StringData)
423430
if err != nil {
424431
panic(err)
@@ -429,7 +436,7 @@ func (p *parser) processStringTable(tab *msgs2.CSVCMsg_CreateStringTable, s2 boo
429436

430437
br := bit.NewSmallBitReader(bytes.NewReader(tab.StringData))
431438

432-
if s2 {
439+
if tab.isS2 {
433440
p.processStringTableS2(tab, br)
434441
} else {
435442
if br.ReadBit() {
@@ -567,15 +574,18 @@ func (p *parser) handleCreateStringTableS1(tab *msg.CSVCMsg_CreateStringTable) {
567574
size := int32(len(tab.StringData))
568575
compressed := false
569576

570-
p.handleCreateStringTable(&msgs2.CSVCMsg_CreateStringTable{
571-
Name: tab.Name,
572-
NumEntries: tab.NumEntries,
573-
UserDataFixedSize: tab.UserDataFixedSize,
574-
UserDataSize: tab.UserDataSize,
575-
UserDataSizeBits: tab.UserDataSizeBits,
576-
Flags: tab.Flags,
577-
StringData: tab.StringData,
578-
UncompressedSize: &size,
579-
DataCompressed: &compressed,
580-
}, false)
577+
p.handleCreateStringTable(createStringTable{
578+
CSVCMsg_CreateStringTable: &msgs2.CSVCMsg_CreateStringTable{
579+
Name: tab.Name,
580+
NumEntries: tab.NumEntries,
581+
UserDataFixedSize: tab.UserDataFixedSize,
582+
UserDataSize: tab.UserDataSize,
583+
UserDataSizeBits: tab.UserDataSizeBits,
584+
Flags: tab.Flags,
585+
StringData: tab.StringData,
586+
UncompressedSize: &size,
587+
DataCompressed: &compressed,
588+
},
589+
s1MaxEntries: tab.MaxEntries,
590+
})
581591
}

0 commit comments

Comments
 (0)