public JoinRoomResponseCode TryAddClientConnection(PlayerAuthenticationModel playerAuthModel, IClientConnection clientConnection, string roomPassword)
        {
            lock (_lock)
            {
                if (roomPassword != Password)
                {
                    Log.Info("Invalid room password specified");
                    return(JoinRoomResponseCode.InvalidRoomPassword);
                }
                if (disposed)
                {
                    Log.Info("Room has expired");
                    return(JoinRoomResponseCode.RoomExpired);
                }

                JoinRoomResponseCode responseCode = JoinRoomResponseCode.UnknownFailure;
                if (gameController.IsGameActive)
                {
                    // TODO: rejoin
                    if (!gameController.RejoinPlayer(playerAuthModel, clientConnection))
                    {
                        return(responseCode);
                    }
                    responseCode = JoinRoomResponseCode.AddedToExistingGame;
                }
                else
                {
                    // Add to lobby
                    lobbyController.AddPlayerForConnection(playerAuthModel, clientConnection);
                    responseCode = JoinRoomResponseCode.AddedToLobby;
                }

                if (responseCode != JoinRoomResponseCode.AddedToExistingGame && responseCode != JoinRoomResponseCode.AddedToLobby)
                {
                    Log.Info("Failed to join room");
                    return(responseCode);
                }

                if (tearDownTimer.Enabled)
                {
                    Log.Info(">>>> Player successfully joined room, disabling tearDownTimer.");
                    tearDownTimer.Enabled = false;
                }

                Log.Info("Player ID: " + playerAuthModel.UserID + " joined room. State: " + responseCode.ToString());

                connections.Add(clientConnection);
                clientConnection.Disconnected += onClientPeerDisconnected;
                return(responseCode);
            }
        }
Beispiel #2
0
        public JoinRoomOpResponse(bool success, JoinRoomResponseCode responseCode)
        {
            Success      = success;
            ResponseCode = responseCode;

            OperationResponse            = new OperationResponse(JoinRoomOpResponse.OP_CODE, new Dictionary <byte, object>());
            OperationResponse.ReturnCode = OP_CODE;
            OperationResponse.Parameters.Add(0, Success);
            OperationResponse.Parameters.Add(1, (int)ResponseCode);

            SendParameters            = new SendParameters();
            SendParameters.ChannelId  = 0;
            SendParameters.Encrypted  = false;
            SendParameters.Unreliable = false;
        }
        private void onSessionValidated(PlayerAuthenticationModel playerAuthModel, IClientConnection clientConnection,
                                        JoinRoomOpRequest joinRoomOpRequest)
        {
            Log.Info("JoinRoomController: player session validated " + playerAuthModel.UserID + " ==> " + joinRoomOpRequest.RoomID);

            // Once client's session is validated, determine if the room will be a new or existing one.
            RoomContext roomContext = null;

            if (!roomIDToContext.TryGetValue(joinRoomOpRequest.RoomID, out roomContext))
            {
                Log.Info("Creating new room with ID: " + joinRoomOpRequest.RoomID);
                roomContext = new RoomContext(joinRoomOpRequest.RoomID, joinRoomOpRequest.Password);
                RoomContext addedRoomContext = roomIDToContext.GetOrAdd(roomContext.ID, roomContext);
                if (roomContext == addedRoomContext)
                {
                    roomContext.Destroyed += onRoomDestroyed;
                }
                else
                {
                    roomContext = addedRoomContext;
                }
            }
            else
            {
                Log.Info("Joining existing room with ID: " + roomContext.ID);
            }

            // Try adding client to the determined room.
            JoinRoomOpResponse   joinRoomOpResponse   = null;
            JoinRoomResponseCode joinRoomResponseCode = roomContext.TryAddClientConnection(playerAuthModel, clientConnection, joinRoomOpRequest.Password);

            // If we couldn't place the client into the room, respond with failure code.
            if (joinRoomResponseCode != JoinRoomResponseCode.AddedToLobby && joinRoomResponseCode != JoinRoomResponseCode.AddedToExistingGame)
            {
                joinRoomOpResponse = new JoinRoomOpResponse(false, joinRoomResponseCode);
                clientConnection.SendOperationResponse(joinRoomOpResponse.OperationResponse, joinRoomOpResponse.SendParameters);
                clientConnection.DisconnectAfterDelay();
                Log.Info("JoinRoomController: Couldn't add clientPeerConnection with ID " + clientConnection.ConnectionId + " to room with ID " + roomContext.ID + ". Code : " + joinRoomResponseCode);
                return;
            }

            // If we reach this point, the client was successfully added to a room, so respond with success.
            joinRoomOpResponse = new JoinRoomOpResponse(true, JoinRoomResponseCode.AddedToLobby);
            clientConnection.SendOperationResponse(joinRoomOpResponse.OperationResponse, joinRoomOpResponse.SendParameters);
        }