Skip to content

Commit a52bbf6

Browse files
committed
events: delay PlayerTeamChange until end of tick
- team IDs of other players changing teams in the same tick might not have changed yet - player entities might not have been re-created yet after a reconnect
1 parent 8ffa574 commit a52bbf6

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

game_events.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func (geh gameEventHandler) playerBlind(desc *msg.CSVCMsg_GameEventListDescripto
286286

287287
// Player.FlashDuration hasn't been updated yet,
288288
// so we need to wait until the end of the tick before dispatching
289-
geh.parser.currentFlashEvents = append(geh.parser.currentFlashEvents, events.PlayerFlashed{
289+
geh.parser.delayedEvents = append(geh.parser.delayedEvents, events.PlayerFlashed{
290290
Player: geh.playerByUserID32(data["userid"].GetValShort()),
291291
Attacker: geh.gameState().lastFlasher,
292292
})
@@ -390,7 +390,10 @@ func (geh gameEventHandler) playerTeam(desc *msg.CSVCMsg_GameEventListDescriptor
390390
player.Team = newTeam
391391

392392
oldTeam := common.Team(data["oldteam"].GetValByte())
393-
geh.dispatch(events.PlayerTeamChange{
393+
// Delayed for two reasons
394+
// - team IDs of other players changing teams in the same tick might not have changed yet
395+
// - player entities might not have been re-created yet after a reconnect
396+
geh.parser.delayedEvents = append(geh.parser.delayedEvents, events.PlayerTeamChange{
394397
Player: player,
395398
IsBot: data["isbot"].GetValBool(),
396399
Silent: data["silent"].GetValBool(),

parser.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010

1111
bit "github.com/markus-wa/demoinfocs-golang/bitread"
1212
common "github.com/markus-wa/demoinfocs-golang/common"
13-
events "github.com/markus-wa/demoinfocs-golang/events"
1413
msg "github.com/markus-wa/demoinfocs-golang/msg"
1514
st "github.com/markus-wa/demoinfocs-golang/sendtables"
1615
)
@@ -70,7 +69,7 @@ type Parser struct {
7069
gameEventDescs map[int32]*msg.CSVCMsg_GameEventListDescriptorT // Maps game-event IDs to descriptors
7170
grenadeModelIndices map[int]common.EquipmentElement // Used to map model indices to grenades (used for grenade projectiles)
7271
stringTables []*msg.CSVCMsg_CreateStringTable // Contains all created sendtables, needed when updating them
73-
currentFlashEvents []events.PlayerFlashed // Contains flash events that need to be dispatched at the end of a tick
72+
delayedEvents []interface{} // Contains events that need to be dispatched at the end of a tick (e.g. flash events because FlashDuration isn't updated before that)
7473
}
7574

7675
type bombsite struct {

parsing.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,10 @@ var frameParsedToken = new(frameParsedTokenType)
247247
func (p *Parser) handleFrameParsed(*frameParsedTokenType) {
248248
// PlayerFlashed events need to be dispatched at the end of the tick
249249
// because Player.FlashDuration is updated after the game-events are parsed.
250-
for _, e := range p.currentFlashEvents {
250+
for _, e := range p.delayedEvents {
251251
p.eventDispatcher.Dispatch(e)
252252
}
253-
p.currentFlashEvents = p.currentFlashEvents[:0]
253+
p.delayedEvents = p.delayedEvents[:0]
254254

255255
p.currentFrame++
256256
p.eventDispatcher.Dispatch(events.TickDone{})

0 commit comments

Comments
 (0)