@@ -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+
5679func (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