@@ -77,7 +77,6 @@ func parseMatch(parser dem.Parser, handler func(msg *message.Message, state dem.
7777 })
7878
7979 parser .RegisterEventHandler (func (e events.Kill ) {
80- // log.Printf("r: '%d', '%+v'", parser.GameState().TotalRoundsPlayed(), e)
8180 frag := & message.Frag {
8281 Weapon : convertWeapon (e .Weapon .Type ),
8382 IsHeadshot : e .IsHeadshot ,
@@ -97,12 +96,8 @@ func parseMatch(parser dem.Parser, handler func(msg *message.Message, state dem.
9796 Frag : frag ,
9897 })
9998 })
100- parser .RegisterEventHandler (func (e events.RoundEnd ) {
101- //log.Printf("round end '%+v' tick '%v' time '%v'", e, parser.CurrentFrame(), parser.CurrentTime())
102- roundMessage .Winner = team (e .Winner )
103- })
99+
104100 parser .RegisterEventHandler (func (e events.RoundEndOfficial ) {
105- //log.Printf("round end offic '%+v' tick '%v' time '%v'", e, parser.CurrentFrame(), parser.CurrentTime())
106101 roundMessage .RoundTookSeconds = int32 ((parser .CurrentTime () - currentRoundTimer .lastRoundStart ).Seconds ())
107102 roundMessage .RoundNo = int32 (parser .GameState ().TotalRoundsPlayed ())
108103 roundMessage .EndTick = int32 (parser .CurrentFrame ())
@@ -111,33 +106,43 @@ func parseMatch(parser dem.Parser, handler func(msg *message.Message, state dem.
111106 Tick : int32 (parser .CurrentFrame ()),
112107 Round : roundMessage ,
113108 }
114- //log.Printf("sending round, messages '%v', roundNo '%v' T [%v : %v] CT", len(msg.Round.Ticks), msg.Round.RoundNo, msg.Round.TeamState.TScore, msg.Round.TeamState.CTScore)
115109 handler (msg , parser .GameState ())
116110 })
111+
117112 parser .RegisterEventHandler (func (e events.GamePhaseChanged ) {
113+ // because last round does not end with RoundEndOfficial event, we're catching it like this.
114+ // after that, RoundEnd should be called, which will send the last round message
115+ // this is because RoundEndOfficial happens after a little time players can still run around, collect stuff etc.
116+ // this does not happen in the last round as everybody just freezes in the last frame.
117+ // That's why we don't get proper RoundEndOfficial event
118118 if e .NewGamePhase == common .GamePhaseGameEnded {
119- //log.Printf("sending last round ? tick '%v' time '%v', winner '%v'", parser.CurrentFrame(), parser.CurrentTime(), roundMessage.Winner)
120119 roundMessage .RoundTookSeconds = int32 ((parser .CurrentTime () - currentRoundTimer .lastRoundStart ).Seconds ())
121120 roundMessage .RoundNo = int32 (parser .GameState ().TotalRoundsPlayed () + 1 )
122121 roundMessage .EndTick = int32 (parser .CurrentFrame ())
122+ }
123+ })
124+
125+ parser .RegisterEventHandler (func (e events.RoundEnd ) {
126+ roundMessage .Winner = team (e .Winner )
127+
128+ // send round message if this is the last round (EndTick set by GamePhaseChanged handler)
129+ if roundMessage .EndTick > 0 && parser .CurrentFrame () == int (roundMessage .EndTick ) {
123130 msg := & message.Message {
124131 MsgType : message .Message_RoundType ,
125132 Tick : int32 (parser .CurrentFrame ()),
126133 Round : roundMessage ,
127134 }
128- //log.Printf("sending round, messages '%v', roundNo '%v' T [%v : %v] CT", len(msg.Round.Ticks), msg.Round.RoundNo, msg.Round.TeamState.TScore, msg.Round.TeamState.CTScore)
129135 handler (msg , parser .GameState ())
130136 }
131137 })
138+
132139 parser .RegisterEventHandler (func (e events.RoundStart ) {
133140 readyForNewRound = true
134141 })
135142
136143 bombH .registerEvents ()
137144
138145 parser .RegisterEventHandler (func (e events.RoundFreezetimeEnd ) {
139- //log.Printf("freezetime end '%+v' tick '%v' time '%v'", e, parser.CurrentFrame(), parser.CurrentTime())
140-
141146 if readyForNewRound {
142147 readyForNewRound = false
143148 roundMessage = message .NewRound (parser .CurrentFrame ())
0 commit comments