diff --git a/pkg/demoinfocs/demoinfocs_test.go b/pkg/demoinfocs/demoinfocs_test.go index 2b016e88..9f62c2d0 100644 --- a/pkg/demoinfocs/demoinfocs_test.go +++ b/pkg/demoinfocs/demoinfocs_test.go @@ -219,7 +219,7 @@ func TestS2(t *testing.T) { if *update { p.RegisterNetMessageHandler(func(gel *msgs2.CMsgSource1LegacyGameEventList) { - lo.Must0(os.WriteFile("s2_CMsgSource1LegacyGameEventList.pb.bin", lo.Must(proto.Marshal(gel)), 0600)) + lo.Must0(os.WriteFile("event-list-dump/s2_CMsgSource1LegacyGameEventList.pb.bin", lo.Must(proto.Marshal(gel)), 0600)) }) } diff --git a/pkg/demoinfocs/event-list-dump/13990.bin b/pkg/demoinfocs/event-list-dump/13990.bin new file mode 100644 index 00000000..da87bcc1 Binary files /dev/null and b/pkg/demoinfocs/event-list-dump/13990.bin differ diff --git a/pkg/demoinfocs/s2_CMsgSource1LegacyGameEventList.pb.bin b/pkg/demoinfocs/event-list-dump/13992.bin similarity index 100% rename from pkg/demoinfocs/s2_CMsgSource1LegacyGameEventList.pb.bin rename to pkg/demoinfocs/event-list-dump/13992.bin diff --git a/pkg/demoinfocs/event-list-dump/14023.bin b/pkg/demoinfocs/event-list-dump/14023.bin new file mode 100644 index 00000000..796c9250 Binary files /dev/null and b/pkg/demoinfocs/event-list-dump/14023.bin differ diff --git a/pkg/demoinfocs/parser.go b/pkg/demoinfocs/parser.go index 9c7d8e52..47e5fa4d 100644 --- a/pkg/demoinfocs/parser.go +++ b/pkg/demoinfocs/parser.go @@ -373,9 +373,6 @@ var DefaultParserConfig = ParserConfig{ MsgQueueBufferSize: -1, } -//go:embed s2_CMsgSource1LegacyGameEventList.pb.bin -var defaultSource2FallbackGameEventListBin []byte - // NewParserWithConfig returns a new Parser with a custom configuration. // // See also: NewParser() & ParserConfig @@ -399,11 +396,6 @@ func NewParserWithConfig(demostream io.Reader, config ParserConfig) Parser { p.recordingPlayerSlot = -1 p.disableMimicSource1GameEvents = config.DisableMimicSource1Events p.source2FallbackGameEventListBin = config.Source2FallbackGameEventListBin - - if p.source2FallbackGameEventListBin == nil { - p.source2FallbackGameEventListBin = defaultSource2FallbackGameEventListBin - } - p.ignorePacketEntitiesPanic = config.IgnorePacketEntitiesPanic dispatcherCfg := dp.Config{ diff --git a/pkg/demoinfocs/s2_commands.go b/pkg/demoinfocs/s2_commands.go index 79cc683c..85c6ccda 100644 --- a/pkg/demoinfocs/s2_commands.go +++ b/pkg/demoinfocs/s2_commands.go @@ -2,6 +2,7 @@ package demoinfocs import ( "bytes" + "embed" "fmt" "sort" "time" @@ -372,12 +373,36 @@ func (p *parser) handleFileInfo(msg *msgs2.CDemoFileInfo) { p.header.PlaybackTime = time.Duration(*msg.PlaybackTime) * time.Second } +//go:embed event-list-dump/*.bin +var eventListFolder embed.FS + +func getGameEventListBinForProtocol(networkProtocol int) ([]byte, error) { + switch { + case networkProtocol < 13992: + return eventListFolder.ReadFile("event-list-dump/13990.bin") + case networkProtocol >= 13992 && networkProtocol < 14023: + return eventListFolder.ReadFile("event-list-dump/13992.bin") + default: + return eventListFolder.ReadFile("event-list-dump/14023.bin") + } +} + func (p *parser) handleDemoFileHeader(msg *msgs2.CDemoFileHeader) { p.header.ClientName = msg.GetClientName() p.header.ServerName = msg.GetServerName() p.header.GameDirectory = msg.GetGameDirectory() p.header.MapName = msg.GetMapName() - p.header.NetworkProtocol = int(msg.GetNetworkProtocol()) + networkProtocol := int(msg.GetNetworkProtocol()) + p.header.NetworkProtocol = networkProtocol + + if p.source2FallbackGameEventListBin == nil { + gameEventListBin, err := getGameEventListBinForProtocol(networkProtocol) + if err != nil { + panic(fmt.Sprintf("failed to load game event list for protocol %d: %v", networkProtocol, err)) + } + + p.source2FallbackGameEventListBin = gameEventListBin + } } func (p *parser) updatePlayersPreviousFramePosition() {