5
5
6
6
"github.com/golang/geo/r3"
7
7
"github.com/markus-wa/go-unassert"
8
+ "github.com/pkg/errors"
8
9
9
10
common "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/common"
10
11
events "github.com/markus-wa/demoinfocs-golang/v2/pkg/demoinfocs/events"
@@ -52,10 +53,11 @@ func (p *parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
52
53
}
53
54
54
55
type 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
59
61
}
60
62
61
63
func (geh gameEventHandler ) dispatch (event interface {}) {
@@ -77,11 +79,12 @@ func (geh gameEventHandler) playerByUserID32(userID int32) *common.Player {
77
79
type gameEventHandlerFunc func (map [string ]* msg.CSVCMsg_GameEventKeyT )
78
80
79
81
//nolint:funlen
80
- func newGameEventHandler (parser * parser ) gameEventHandler {
82
+ func newGameEventHandler (parser * parser , ignoreBombsiteIndexNotFound bool ) gameEventHandler {
81
83
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 ,
85
88
}
86
89
87
90
// 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
633
636
geh .dispatch (events.BombExplode {BombEvent : bombEvent })
634
637
}
635
638
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
+
636
644
func (geh gameEventHandler ) bombEvent (data map [string ]* msg.CSVCMsg_GameEventKeyT ) (events.BombEvent , error ) {
637
645
bombEvent := events.BombEvent {Player : geh .playerByUserID32 (data ["userid" ].GetValShort ())}
638
646
@@ -653,17 +661,22 @@ func (geh gameEventHandler) bombEvent(data map[string]*msg.CSVCMsg_GameEventKeyT
653
661
default :
654
662
t := geh .parser .triggers [site ]
655
663
664
+ // when not found, only error if site is not 0, for retake games it may be 0 => unknown
656
665
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
+ }
658
677
}
659
678
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 {
667
680
// this may occur on de_grind for bombsite B, really makes you think
668
681
// see https://github.com/markus-wa/demoinfocs-golang/issues/280
669
682
geh .dispatch (events.ParserWarn {
0 commit comments