Skip to content

Commit b3c400f

Browse files
authored
stringtables: capture player name changes and raise new PlayerNameChange event (#289)
fixes regression introduced in 0515f18 where we lost player name changes
1 parent 66fa21e commit b3c400f

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

pkg/demoinfocs/demoinfocs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ func TestDemoSet(t *testing.T) {
371371
}
372372

373373
case events.WarnTypeTeamSwapPlayerNil:
374-
t.Log("expected known issue with team swaps occurred", warn.Message)
374+
t.Log("expected known issue with team swaps occurred:", warn.Message)
375375
return
376376

377377
case events.WarnTypeGameEventBeforeDescriptors:

pkg/demoinfocs/events/events.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,13 @@ type PlayerDisconnected struct {
417417
Player *common.Player
418418
}
419419

420+
// PlayerNameChange signals that a player's name has changed
421+
type PlayerNameChange struct {
422+
Player *common.Player
423+
OldName string
424+
NewName string
425+
}
426+
420427
// SayText signals a chat message. It contains the raw
421428
// network message data for admin / console messages.
422429
// EntIdx will probably always be 0

pkg/demoinfocs/stringtables.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,29 @@ func (p *parser) parseStringTables() {
5353
p.bitReader.EndChunk()
5454
}
5555

56+
func (p *parser) updatePlayerFromRawIfExists(index int, raw *playerInfo) {
57+
pl := p.gameState.playersByEntityID[index+1]
58+
if pl == nil {
59+
return
60+
}
61+
62+
oldName := pl.Name
63+
newName := raw.name
64+
nameChanged := !pl.IsBot && !raw.isFakePlayer && raw.guid != "BOT" && oldName != newName
65+
66+
pl.Name = raw.name
67+
pl.SteamID64 = raw.xuid
68+
pl.IsBot = raw.isFakePlayer
69+
70+
if nameChanged {
71+
p.eventDispatcher.Dispatch(events.PlayerNameChange{
72+
Player: pl,
73+
OldName: oldName,
74+
NewName: newName,
75+
})
76+
}
77+
}
78+
5679
func (p *parser) parseSingleStringTable(name string) {
5780
nStrings := p.bitReader.ReadSignedInt(16)
5881
for i := 0; i < nStrings; i++ {
@@ -78,6 +101,8 @@ func (p *parser) parseSingleStringTable(name string) {
78101

79102
p.rawPlayers[int(playerIndex)] = player
80103

104+
p.updatePlayerFromRawIfExists(int(playerIndex), player)
105+
81106
case stNameInstanceBaseline:
82107
classID, err := strconv.ParseInt(stringName, 10, 64)
83108
if err != nil {
@@ -217,7 +242,10 @@ func (p *parser) processStringTable(tab *msg.CSVCMsg_CreateStringTable) {
217242

218243
switch tab.Name {
219244
case stNameUserInfo:
220-
p.rawPlayers[entryIndex] = parsePlayerInfo(bytes.NewReader(userdata))
245+
player := parsePlayerInfo(bytes.NewReader(userdata))
246+
p.rawPlayers[entryIndex] = player
247+
248+
p.updatePlayerFromRawIfExists(entryIndex, player)
221249

222250
case stNameInstanceBaseline:
223251
classID, err := strconv.ParseInt(entry, 10, 64)

0 commit comments

Comments
 (0)