示例#1
0
        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
            };
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        public void PlayerStateSkipsSpectatorsTest()
        {
            var state = new FortPlayerState()
            {
                PlayerID       = 1,
                bOnlySpectator = true
            };

            builder.UpdatePlayerState(1, state);
            builder.Build(replay);
            Assert.Empty(replay.PlayerData);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#11
0
        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);
        }