55
66 "github.com/golang/geo/r3"
77 "github.com/markus-wa/go-unassert"
8+ "github.com/pkg/errors"
89
910 common "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/common"
1011 events "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/events"
@@ -52,10 +53,11 @@ func (p *parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
5253}
5354
5455type gameEventHandler struct {
55- parser * parser
56- gameEventNameToHandler map [string ]gameEventHandlerFunc
57- userIDToFallDamageFrame map [int32 ]int
58- frameToRoundEndReason map [int ]events.RoundEndReason
56+ parser * parser
57+ gameEventNameToHandler map [string ]gameEventHandlerFunc
58+ userIDToFallDamageFrame map [int32 ]int
59+ frameToRoundEndReason map [int ]events.RoundEndReason
60+ ignoreBombsiteIndexNotFound bool // see https://github.com/markus-wa/demoinfocs-golang/issues/314
5961}
6062
6163func (geh gameEventHandler ) dispatch (event interface {}) {
@@ -77,11 +79,12 @@ func (geh gameEventHandler) playerByUserID32(userID int32) *common.Player {
7779type gameEventHandlerFunc func (map [string ]* msg.CSVCMsg_GameEventKeyT )
7880
7981//nolint:funlen
80- func newGameEventHandler (parser * parser ) gameEventHandler {
82+ func newGameEventHandler (parser * parser , ignoreBombsiteIndexNotFound bool ) gameEventHandler {
8183 geh := gameEventHandler {
82- parser : parser ,
83- userIDToFallDamageFrame : make (map [int32 ]int ),
84- frameToRoundEndReason : make (map [int ]events.RoundEndReason ),
84+ parser : parser ,
85+ userIDToFallDamageFrame : make (map [int32 ]int ),
86+ frameToRoundEndReason : make (map [int ]events.RoundEndReason ),
87+ ignoreBombsiteIndexNotFound : ignoreBombsiteIndexNotFound ,
8588 }
8689
8790 // some events need to be delayed until their data is available
@@ -633,6 +636,11 @@ func (geh gameEventHandler) bombExploded(data map[string]*msg.CSVCMsg_GameEventK
633636 geh .dispatch (events.BombExplode {BombEvent : bombEvent })
634637}
635638
639+ // ErrBombsiteIndexNotFound indicates that a game-event occurred that contained an unknown bombsite index.
640+ // This error can be disabled by setting ParserConfig.IgnoreErrBombsiteIndexNotFound = true.
641+ // See https://github.com/markus-wa/demoinfocs-golang/issues/314
642+ var ErrBombsiteIndexNotFound = errors .New ("bombsite index not found - see https://github.com/markus-wa/demoinfocs-golang/issues/314" )
643+
636644func (geh gameEventHandler ) bombEvent (data map [string ]* msg.CSVCMsg_GameEventKeyT ) (events.BombEvent , error ) {
637645 bombEvent := events.BombEvent {Player : geh .playerByUserID32 (data ["userid" ].GetValShort ())}
638646
@@ -653,17 +661,22 @@ func (geh gameEventHandler) bombEvent(data map[string]*msg.CSVCMsg_GameEventKeyT
653661 default :
654662 t := geh .parser .triggers [site ]
655663
664+ // when not found, only error if site is not 0, for retake games it may be 0 => unknown
656665 if t == nil {
657- return bombEvent , fmt .Errorf ("bombsite with index %d not found" , site )
666+ if ! geh .ignoreBombsiteIndexNotFound {
667+ return bombEvent , errors .Wrapf (ErrBombsiteIndexNotFound , "bombsite with index %d not found" , site )
668+ }
669+ } else {
670+ if t .contains (geh .parser .bombsiteA .center ) {
671+ bombEvent .Site = events .BombsiteA
672+ geh .parser .bombsiteA .index = site
673+ } else if t .contains (geh .parser .bombsiteB .center ) {
674+ bombEvent .Site = events .BombsiteB
675+ geh .parser .bombsiteB .index = site
676+ }
658677 }
659678
660- if t .contains (geh .parser .bombsiteA .center ) {
661- bombEvent .Site = events .BombsiteA
662- geh .parser .bombsiteA .index = site
663- } else if t .contains (geh .parser .bombsiteB .center ) {
664- bombEvent .Site = events .BombsiteB
665- geh .parser .bombsiteB .index = site
666- } else {
679+ if bombEvent .Site == events .BomsiteUnknown {
667680 // this may occur on de_grind for bombsite B, really makes you think
668681 // see https://github.com/markus-wa/demoinfocs-golang/issues/280
669682 geh .dispatch (events.ParserWarn {
0 commit comments