Skip to content

Commit

Permalink
stringtables: capture player name changes and raise new PlayerNameCha…
Browse files Browse the repository at this point in the history
…nge event (#289)

fixes regression introduced in 0515f18 where we lost player name changes
  • Loading branch information
markus-wa authored May 23, 2021
1 parent 66fa21e commit b3c400f
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
2 changes: 1 addition & 1 deletion pkg/demoinfocs/demoinfocs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ func TestDemoSet(t *testing.T) {
}

case events.WarnTypeTeamSwapPlayerNil:
t.Log("expected known issue with team swaps occurred", warn.Message)
t.Log("expected known issue with team swaps occurred:", warn.Message)
return

case events.WarnTypeGameEventBeforeDescriptors:
Expand Down
7 changes: 7 additions & 0 deletions pkg/demoinfocs/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,13 @@ type PlayerDisconnected struct {
Player *common.Player
}

// PlayerNameChange signals that a player's name has changed
type PlayerNameChange struct {
Player *common.Player
OldName string
NewName string
}

// SayText signals a chat message. It contains the raw
// network message data for admin / console messages.
// EntIdx will probably always be 0
Expand Down
30 changes: 29 additions & 1 deletion pkg/demoinfocs/stringtables.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,29 @@ func (p *parser) parseStringTables() {
p.bitReader.EndChunk()
}

func (p *parser) updatePlayerFromRawIfExists(index int, raw *playerInfo) {
pl := p.gameState.playersByEntityID[index+1]
if pl == nil {
return
}

oldName := pl.Name
newName := raw.name
nameChanged := !pl.IsBot && !raw.isFakePlayer && raw.guid != "BOT" && oldName != newName

pl.Name = raw.name
pl.SteamID64 = raw.xuid
pl.IsBot = raw.isFakePlayer

if nameChanged {
p.eventDispatcher.Dispatch(events.PlayerNameChange{
Player: pl,
OldName: oldName,
NewName: newName,
})
}
}

func (p *parser) parseSingleStringTable(name string) {
nStrings := p.bitReader.ReadSignedInt(16)
for i := 0; i < nStrings; i++ {
Expand All @@ -78,6 +101,8 @@ func (p *parser) parseSingleStringTable(name string) {

p.rawPlayers[int(playerIndex)] = player

p.updatePlayerFromRawIfExists(int(playerIndex), player)

case stNameInstanceBaseline:
classID, err := strconv.ParseInt(stringName, 10, 64)
if err != nil {
Expand Down Expand Up @@ -217,7 +242,10 @@ func (p *parser) processStringTable(tab *msg.CSVCMsg_CreateStringTable) {

switch tab.Name {
case stNameUserInfo:
p.rawPlayers[entryIndex] = parsePlayerInfo(bytes.NewReader(userdata))
player := parsePlayerInfo(bytes.NewReader(userdata))
p.rawPlayers[entryIndex] = player

p.updatePlayerFromRawIfExists(entryIndex, player)

case stNameInstanceBaseline:
classID, err := strconv.ParseInt(entry, 10, 64)
Expand Down

0 comments on commit b3c400f

Please sign in to comment.