Skip to main content

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

Eliminated
string
ID of the eliminated player
Eliminator
string
ID of the player who got the elimination
DeathCause
EDeathCause
Cause of death (weapon type, fall damage, storm, etc.)
Knocked
bool
Whether this was a knock or full elimination
Timestamp
uint
Time of elimination in milliseconds
Time
string
Formatted timestamp (MM:SS)
Distance
double
Distance between eliminator and eliminated in meters
ValidDistance
bool
Whether distance calculation is valid
SelfElimination
bool
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

var playerElims = replay.Eliminations
    .Where(e => e.Eliminator == "player-epic-id")
    .ToList();

Console.WriteLine($"Total Eliminations: {playerElims.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

Accuracy
float
Weapon accuracy percentage (0-1)
Assists
uint
Number of elimination assists
Eliminations
uint
Total eliminations
WeaponDamage
uint
Total damage dealt with weapons
OtherDamage
uint
Damage from other sources (storm, fall, etc.)
Revives
uint
Number of teammate revives
DamageTaken
uint
Total damage taken
DamageToStructures
uint
Damage dealt to structures
MaterialsGathered
uint
Total materials harvested
MaterialsUsed
uint
Total materials used for building
TotalTraveled
uint
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 Zone Information

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

CurrentRadius
float
Current storm circle radius
Radius
float
Base radius at zone creation
NextRadius
float
Radius after current shrink
NextNextRadius
float
Radius for the following zone
ShrinkStartTime
float
When the zone starts shrinking
ShringEndTime
float
When the zone finishes shrinking
LastCenter
FVector
Current zone center
NextCenter
FVector
Next zone center
NextNextCenter
FVector
Center for the following zone

Battle Bus Information

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}");

Game State Information

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

Build docs developers (and LLMs) love