Exemple #1
0
    /// <summary>
    /// Dispose of all request received before game start
    /// ServerGameManager will dispose of others during games.
    /// </summary>
    protected override void Response()
    {
        while (ReceiveRequestsQueue.Count > 0)
        {
            ClientRequestBase request = ReceiveRequestsQueue.Dequeue();
            // Server 端特例覆写GameProxy
            switch (request)
            {
            case RegisterRequest r:     //for online mode
            {
                ServerLog.Instance.PrintClientStates("Client " + ClientID + " state: " + ClientState);
                if (ClientState != ClientStates.GetId)
                {
                    Server.SV.SGMM.RemoveGame(this);
                    ClientState = ClientStates.GetId;
                }

                bool suc = UserDatabase.Instance.AddUser(r.username, r.password);
                RegisterResultRequest response = new RegisterResultRequest(suc);
                SendMessage(response);
                break;
            }

            case LoginRequest r:
            {
                ServerLog.Instance.PrintClientStates("Client " + ClientID + " state: " + ClientState);

                if (ClientState != ClientStates.GetId)
                {
                    Server.SV.SGMM.RemoveGame(this);
                    ClientState = ClientStates.GetId;
                }

                if (ClientState == ClientStates.GetId)
                {
                    LoginResultRequest response;
                    string             password = UserDatabase.Instance.GetUserPasswordByUsername(r.username);
                    if (password != null)
                    {
                        if (password == r.password)
                        {
                            bool suc = UserDatabase.Instance.AddLoginUser(ClientID, r.username);
                            if (suc)
                            {
                                response = new LoginResultRequest(r.username, LoginResultRequest.StateCodes.Success);
                                SendMessage(response);
                                ClientState = ClientStates.Login;
                                UserName    = r.username;

                                if (BuildStoryDatabase.Instance.PlayerStoryStates.ContainsKey(UserName))
                                {
                                    Story story = BuildStoryDatabase.Instance.PlayerStoryStates[UserName];
                                    ClientBuildInfosRequest request1 = new ClientBuildInfosRequest(BuildStoryDatabase.Instance.GetPlayerBuilds(UserName), GamePlaySettings.OnlineGamePlaySettings, true, story);
                                    SendMessage(request1);
                                }
                                else
                                {
                                    ClientBuildInfosRequest request1 = new ClientBuildInfosRequest(BuildStoryDatabase.Instance.GetPlayerBuilds(UserName), GamePlaySettings.OnlineGamePlaySettings);
                                    SendMessage(request1);
                                }
                            }
                            else
                            {
                                response = new LoginResultRequest(r.username, LoginResultRequest.StateCodes.AlreadyOnline);
                                SendMessage(response);
                            }
                        }
                        else
                        {
                            response = new LoginResultRequest(r.username, LoginResultRequest.StateCodes.WrongPassword);
                            SendMessage(response);
                        }
                    }
                    else
                    {
                        response = new LoginResultRequest(r.username, LoginResultRequest.StateCodes.UnexistedUser);
                        SendMessage(response);
                    }
                }

                break;
            }

            case LogoutRequest r:
            {
                ServerLog.Instance.PrintClientStates("Client " + ClientID + " state: " + ClientState);
                LogoutResultRequest response;
                if (ClientState != ClientStates.GetId)
                {
                    Server.SV.SGMM.RemoveGame(this);
                    bool suc = UserDatabase.Instance.RemoveLoginUser(ClientID);
                    ClientState = ClientStates.GetId;
                    response    = new LogoutResultRequest(r.username, suc);
                }
                else
                {
                    response = new LogoutResultRequest(r.username, false);
                }

                SendMessage(response);
                break;
            }

            case MatchRequest r:

                ServerLog.Instance.PrintClientStates("Client " + ClientID + " state: " + ClientState);

                if (ClientState == ClientStates.Playing)
                {
                    Server.SV.SGMM.RemoveGame(this);
                    ClientState = ClientStates.Login;
                }

                if (ClientState == ClientStates.Login)
                {
                    GameProxy.BattleProxy.BuildInfo = BuildStoryDatabase.Instance.GetBuildInfoByID(r.buildID);
                    ClientState = ClientStates.Matching;
                    Server.SV.SGMM.OnClientMatchGames(this);
                }

                break;

            case CancelMatchRequest _:

                ServerLog.Instance.PrintClientStates("Client " + ClientID + " state: " + ClientState);

                if (ClientState == ClientStates.Playing)
                {
                    Server.SV.SGMM.RemoveGame(this);
                    ClientState = ClientStates.Login;
                }

                if (ClientState == ClientStates.Matching)
                {
                    ClientState = ClientStates.Login;
                    Server.SV.SGMM.OnClientCancelMatch(this);
                }

                break;

            default:
                GameProxy.ReceiveRequest(request);
                break;
            }
        }
    }