diff --git a/SoulstormReplayReader.Benchmarks/Benchy.cs b/SoulstormReplayReader.Benchmarks/Benchy.cs index 5384127..9bfbac3 100644 --- a/SoulstormReplayReader.Benchmarks/Benchy.cs +++ b/SoulstormReplayReader.Benchmarks/Benchy.cs @@ -55,6 +55,12 @@ public class Benchy SsReplayReader.ReadFull(); } + [Benchmark] + public void ReadFullWithoutOrdinaryTicks() + { + SsReplayReader.ReadFull(false); + } + [GlobalCleanup] public void Cleanup() { diff --git a/SoulstormReplayReader.Core/Domain/Player/PlayerBugChecker.cs b/SoulstormReplayReader.Core/Domain/Player/PlayerBugChecker.cs index 4c37b31..fbc0dc9 100644 --- a/SoulstormReplayReader.Core/Domain/Player/PlayerBugChecker.cs +++ b/SoulstormReplayReader.Core/Domain/Player/PlayerBugChecker.cs @@ -6,26 +6,26 @@ namespace SoulstormReplayReader.Core.Domain.Player; public class PlayerBugChecker { - private readonly List _bugCheckers = new(); + public readonly List BugCheckers = new(); public PlayerBugChecker Add(BugCheckerBase checker) { - _bugCheckers.Add(checker); + BugCheckers.Add(checker); return this; } public void Check(IGameAction action) { - _bugCheckers.ForEach(bugChecker => bugChecker.Check(action)); + BugCheckers.ForEach(bugChecker => bugChecker.Check(action)); } - public bool HasAccusations() => _bugCheckers.Any(checker => checker.HasAccusation); + public bool HasAccusations() => BugCheckers.Any(checker => checker.HasAccusation); public string GetAccusationsList() { var sb = new StringBuilder(); - foreach (var checker in _bugCheckers.Where(checker => checker.HasAccusation)) + foreach (var checker in BugCheckers.Where(checker => checker.HasAccusation)) { sb.AppendLine(checker.Accusation); } diff --git a/SoulstormReplayReader.Core/SsReplayReader.cs b/SoulstormReplayReader.Core/SsReplayReader.cs index 4496f09..5ee93d0 100644 --- a/SoulstormReplayReader.Core/SsReplayReader.cs +++ b/SoulstormReplayReader.Core/SsReplayReader.cs @@ -48,11 +48,11 @@ public sealed class SsReplayReader(Stream stream) : IDisposable public ReplayModel Replay { get; set; } public int CurrentTick { get; set; } - public ReplayModel ReadFull() + public ReplayModel ReadFull(bool readOrdinaryTicks = true) { ReadInfo(); - ReadTicks(); + ReadTicks(readOrdinaryTicks); return Replay; } @@ -371,7 +371,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable return player; } - private void ReadTicks() + private void ReadTicks(bool readOrdinaryTicks) { if (Replay.Version < ReplayVersion._1_2) // Действия в старых версиях читаются не правильно { @@ -387,7 +387,7 @@ public sealed class SsReplayReader(Stream stream) : IDisposable // Иногда в конце реплея появляются остаточные байты while (_binaryReader.BytesLeft >= 17) - ReadTick(); + ReadTick(readOrdinaryTicks); #if DEBUGLOGGING if (_binaryReader.HasBytes) @@ -423,14 +423,14 @@ public sealed class SsReplayReader(Stream stream) : IDisposable // - - action 2 // - player chunk 2: // - - action 1 - private void ReadTick() + private void ReadTick(bool readOrdinaryTicks) { var tickType = (TickType)_binaryReader.ReadInt32(); var tickSize = _binaryReader.ReadInt32(); if (tickType == TickType.Normal) { - if (tickSize == 17) + if (tickSize == 17 || !readOrdinaryTicks) { _binaryReader.Skip(tickSize); // Всегда 17 байт }