public void PlayerPawnDontAddWhenMissingChannelTest() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(1, state); var pawn = new PlayerPawn() { PlayerState = 100, Pickaxe = new ItemDefinition() { Name = "raiders revenge" } }; builder.UpdatePlayerPawn(2, pawn); builder.Build(replay); Assert.Null(replay.PlayerData.First().Cosmetics.Pickaxe); }
public PlayerData(FortPlayerState playerState) { Id = playerState.PlayerID; EpicId = playerState.UniqueId; BotId = playerState.BotUniqueId; IsBot = playerState.bIsABot; PlayerNameCustomOverride = playerState.PlayerNameCustomOverride?.Text; IsGameSessionOwner = playerState.bIsGameSessionOwner; PlayerName = playerState.PlayerNamePrivate; StreamerModeName = playerState.StreamerModeName?.Text; IsPartyLeader = playerState.PartyOwnerUniqueId == playerState.UniqueId; TeamIndex = playerState.TeamIndex; Level = playerState.Level; SeasonLevelUIDisplay = playerState.SeasonLevelUIDisplay; Platform = playerState.Platform; HasFinishedLoading = playerState.bHasFinishedLoading; HasStartedPlaying = playerState.bHasStartedPlaying; IsUsingAnonymousMode = playerState.bUsingAnonymousMode; IsUsingStreamerMode = playerState.bUsingStreamerMode; HasEverSkydivedFromBus = playerState.bHasEverSkydivedFromBus; HasEverSkydivedFromBusAndLanded = playerState.bHasEverSkydivedFromBusAndLanded; Cosmetics = new Cosmetics() { CharacterBodyType = playerState.CharacterBodyType, HeroType = playerState.HeroType?.Name, CharacterGender = playerState.CharacterGender }; }
public void PlayerStateUpdatesTotalKillsTest() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, KillScore = 1, TeamKillScore = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Equal(1u, replay.PlayerData.First().Kills); Assert.Equal(1u, replay.PlayerData.First().TeamKills); state = new FortPlayerState() { KillScore = 2, TeamKillScore = 3, }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Equal(2u, replay.PlayerData.First().Kills); Assert.Equal(3u, replay.PlayerData.First().TeamKills); }
public void PlayerStateUpdateKillFeedTest() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(1, state); builder.Build(replay); state = new FortPlayerState() { DeathCause = 1 }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.NotEmpty(replay.KillFeed); Assert.Equal(1, replay.KillFeed.First().PlayerId); }
public void PlayerStateMarksReplayOwnerTest() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Equal(1, replay.PlayerData.First().Id); Assert.Equal("abc-123", replay.PlayerData.First().PlayerId); Assert.Equal("bandolier", replay.PlayerData.First().Cosmetics.HeroType); state = new FortPlayerState() { Ping = 1, }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Contains(replay.PlayerData, i => i.IsReplayOwner); }
public void PlayerStateMarksReplayOwnerTest() { var gameState = new GameState() { RecorderPlayerState = new ActorGuid { Value = 1 } }; builder.UpdateGameState(gameState); var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.AddActorChannel(1, 1); builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Contains(replay.PlayerData, i => i.IsReplayOwner); }
public void PlayerStateSkipsSpectatorsTest() { var state = new FortPlayerState() { PlayerID = 1, bOnlySpectator = true }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Empty(replay.PlayerData); }
public void UpdatePlayerState(uint channelIndex, FortPlayerState state) { if (state.bOnlySpectator == true) { _onlySpectatingPlayers.Add(channelIndex); return; } if (_onlySpectatingPlayers.Contains(channelIndex)) { return; } if (!_players.TryGetValue(channelIndex, out var playerData)) { _players[channelIndex] = new PlayerData(state); return; } if (state.RebootCounter > 0 && state.RebootCounter > playerData.RebootCounter) { playerData.RebootCounter = state.RebootCounter; } if (state.RebootCounter > 0 || state.bDBNO != null || state.DeathCause != null) { UpdateKillFeed(channelIndex, playerData, state); } if (state.Ping > 0) { // workaround playerData.IsReplayOwner = true; } playerData.Placement ??= state.Place; playerData.TeamKills ??= state.TeamKillScore; playerData.Kills ??= state.KillScore; playerData.HasThankedBusDriver ??= state.bThankedBusDriver; playerData.DeathCause ??= state.DeathCause; playerData.DeathLocation ??= state.DeathLocation; playerData.DeathCircumstance ??= state.DeathCircumstance; playerData.DeathTags ??= state.DeathTags?.Tags?.Select(i => i.TagName); playerData.Cosmetics.Parts ??= state.Parts?.Name; playerData.Cosmetics.VariantRequiredCharacterParts ??= state.VariantRequiredCharacterParts?.Select(i => i.Name); }
public void PlayerStateHandlesBotsTest() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "", BotUniqueId = "NotABot", bIsABot = true, TeamIndex = 2, HeroType = new ItemDefinition() { Name = "default" } }; builder.UpdatePlayerState(1, state); builder.Build(replay); Assert.Equal(1, replay.PlayerData.First().Id); Assert.Equal("NotABot", replay.PlayerData.First().PlayerId); Assert.Equal("default", replay.PlayerData.First().Cosmetics.HeroType); }
public void UpdateKillFeed(uint channelIndex, PlayerData data, FortPlayerState state) { var entry = new KillFeedEntry() { ReplicatedWorldTimeSeconds = ReplicatedWorldTimeSeconds }; if (state.RebootCounter != null) { entry.IsRevived = true; } if (state.bDBNO == true) { entry.IsDowned = true; } if (_actorToChannel.TryGetValue(state.FinisherOrDowner.GetValueOrDefault(), out var actorChannelIndex)) { if (_players.TryGetValue(actorChannelIndex, out var finisherOrDownerData)) { entry.FinisherOrDowner = finisherOrDownerData.Id; entry.FinisherOrDownerName = finisherOrDownerData.PlayerId; entry.FinisherOrDownerIsBot = finisherOrDownerData.IsBot == true; } } entry.PlayerId = data.Id; entry.PlayerName = data.PlayerId; entry.PlayerIsBot = data.IsBot == true; entry.Distance ??= state.Distance; entry.DeathCause ??= state.DeathCause; entry.DeathLocation ??= state.DeathLocation; entry.DeathCircumstance ??= state.DeathCircumstance; entry.DeathTags ??= state.DeathTags?.Tags?.Select(i => i.TagName); KillFeed.Add(entry); }
public void PlayerPawnUpdatesStateChannel() { var state = new FortPlayerState() { PlayerID = 1, UniqueId = "abc-123", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(1, state); builder.AddActorChannel(1, 100); var pawn = new PlayerPawn() { PlayerState = 100, Pickaxe = new ItemDefinition() { Name = "raiders revenge" } }; builder.UpdatePlayerPawn(2, pawn); var state2 = new FortPlayerState() { PlayerID = 2, UniqueId = "123-abc", BotUniqueId = "", bIsABot = false, TeamIndex = 1, HeroType = new ItemDefinition() { Name = "bandolier" } }; builder.UpdatePlayerState(3, state2); builder.AddActorChannel(3, 101); var pawn2 = new PlayerPawn() { PlayerState = 101, Glider = new ItemDefinition() { Name = "umbrella" } }; builder.AddActorChannel(3, 101); builder.UpdatePlayerPawn(2, pawn2); builder.Build(replay); Assert.Equal("raiders revenge", replay.PlayerData.First().Cosmetics.Pickaxe); Assert.Null(replay.PlayerData.First().Cosmetics.Glider); Assert.Equal("umbrella", replay.PlayerData.Last().Cosmetics.Glider); }