Skip to content

Commit 86bebf8

Browse files
committed
events: fix nil Player values after disconnect (fixes #69)
in some cases we get events for players shortly after they disconnect. we now keep these players stored in the gameState so we can still put them into future events.
1 parent 8d9f249 commit 86bebf8

File tree

5 files changed

+22
-4
lines changed

5 files changed

+22
-4
lines changed

common/player.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type Player struct {
3434
Team Team
3535
TeamState *TeamState // When keeping the reference make sure you notice when the player changes teams
3636
IsBot bool
37+
IsConnected bool
3738
IsDucking bool
3839
IsDefusing bool
3940
HasDefuseKit bool

datatables.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ func (p *Parser) bindNewPlayer(playerEntity st.IEntity) {
204204
pl.EntityID = entityID
205205
pl.Entity = playerEntity
206206
pl.AdditionalPlayerInformation = &p.additionalPlayerInfo[entityID]
207+
pl.IsConnected = true
207208

208209
playerEntity.OnDestroy(func() {
209210
delete(p.gameState.playersByEntityID, entityID)

game_events.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,9 @@ func (geh gameEventHandler) playerDisconnect(desc *msg.CSVCMsg_GameEventListDesc
374374
geh.dispatch(events.PlayerDisconnected{
375375
Player: pl,
376376
})
377-
}
378377

379-
delete(geh.gameState().playersByUserID, uid)
378+
geh.playerByUserID(uid).IsConnected = false
379+
}
380380
}
381381

382382
func (geh gameEventHandler) playerTeam(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) {

game_state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (ptcp Participants) ByUserID() map[int]*common.Player {
150150
for k, v := range ptcp.playersByUserID {
151151
// We need to check if the player entity hasn't been destroyed yet
152152
// See https://github.com/markus-wa/demoinfocs-golang/issues/98
153-
if v.Entity != nil {
153+
if v.IsConnected && v.Entity != nil {
154154
res[k] = v
155155
}
156156
}

game_state_test.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,22 @@ func TestParticipants_SuppressNoEntity(t *testing.T) {
138138
gs := newGameState()
139139
pl := newPlayer()
140140
gs.playersByUserID[0] = pl
141-
gs.playersByUserID[1] = common.NewPlayer(0, func() int { return 0 })
141+
pl2 := common.NewPlayer(0, func() int { return 0 })
142+
pl2.IsConnected = true
143+
gs.playersByUserID[1] = pl2
144+
145+
allPlayers := gs.Participants().All()
146+
147+
assert.ElementsMatch(t, []*common.Player{pl}, allPlayers)
148+
}
149+
150+
func TestParticipants_SuppressNotConnected(t *testing.T) {
151+
gs := newGameState()
152+
pl := newPlayer()
153+
gs.playersByUserID[0] = pl
154+
pl2 := newPlayer()
155+
pl2.IsConnected = false
156+
gs.playersByUserID[1] = pl2
142157

143158
allPlayers := gs.Participants().All()
144159

@@ -148,5 +163,6 @@ func TestParticipants_SuppressNoEntity(t *testing.T) {
148163
func newPlayer() *common.Player {
149164
pl := common.NewPlayer(0, func() int { return 0 })
150165
pl.Entity = new(st.Entity)
166+
pl.IsConnected = true
151167
return pl
152168
}

0 commit comments

Comments
 (0)