Overview
Fortnite replays contain rich event data that provides insights into match flow, eliminations, statistics, and game state changes. The ReplayReader automatically extracts these events during parsing.
Event Types
Events are parsed in the ReadEvent method and categorized by type:
Player Eliminations - Kill events with detailed information
Match Stats - Player performance statistics
Team Stats - Team placement and player count
Safe Zone Updates - Storm circle progression
Battle Bus - Bus flight path data
Player Eliminations
Eliminations are stored in replay.Eliminations and provide detailed kill information.
Accessing Eliminations
using FortniteReplayReader ;
using Unreal . Core . Models . Enums ;
var reader = new ReplayReader ();
var replay = reader . ReadReplay ( "replay.replay" , ParseType . Minimal );
foreach ( var elim in replay . Eliminations )
{
Console . WriteLine ( $"[ { elim . Time } ] { elim . Eliminator } eliminated { elim . Eliminated } " );
Console . WriteLine ( $"Weapon: { elim . DeathCause } " );
Console . WriteLine ( $"Knocked: { elim . Knocked } " );
Console . WriteLine ( $"Distance: { elim . Distance : F2 } m" );
Console . WriteLine ();
}
PlayerElimination Properties
ID of the eliminated player
ID of the player who got the elimination
Cause of death (weapon type, fall damage, storm, etc.)
Whether this was a knock or full elimination
Time of elimination in milliseconds
Formatted timestamp (MM:SS)
Distance between eliminator and eliminated in meters
Whether distance calculation is valid
Whether player eliminated themselves
Elimination Location Data
Each elimination contains location information for both players:
foreach ( var elim in replay . Eliminations )
{
// Eliminated player info
Console . WriteLine ( $"Eliminated Location: { elim . EliminatedInfo . Location } " );
Console . WriteLine ( $"Eliminated Rotation: { elim . EliminatedInfo . Rotation } " );
Console . WriteLine ( $"Player Type: { elim . EliminatedInfo . PlayerType } " );
// Eliminator info
Console . WriteLine ( $"Eliminator Location: { elim . EliminatorInfo . Location } " );
Console . WriteLine ( $"Eliminator Rotation: { elim . EliminatorInfo . Rotation } " );
Console . WriteLine ( $"Player Type: { elim . EliminatorInfo . PlayerType } " );
Console . WriteLine ();
}
Filtering Eliminations
By Player
Knocks vs Kills
Long Range
Self Eliminations
var playerElims = replay . Eliminations
. Where ( e => e . Eliminator == "player-epic-id" )
. ToList ();
Console . WriteLine ( $"Total Eliminations: { playerElims . Count } " );
var knocks = replay . Eliminations . Where ( e => e . Knocked ). ToList ();
var kills = replay . Eliminations . Where ( e => ! e . Knocked ). ToList ();
Console . WriteLine ( $"Knocks: { knocks . Count } " );
Console . WriteLine ( $"Eliminations: { kills . Count } " );
var longRangeElims = replay . Eliminations
. Where ( e => e . ValidDistance && e . Distance > 100 )
. OrderByDescending ( e => e . Distance )
. ToList ();
foreach ( var elim in longRangeElims )
{
Console . WriteLine ( $" { elim . Eliminator } : { elim . Distance : F2 } m" );
}
var selfElims = replay . Eliminations
. Where ( e => e . SelfElimination )
. ToList ();
Console . WriteLine ( $"Self eliminations: { selfElims . Count } " );
Match Statistics
Match stats provide performance metrics for the replay owner:
var stats = replay . Stats ;
if ( stats != null )
{
Console . WriteLine ( $"Accuracy: { stats . Accuracy : P2 } " );
Console . WriteLine ( $"Assists: { stats . Assists } " );
Console . WriteLine ( $"Eliminations: { stats . Eliminations } " );
Console . WriteLine ( $"Weapon Damage: { stats . WeaponDamage } " );
Console . WriteLine ( $"Other Damage: { stats . OtherDamage } " );
Console . WriteLine ( $"Revives: { stats . Revives } " );
Console . WriteLine ( $"Damage Taken: { stats . DamageTaken } " );
Console . WriteLine ( $"Damage to Structures: { stats . DamageToStructures } " );
Console . WriteLine ( $"Materials Gathered: { stats . MaterialsGathered } " );
Console . WriteLine ( $"Materials Used: { stats . MaterialsUsed } " );
Console . WriteLine ( $"Total Traveled: { stats . TotalTraveled } m" );
}
Stats Properties
Weapon accuracy percentage (0-1)
Number of elimination assists
Total damage dealt with weapons
Damage from other sources (storm, fall, etc.)
Number of teammate revives
Damage dealt to structures
Total materials harvested
Total materials used for building
Distance traveled in meters
Team Statistics
Team stats provide placement information:
var teamStats = replay . TeamStats ;
if ( teamStats != null )
{
Console . WriteLine ( $"Team Placement: { teamStats . Position } " );
Console . WriteLine ( $"Total Players: { teamStats . TotalPlayers } " );
}
Safe zones track storm circle progression:
var safeZones = replay . GameInformation . SafeZones ;
foreach ( var zone in safeZones )
{
Console . WriteLine ( $"Current Radius: { zone . CurrentRadius } " );
Console . WriteLine ( $"Next Radius: { zone . NextRadius } " );
Console . WriteLine ( $"Next Next Radius: { zone . NextNextRadius } " );
Console . WriteLine ( $"Shrink Start: { zone . ShrinkStartTime } " );
Console . WriteLine ( $"Shrink End: { zone . ShringEndTime } " );
Console . WriteLine ( $"Last Center: { zone . LastCenter } " );
Console . WriteLine ( $"Next Center: { zone . NextCenter } " );
Console . WriteLine ( $"Next Next Center: { zone . NextNextCenter } " );
Console . WriteLine ();
}
SafeZone Properties
Current storm circle radius
Base radius at zone creation
Radius after current shrink
Radius for the following zone
When the zone starts shrinking
When the zone finishes shrinking
Center for the following zone
Access battle bus flight paths:
var gameState = replay . GameInformation . GameState ;
foreach ( var bus in gameState . BusPaths )
{
Console . WriteLine ( $"Flight Start Location: { bus . FlightStartLocation } " );
Console . WriteLine ( $"Flight Rotation: { bus . FlightRotation } " );
Console . WriteLine ();
}
Console . WriteLine ( $"Aircraft Start Time: { gameState . AirCraftStartTime } " );
The GameState object provides comprehensive match information:
var gameState = replay . GameInformation . GameState ;
Console . WriteLine ( $"Session ID: { gameState . SessionId } " );
Console . WriteLine ( $"Match Time: { gameState . MatchTime } " );
Console . WriteLine ( $"Match End Time: { gameState . MatchEndTime } " );
Console . WriteLine ( $"Playlist ID: { gameState . PlaylistId } " );
Console . WriteLine ( $"Max Players: { gameState . MaxPlayers } " );
Console . WriteLine ( $"Total Teams: { gameState . TotalTeams } " );
Console . WriteLine ( $"Total Bots: { gameState . TotalBots } " );
Console . WriteLine ( $"Large Team Game: { gameState . LargeTeamGame } " );
Console . WriteLine ( $"Winning Team: { gameState . WinningTeam } " );
Supply Drops
Track supply drop spawns and interactions:
var supplyDrops = replay . GameInformation . SupplyDrops ;
foreach ( var drop in supplyDrops )
{
Console . WriteLine ( $"Location: { drop . Location } " );
Console . WriteLine ( $"Spawn Time: { drop . SpawnTime } " );
Console . WriteLine ( $"Opened: { drop . Opened } " );
Console . WriteLine ( $"Destroyed: { drop . Destroyed } " );
Console . WriteLine ( $"Balloon Popped: { drop . BalloonPopped } " );
Console . WriteLine ( $"Spawned Items: { drop . SpawnedItems } " );
Console . WriteLine ();
}
Llamas
Track llama spawns and interactions:
var llamas = replay . GameInformation . Llamas ;
foreach ( var llama in llamas )
{
Console . WriteLine ( $"Location: { llama . Location } " );
Console . WriteLine ( $"Opened: { llama . Opened } " );
Console . WriteLine ( $"Destroyed: { llama . Destroyed } " );
Console . WriteLine ( $"Spawned Items: { llama . SpawnedItems } " );
Console . WriteLine ();
}
Kill Feed
Access the complete kill feed including knocks, eliminations, and revives:
var killFeed = replay . GameInformation . KillFeed ;
foreach ( var entry in killFeed )
{
Console . WriteLine ( $"Time: { entry . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Player: { entry . Player ? . DisplayName } " );
Console . WriteLine ( $"State: { entry . CurrentPlayerState } " );
if ( entry . FinisherOrDowner != null )
{
Console . WriteLine ( $"By: { entry . FinisherOrDowner . DisplayName } " );
}
if ( entry . DeathCause != null )
{
Console . WriteLine ( $"Cause: { entry . DeathCause } " );
}
if ( entry . Distance > 0 )
{
Console . WriteLine ( $"Distance: { entry . Distance : F2 } m" );
}
Console . WriteLine ();
}
Complete Event Analysis Example
using FortniteReplayReader ;
using FortniteReplayReader . Models ;
using Unreal . Core . Models . Enums ;
var reader = new ReplayReader ();
var replay = reader . ReadReplay ( "replay.replay" , ParseType . Full );
Console . WriteLine ( "=== MATCH OVERVIEW ===" );
var gameState = replay . GameInformation . GameState ;
Console . WriteLine ( $"Session: { gameState . SessionId } " );
Console . WriteLine ( $"Playlist: { gameState . PlaylistId } " );
Console . WriteLine ( $"Players: { gameState . MaxPlayers } " );
Console . WriteLine ( $"Teams: { gameState . TotalTeams } " );
Console . WriteLine ();
Console . WriteLine ( "=== ELIMINATIONS ===" );
foreach ( var elim in replay . Eliminations . OrderBy ( e => e . Timestamp ))
{
var distance = elim . ValidDistance ? $" ( { elim . Distance : F2 } m)" : "" ;
var knocked = elim . Knocked ? " [KNOCKED]" : " [ELIMINATED]" ;
Console . WriteLine ( $"[ { elim . Time } ] { elim . Eliminator } -> { elim . Eliminated }{ knocked }{ distance } " );
}
Console . WriteLine ();
if ( replay . Stats != null )
{
Console . WriteLine ( "=== PLAYER STATS ===" );
Console . WriteLine ( $"Eliminations: { replay . Stats . Eliminations } " );
Console . WriteLine ( $"Assists: { replay . Stats . Assists } " );
Console . WriteLine ( $"Accuracy: { replay . Stats . Accuracy : P2 } " );
Console . WriteLine ( $"Damage Dealt: { replay . Stats . WeaponDamage } " );
Console . WriteLine ( $"Damage Taken: { replay . Stats . DamageTaken } " );
Console . WriteLine ( $"Materials Gathered: { replay . Stats . MaterialsGathered } " );
Console . WriteLine ();
}
if ( replay . TeamStats != null )
{
Console . WriteLine ( "=== TEAM STATS ===" );
Console . WriteLine ( $"Placement: # { replay . TeamStats . Position } " );
Console . WriteLine ( $"Total Players: { replay . TeamStats . TotalPlayers } " );
Console . WriteLine ();
}
Console . WriteLine ( "=== SAFE ZONES ===" );
int zoneNum = 1 ;
foreach ( var zone in replay . GameInformation . SafeZones )
{
Console . WriteLine ( $"Zone { zoneNum ++ } " );
Console . WriteLine ( $" Radius: { zone . CurrentRadius } -> { zone . NextRadius } " );
Console . WriteLine ( $" Center: { zone . NextCenter } " );
Console . WriteLine ( $" Shrink: { zone . ShrinkStartTime : F2 } s - { zone . ShringEndTime : F2 } s" );
}
Next Steps
Player Data Learn about extracting detailed player information
Performance Optimize event parsing for better performance