Exemplo n.º 1
0
        protected virtual async Task <IRemoteService> CreateLogicServiceAsync(ClientEnterGameRequest enter_game)
        {
            var cfg = await InitConfig();

            var ret = await this.Provider.CreateAsync(
                ServerNames.GetLogicServiceAddress(enter_game.c2s_roleUUID, this.SelfAddress.ServiceNode), cfg);

            this.remote_logic_service = ret;
            return(ret);
        }
Exemplo n.º 2
0
 public virtual Task <ServerPassportEnterGame> VerifyEnterGameAsync(ClientEnterServerRequest server, ClientEnterGameRequest req)
 {
     return(Task.FromResult(new ServerPassportEnterGame()
     {
         Verified = true
     }));
 }
Exemplo n.º 3
0
        public virtual async Task <ClientEnterGameResponse> client_rpc_Handle(ClientEnterGameRequest enter)
        {
            //第三方/一号通验证//
            var serverPassportResult = await RPGServerManager.Instance.Passport.VerifyEnterGameAsync(this.enter, enter);

            if (!serverPassportResult.Verified)
            {
                return(new ClientEnterGameResponse()
                {
                    s2c_code = ClientEnterGameResponse.CODE_ROLE_SUSPEND,
                    s2c_msg = serverPassportResult.Message
                });
            }

            //log.Log("ClientEnterGameRequest");

            #region 账号封停验证.

            var statusSnap = await queryRoleDataStatusSnap.LoadDataAsync(enter.c2s_roleUUID);

            if (statusSnap != null)
            {
                //没过期代表已封停.
                if (!((DateTime.UtcNow - statusSnap.SuspendDate).TotalMilliseconds > 0))
                {
                    return(new ClientEnterGameResponse()
                    {
                        s2c_code = ClientEnterGameResponse.CODE_ROLE_SUSPEND,
                        s2c_suspendTime = statusSnap.SuspendDate
                    });
                }
            }

            #endregion

            last_heartbeat  = DateTime.Now;
            this.enter_game = enter;
            bool reconnect = false;
            var  rec       = new SessionReconnectNotify();

            rec.sessionName = SelfAddress.ServiceName;
            if (enter_game != null)
            {
                rec.roleID = enter_game.c2s_roleUUID;
            }

            var logic = remote_logic_service;
            if (logic != null)
            {
                var oldRoleID = logic.Config["roleID"].ToString();
                if (oldRoleID != enter.c2s_roleUUID)
                {
                    log.WarnFormat(string.Format("Role Already Login : Acc={0} : Role={1} -> {2}", accountID, oldRoleID,
                                                 enter.c2s_roleUUID));
                    //cb(new ClientEnterGameResponse() { s2c_code = ClientEnterGameResponse.CODE_LOGIC_ALREADY_LOGIN });
                    await logic.ShutdownAsync("switch role");

                    logic = await this.CreateLogicServiceAsync(enter);

                    //return;
                }
                else
                {
                    log.InfoFormat(string.Format("Role Reconnect : Acc={0} : Role={1}", accountID, enter.c2s_roleUUID));
                    reconnect  = true;
                    rec.config = await InitConfig();
                }
            }
            else
            {
                log.InfoFormat(string.Format("Role Connect : Acc={0} : Role={1}", accountID, enter.c2s_roleUUID));
                logic = await this.CreateLogicServiceAsync(enter);
            }

            if (logic != null)
            {
                accountSave.SetField(nameof(AccountData.lastLoginRoleID), enter.c2s_roleUUID);
                await accountSave.FlushAsync();

                try
                {
                    mDisconnected = false;
                    var ret = await logic.CallAsync <ClientEnterGameResponse>(enter);

                    //log.Log("ClientEnterGameResponse: " + ret.IsSuccess);
                    return(ret);
                }
                finally
                {
                    if (reconnect)
                    {
                        logic.Invoke(rec);
                    }
                }
            }
            else
            {
                return(new ClientEnterGameResponse()
                {
                    s2c_code = ClientEnterGameResponse.CODE_LOGIC_NOT_FOUND,
                });
            }
        }