Overview
The GameInformation.Players collection contains detailed information about all players in a match. Each Player object provides access to stats, locations, inventory, health changes, and more.
Accessing Players
After parsing a replay, access players through the GameInformation object:
using FortniteReplayReader ;
using Unreal . Core . Models . Enums ;
var reader = new ReplayReader ();
var replay = reader . ReadReplay ( "replay.replay" , ParseType . Full );
// Get all players
var players = replay . GameInformation . Players ;
foreach ( var player in players )
{
Console . WriteLine ( $" { player . DisplayName } - Placement: { player . Placement } " );
}
Player Properties
The Player class exposes a wide range of properties:
Player’s display name (decoded from external player data)
Platform the player is using (PC, Console, Mobile)
Whether the player is a bot
Bot identifier if applicable
Reference to the player’s team object
Match Stats
var player = players . First ();
Console . WriteLine ( $"Kills: { player . TotalKills } " );
Console . WriteLine ( $"Team Kills: { player . TeamKills } " );
Console . WriteLine ( $"Placement: { player . Placement } " );
Console . WriteLine ( $"Level: { player . Level } " );
Console . WriteLine ( $"Thanked Bus Driver: { player . ThankedBusDriver } " );
Total eliminations by this player
Number of team eliminations
Final placement in the match
Whether player thanked the bus driver
Player State
var player = players . First ();
Console . WriteLine ( $"Is Replay Owner: { player . IsPlayersReplay } " );
Console . WriteLine ( $"Disconnected: { player . Disconnected } " );
Console . WriteLine ( $"Streamer Mode: { player . StreamerMode } " );
Console . WriteLine ( $"Anonymous Mode: { player . AnonMode } " );
True if this is the player who recorded the replay
Whether the player disconnected during the match
Whether the player had streamer mode enabled
Whether the player had anonymous mode enabled
Location Tracking
Location tracking requires ParseType.Normal or higher and appropriate PlayerLocationType settings.
Players have multiple location collections depending on the data source:
Locations Collection
The primary location tracking from player pawn updates:
var player = players . First ();
foreach ( var location in player . Locations )
{
Console . WriteLine ( $"Time: { location . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Position: { location . Location } " );
Console . WriteLine ( $"Yaw: { location . Yaw } " );
Console . WriteLine ( $"In Vehicle: { location . InVehicle } " );
Console . WriteLine ( $"State: { location . CurrentPlayerState } " );
Console . WriteLine ();
}
Locations
List<PlayerLocationRepMovement>
Collection of player positions throughout the match
PlayerLocationRepMovement Properties:
Location - FVector containing X, Y, Z coordinates
Yaw - Player’s rotation/facing direction
DeltaGameTimeSeconds - Time since match start
WorldTime - Absolute world time
InVehicle - Whether player is in a vehicle
CurrentPlayerState - Player state (Alive, Knocked, Killed)
MovementInformation - Detailed movement state
PrivateTeamLocations Collection
Locations from team information (usually less frequent):
foreach ( var location in player . PrivateTeamLocations )
{
Console . WriteLine ( $"Position: { location . Location } " );
Console . WriteLine ( $"Yaw: { location . Yaw } " );
Console . WriteLine ( $"World Time: { location . WorldTime } " );
}
Landing Location
var player = players . First ();
if ( player . LandingLocation != null )
{
Console . WriteLine ( $"Landed at: { player . LandingLocation . Location } " );
Console . WriteLine ( $"Landing time: { player . LandingLocation . WorldTime } " );
}
Last Known Location
var lastLocation = player . LastKnownLocation ;
if ( lastLocation != null )
{
Console . WriteLine ( $"Last known position: { lastLocation . Location } " );
}
Inventory Tracking
Inventory tracking requires ParseType.Full and IgnoreInventory = false in settings.
Current Inventory
var player = players . First ();
foreach ( var item in player . CurrentInventory . Items )
{
Console . WriteLine ( $"Item: { item . Item . Name } " );
Console . WriteLine ( $"Count: { item . Count } " );
Console . WriteLine ( $"Loaded Ammo: { item . LoadedAmmo } " );
Console . WriteLine ( $"Unique ID: { item . UniqueWeaponId } " );
Console . WriteLine ();
}
CurrentInventory
NetDeltaArray<InventoryItem>
Player’s current inventory items
InventoryItem Properties:
Item - Item name and type information
Count - Stack count (e.g., ammo, materials)
LoadedAmmo - Ammo currently loaded in weapon
UniqueWeaponId - Unique identifier for this weapon instance
Weapon - Reference to the weapon object (if equipped)
Inventory on Death
if ( player . InventoryOnDeath . Any ())
{
Console . WriteLine ( $"Items at time of death:" );
foreach ( var item in player . InventoryOnDeath )
{
Console . WriteLine ( $"- { item . Item . Name } (x { item . Count } )" );
}
}
Weapon Data
Current Weapon
var currentWeapon = player . CurrentWeapon ;
if ( currentWeapon != null )
{
Console . WriteLine ( $"Weapon: { currentWeapon . Item . Name } " );
Console . WriteLine ( $"Level: { currentWeapon . WeaponLevel } " );
Console . WriteLine ( $"Ammo: { currentWeapon . Ammo } " );
Console . WriteLine ( $"Is Reloading: { currentWeapon . IsReloading } " );
Console . WriteLine ( $"Is Equipping: { currentWeapon . IsEquipping } " );
}
Weapon Switches
Requires IgnoreWeaponSwitches = false in settings.
foreach ( var weaponSwitch in player . WeaponSwitches )
{
Console . WriteLine ( $"Time: { weaponSwitch . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Weapon: { weaponSwitch . Weapon . Item . Name } " );
Console . WriteLine ( $"State: { weaponSwitch . State } " );
Console . WriteLine ();
}
Health Tracking
Health tracking requires IgnoreHealth = false in settings.
foreach ( var healthUpdate in player . HealthChanges )
{
Console . WriteLine ( $"Time: { healthUpdate . DeltaGameTimeSeconds : F2 } s" );
var health = healthUpdate . Health . HealthFortSet ;
if ( health != null )
{
Console . WriteLine ( $"Health: { health . CurrentValue } / { health . Maximum } " );
}
var shield = healthUpdate . Health . ShieldFortSet ;
if ( shield != null )
{
Console . WriteLine ( $"Shield: { shield . CurrentValue } / { shield . Maximum } " );
}
Console . WriteLine ();
}
Combat Data
Shots Fired
Requires IgnoreShots = false in settings.
foreach ( var shot in player . Shots )
{
Console . WriteLine ( $"Time: { shot . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Weapon: { shot . Weapon ? . Item . Name } " );
Console . WriteLine ( $"Damage: { shot . Damage } " );
Console . WriteLine ( $"Critical: { shot . IsCritical } " );
Console . WriteLine ( $"Fatal: { shot . IsFatal } " );
if ( shot . HitPlayerPawn != null )
{
var hitPlayer = shot . HitPlayerPawn as Player ;
Console . WriteLine ( $"Hit: { hitPlayer ? . DisplayName } " );
}
Console . WriteLine ();
}
Damage Taken
foreach ( var damage in player . DamageTaken )
{
Console . WriteLine ( $"Time: { damage . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Damage: { damage . Damage } " );
Console . WriteLine ( $"Hit Shield: { damage . IsShield } " );
Console . WriteLine ( $"Shield Destroyed: { damage . IsShieldDestroyed } " );
if ( damage . ShotByPlayerPawn != null )
{
Console . WriteLine ( $"Attacker: { damage . ShotByPlayerPawn . DisplayName } " );
}
Console . WriteLine ();
}
Status Changes
Track player state changes (knocked, killed, revived):
foreach ( var status in player . StatusChanges )
{
Console . WriteLine ( $"Time: { status . DeltaGameTimeSeconds : F2 } s" );
Console . WriteLine ( $"Player: { status . Player . DisplayName } " );
Console . WriteLine ( $"State: { status . CurrentPlayerState } " );
if ( status . FinisherOrDowner != null )
{
Console . WriteLine ( $"By: { status . FinisherOrDowner . DisplayName } " );
}
if ( status . DeathCause != EDeathCause . EDeathCause_MAX )
{
Console . WriteLine ( $"Cause: { status . DeathCause } " );
}
Console . WriteLine ();
}
Cosmetics
Access player cosmetic items:
var cosmetics = player . Cosmetics ;
Console . WriteLine ( $"Character: { cosmetics . Character } " );
Console . WriteLine ( $"Backpack: { cosmetics . Backpack } " );
Console . WriteLine ( $"Pickaxe: { cosmetics . Pickaxe } " );
Console . WriteLine ( $"Glider: { cosmetics . Glider } " );
Console . WriteLine ( $"Music Pack: { cosmetics . MusicPack } " );
Console . WriteLine ( $"Loading Screen: { cosmetics . LoadingScreen } " );
Console . WriteLine ( $"Sky Dive Contrail: { cosmetics . SkyDiveContrail } " );
Console . WriteLine ( $"Pet Skin: { cosmetics . PetSkin } " );
if ( cosmetics . Dances != null )
{
Console . WriteLine ( $"Dances: { string . Join ( ", " , cosmetics . Dances )} " );
}
if ( cosmetics . ItemWraps != null )
{
Console . WriteLine ( $"Wraps: { string . Join ( ", " , cosmetics . ItemWraps )} " );
}
Complete Example
Here’s a comprehensive example that extracts multiple types of player data:
using FortniteReplayReader ;
using FortniteReplayReader . Models ;
using Unreal . Core . Models . Enums ;
var reader = new ReplayReader ( null , new FortniteReplaySettings
{
PlayerLocationType = LocationTypes . All ,
LocationChangeDeltaMS = 1000 ,
IgnoreHealth = false ,
IgnoreShots = false
});
var replay = reader . ReadReplay ( "replay.replay" , ParseType . Full );
foreach ( var player in replay . GameInformation . Players . OrderBy ( p => p . Placement ))
{
Console . WriteLine ( $" \n === { player . DisplayName ?? player . EpicId } ===" );
Console . WriteLine ( $"Placement: { player . Placement } " );
Console . WriteLine ( $"Kills: { player . TotalKills } " );
Console . WriteLine ( $"Platform: { player . Platform } " );
Console . WriteLine ( $"Is Bot: { player . IsBot } " );
if ( player . LandingLocation != null )
{
Console . WriteLine ( $"Landing: { player . LandingLocation . Location } " );
}
Console . WriteLine ( $"Total Locations Tracked: { player . Locations . Count } " );
Console . WriteLine ( $"Shots Fired: { player . Shots . Count } " );
Console . WriteLine ( $"Damage Taken: { player . DamageTaken . Count } " );
Console . WriteLine ( $"Health Changes: { player . HealthChanges . Count } " );
if ( player . CurrentWeapon != null )
{
Console . WriteLine ( $"Final Weapon: { player . CurrentWeapon . Item . Name } " );
}
}
Next Steps
Game Events Learn about elimination and event extraction
Configuration Optimize settings for your use case