コード例 #1
0
 private void ValidateReservationState(PlayerSlotReservationState reservationState)
 {
     if (reservationState == PlayerSlotReservationState.Reserved)
     {
         throw new InvalidReservationRejectionReasonException();
     }
 }
コード例 #2
0
        public void HandleRejectedReservation(string correlationId, PlayerSlotReservationState reservationState)
        {
            if (CurrentState == ClientBridgeState.Disconnected)
            {
                return;
            }

            try
            {
                if (CurrentState != ClientBridgeState.WaitingForRerservation)
                {
                    throw new ProhibitedReservationRejectionException();
                }

                ValidateCorrelationId(correlationId);
                ConfirmCorrelationId(correlationId);
                ValidateReservationState(reservationState);

                ReservationKey   = null;
                ReservationState = reservationState;

                CurrentState = ClientBridgeState.ReservationRejected;
            }
            catch (Exception ex)
            {
                TryStopClient();
                CurrentState = ClientBridgeState.Failed;
                throw ex;
            }
        }
コード例 #3
0
        public PlayerSlotReservation ReservePlayerSlot(string correlationId, string playerId)
        {
            if (currentPlayerNames.Contains(playerId))
            {
                PlayerSlotReservationState rejectedReservationState = PlayerSlotReservationState.Rejected | PlayerSlotReservationState.UniquePlayerNameConstraintViolated;
                return(new PlayerSlotReservation(correlationId, rejectedReservationState));
            }

            string reservationKey             = Guid.NewGuid().ToString();
            PlayerSlotReservation reservation = new PlayerSlotReservation(correlationId, reservationKey, playerId);

            lock (reservations)
            {
                reservations.Add(reservationKey, reservation);
            }

            return(reservation);
        }
コード例 #4
0
ファイル: Extensions.cs プロジェクト: snoopybeegle/Subnautica
        public static string Describe(this PlayerSlotReservationState currentState)
        {
            StringBuilder descriptionBuilder = new StringBuilder();

            foreach (string reservationStateName in Enum.GetNames(typeof(PlayerSlotReservationState)))
            {
                PlayerSlotReservationState reservationState = (PlayerSlotReservationState)Enum.Parse(typeof(PlayerSlotReservationState), reservationStateName);
                if (currentState.HasStateFlag(reservationState))
                {
                    DescriptionAttribute descriptionAttribute = reservationState.GetAttribute <DescriptionAttribute>();

                    if (!string.IsNullOrEmpty(descriptionAttribute?.Description))
                    {
                        descriptionBuilder.AppendLine(descriptionAttribute.Description);
                    }
                }
            }

            return(descriptionBuilder.ToString());
        }
コード例 #5
0
        private void RenderUnableToJoinDialog(int windowId)
        {
            Event e = Event.current;

            if (e.isKey)
            {
                switch (e.keyCode)
                {
                case KeyCode.Return:
                    joiningServer         = true;
                    notifyingUnableToJoin = false;
                    break;

                case KeyCode.Escape:
                    joiningServer         = true;
                    notifyingUnableToJoin = false;
                    break;
                }
            }

            GUISkinUtils.RenderWithSkin(GetGUISkin("dialogs.server.rejected", 490), () =>
            {
                using (new GUILayout.VerticalScope("Box"))
                {
                    using (new GUILayout.HorizontalScope())
                    {
                        PlayerSlotReservationState reservationState = Multiplayer.Logic.ClientBridge.ReservationState;
                        string reservationStateDescription          = reservationState.Describe();

                        GUILayout.Label(reservationStateDescription);
                    }

                    if (GUILayout.Button("OK"))
                    {
                        joiningServer         = true;
                        notifyingUnableToJoin = false;
                    }
                }
            });
        }
コード例 #6
0
ファイル: Extensions.cs プロジェクト: snoopybeegle/Subnautica
 public static bool HasStateFlag(this PlayerSlotReservationState currentState, PlayerSlotReservationState checkedState)
 {
     return((currentState & checkedState) == checkedState);
 }
コード例 #7
0
 public PlayerSlotReservation(string correlationId, PlayerSlotReservationState reservationState)
 {
     CorrelationId    = correlationId;
     ReservationState = reservationState;
 }