public async ValueTask OnPlayerMovement(IPlayerMovementEvent e)
        {
            if (CodeAndInfos.ContainsKey(e.Game))
            {
                List <IClientPlayer> impostors = CodeAndInfos[e.Game].impostors;
                ConcurrentDictionary <IClientPlayer, Vector2> frozens = CodeAndInfos[e.Game].frozens;
                IEnumerable <IClientPlayer> crewmates = e.Game.Players.Except(impostors).Except(frozens.Keys);

                if (frozens.ContainsKey(e.ClientPlayer))
                {
                    if (frozens.TryGetValue(e.ClientPlayer, out var position))
                    {
                        await e.ClientPlayer.Character.NetworkTransform.SnapToAsync(position);
                    }
                    else
                    {
                        _logger.LogWarning($"[FTag] Could not read position from ConcurrentDictionary for frozen player: {e.ClientPlayer.Character.PlayerInfo.PlayerName} in {e.Game.Code}");
                    }
                    return;
                }

                if (crewmates.Contains(e.ClientPlayer))
                {
                    var sun = e.ClientPlayer;
                    foreach (var pair in frozens)
                    {
                        IClientPlayer frozen   = pair.Key;
                        Vector2       position = pair.Value;
                        if (sun != frozen && CheckIfColliding(sun, frozen))
                        {
                            await Unfreeze(frozen).ConfigureAwait(true);

                            frozens.Remove(frozen, out _);
                        }
                    }
                }

                if (impostors.Contains(e.ClientPlayer))
                {
                    var impostor = e.ClientPlayer;
                    foreach (var crewmate in crewmates)
                    {
                        if (CheckIfColliding(crewmate, impostor))
                        {
                            frozens.TryAdd(crewmate, crewmate.Character.NetworkTransform.Position);
                            await crewmate.Character.SetColorAsync(ColorType.Blue);

                            if (!crewmates.Any())
                            {
                                foreach (var nonImpostor in e.Game.Players.Except(impostors))
                                {
                                    await nonImpostor.KickAsync();
                                }
                            }
                        }
                    }
                }
            }
        }
        public void OnPlayerMove(IPlayerMovementEvent e)
        {
            var position = e.PlayerControl.NetworkTransform.Position;

            _proximityHub.Clients.Group(e.Game.Code).PlayerMove(
                e.PlayerControl.PlayerInfo.PlayerName,
                new Pose(position.X, position.Y));
        }
 public void OnPlayerMovement(IPlayerMovementEvent evt) => Interlocked.Increment(ref _movementsPerSecond);
Esempio n. 4
0
 public void OnPlayerMovement(IPlayerMovementEvent evt)
 {
     Interlocked.Increment(ref OnPlayerMovementCount);
 }