- BREAKING CHANGE: Exceptions when fetching data from the broadcast server are now immediately propagated to
MoveNextAsync
. You must handle retries and rate limiting in yourHttpClient
, e.g. by usingRetryingBroadcastHttpHandler
- Added
RetryingBroadcastHttpHandler
:- Handles automatic (limited) retries of HTTP 404 responses for
/delta
requests. This logic has been removed fromHttpBroadcastReader
- Throttles successful
/delta
requests (rolling 1-second window)
- Handles automatic (limited) retries of HTTP 404 responses for
- Added
Uri baseAddress
parameter toHttpBroadcastReader
constructor to simplify instantiation by usingRetryingBroadcastHttpHandler
. - Added
HttpBroadcastReader.BroadcastSyncDto
(Sync DTO as retrieved from the/sync
endpoint) - Added
HttpBroadcastReader.EnqueuedFragmentsCount
(Number of enqueued fragments that are ready to read inMoveNextAsync
)
- Update to latest Deadlock schema
- Update to latest Deadlock schema
- Fixed bug where
ReadAllParallelAsync
could miss some data when reading a demo with no full packets (thanks @in0finite) - Improved incomplete demo file parsing (thanks @in0finite)
- Added
DemoFileReader.FullPacketCount
,IsIncompleteFile
andIncompleteFileLastStreamPosition
properties - Added
maxParallelism
parameter toReadAllParallelAsync
- Update to Counter-Strike 2 schema v14034
- Update to Deadlock schema v48
- Fixed parallel parsing of POV demos (#92)
- Fix entities being re-created multiple times (#91)
- Added check to ensure demos are for the correct game (e.g. CsDemoParser reads 'csgo' demos, DeadlockDemoParser reads 'citadel' demos)
- BREAKING CHANGE: Stream reading logic has been split out of
DemoParser
intoDemoFileReader
.
This change enables different sources of demo data, e.g. HTTP broadcasts.- Old
DemoParser.ReadAllAsync
(static) => nowDemoFileReader.ReadAllAsync
(instance) - Old
DemoParser.StartReadingAsync
=> nowDemoFileReader.StartReadingAsync
- Old
DemoParser.MoveNextAsync
=> nowDemoFileReader.MoveNextAsync
- Old
DemoParser.OnProgress
=> nowDemoFileReader.OnProgress
- Old
- Game-specific SDK types have moved out of the
DemoFile
namespace intoDemoFile.Game.Cs
andDemoFile.Game.Deadlock
.
You may need to add someusing DemoFile.Game.Cs;
to your existing code. - Added support for reading HTTP broadcasts, see DemoFile.Example.HttpBroadcast
- BREAKING CHANGE: Split CS-specific code out of DemoFile into a new NuGet package called
DemoFile.Game.Cs
- BREAKING CHANGE:
DemoParser
class is now abstract - port your code tonew CsDemoParser()
instead - BREAKING CHANGE: Renamed
DemoParser.IsGotv
toDemoParser.IsTvRecording
- BREAKING CHANGE: Renamed
DemoParser.GameEvents
toDemoParser.BaseGameEvents
- BREAKING CHANGE: Renamed
DemoParser.UserMessageEvents
toDemoParser.BaseUserMessageEvents
- BREAKING CHANGE: Renamed
DemoParser.CsgoGameEvents
toCsDemoParser.GameEvents
- Added
CsDemoParser.UserMessageEvents
for CS2-specific user messages (#81) - Added preliminary support for Deadlock in the new
DemoFile.Game.Deadlock
package - usenew DeadlockDemoParser()
- Reduce allocations for compressed packets (reduces total allocs for a typical demo by -10%)
- Add
DemoParser.ReadAllParallelAsync
to read a demo across multiple threads.
Many thanks to @in0finite for the initial implementation.
- Added support for POV demos
- Update schema and demo format for v14026
- Add new
BulletDamage
Source1 game event - Parse
cs_gameevents.proto
messages (specifically CMsgTEFireBullets onDemoFile.CsgoGameEvents.FireBullets
) - Parse
te.proto
(temporary entities) viaDemoFile.TempEntityEvents
- Don't try to parse messages that are never seen in demos (to improve performance)
- Fixed backwards seeking failing for some demos (#76)
- Fixed CBaseCSGrenade.GrenadeCount always being 1 (#71)
- Fixed seeking failing for some demos (#72). Thanks to @in0finite for reporting.
- Update schema and demo format for v14011
- Fix parsing error since 2024-05-23 update (full schema update to follow)
- Update schema and demo format for v14005
- Fix player pawn positions occasionally jittering (#37). Thanks to @in0finite for spotting the bug.
- Add support for seeking to arbitrary ticks with
DemoParser.SeekToTickAsync
.
It supports seeking backwards and forwards, and makes use of Source 2 demo 'full packet' snapshots to do this efficiently.
- Reading CDemoFileInfo is best effort
- Throw EndOfStreamException when unable to read any more bytes from the demo
- Synthesise
Source1GameEvents.RoundStart
andSource1GameEvents.RoundEnds
events on newer demos
- Update schema for v13987
- BREAKING CHANGE:
DemoParser.Start
is nowDemoParser.ReadAllAsync
- Added ability to read tick-by-tick with
DemoParser.StartReadingAsync
andDemoParser.MoveNextAsync
- Added comparison operators to
DemoTick
andGameTick
- Read CDemoFileInfo in seekable streams (available on complete demo recordings only)
- Only read the first entity snapshot in GOTV demos (~10% perf improvement)
- Added
DemoFile.IsGotv
, indicating whether the demo was recorded by GOTV - Fix pawn position jumping to multiples of 1024 for a single tick (#27)
- Fix decode exception caused by .NET runtime bug (dotnet/runtime#96174)
- Update to schema v13980
- Improve fallback field decoding (GameTime_t, GameTick_t and heuristics for enums)
- Fix alternate baseline regression introduced in 0.3.x
- Added release notes
- Fix StrictEHandle event key parsing (fixes
FooPawn
properties on game events)
- Use lower byte of user ID to get controller slot in game events
- Fix stringtable updates sometimes being off by one
- Fix userid event vars being parsed as entity indexes
- Add GetPlayerByUserId/SteamId helper methods
- Add autogen helpers for entity handle schema fields
- Add support for MNetworkVarTypeOverride
- Add class-level metadata as comments
- Add GameItems class
- Add name/paintkit/rarity/quality helper properties to CEconItemView
- Update schema for v13966
- Add CCSPlayerPawn.InputButtons and CSMovementServices
- Add events for entity creation/update/deletion
- Improve game event generation
- Update schema for v13964
- Support fallback field decoding