Example #1
0
        internal bool ProcessMatch(long dt)
        {
            int c1 = this._searchSpace.Count;

            if (c1 == 0)
            {
                return(false);
            }

            Grading grading = null;

            for (int i = 0; i < c1; i++)
            {
                //搜索第i层
                grading = this._searchSpace[i];
                int numUsers = grading.system.numUsers;
                int c2       = grading.users.Count;
                for (int j = 0; j < c2; j++)
                {
                    MatchUser user = grading.users[j];
                    //添加到等候室
                    if (this._matchingLounge.AddUser(user))
                    {
                        //添加事件
                        this._owner.system.RaiseEvent(MatchUserEvent.Type.AddToLounge, user, user.lounge.GetState());

                        if (this._matchingLounge.numUsers == numUsers)
                        {
                            //匹配成功
                            MatchState state = this._matchingLounge.GetState();
                            this._owner.system.RaiseEvent(MatchUserEvent.Type.MatchSuccess, null, state);
                            this.Clear();
                            return(true);
                        }
                    }
                }
            }

            //超过搜索时间,扩大搜索空间
            if (this._time >= this._expireTime && this._searchSpace.Count <= grading.maxExtends)
            {
                grading = this._searchSpace[0];
                Grading prev = null, next = null;
                //找到需要扩展的分段
                for (int i = 0; i < this._level; i++)
                {
                    prev = grading.prev;
                    if (prev == null)
                    {
                        break;
                    }
                }
                for (int i = 0; i < this._level; i++)
                {
                    next = grading.next;
                    if (next == null)
                    {
                        break;
                    }
                }
                if (prev != null && next != null)
                {
                    //随机顺序加入到搜索空间
                    double rnd = this._rnd.NextDouble();
                    if (rnd < 0.5)
                    {
                        this.ExtendSearchGrading(prev);
                        this.ExtendSearchGrading(next);
                    }
                    else
                    {
                        this.ExtendSearchGrading(next);
                        this.ExtendSearchGrading(prev);
                    }
                }
                else if (prev != null || next != null)
                {
                    this.ExtendSearchGrading(prev ?? next);
                }
            }
            this._time += dt;
            return(false);
        }
Example #2
0
 internal void RaiseEvent(MatchUserEvent.Type type, MatchUser user, MatchState state)
 {
     this.eventHandler?.Invoke(type, user, state);
 }
Example #3
0
        private void OnEvent(MatchUserEvent.Type type, MatchUser sender, MatchState state)
        {
            switch (type)
            {
            case MatchUserEvent.Type.AddToGrading:
                //{
                //	Protos.CS2GC_AddToMatch response = ProtoCreator.Q_CS2GC_AddToMatch();
                //	CS.instance.userMgr.GetUser( e.user.id ).Send( response );
                //}
                break;

            case MatchUserEvent.Type.RemoveFromGrading:
            {
                CSUser user = CS.instance.userMgr.GetUser(sender.id);
                this._userToMatchUser.Remove(user);
                Protos.CS2GC_RemoveFromMatch response = ProtoCreator.Q_CS2GC_RemoveFromMatch();
                user.Send(response);
            }
            break;

            case MatchUserEvent.Type.AddToLounge:
            case MatchUserEvent.Type.RemoveFromLounge:
            {
                Protos.CS2GC_MatchState pMatchState = ProtoCreator.Q_CS2GC_MatchState();
                for (int i = 0; i < state.numTeam; i++)
                {
                    MatchUser[] matchUsers = state.tUsers[i];
                    for (int j = 0; j < state.numUserPerTeam; j++)
                    {
                        MatchUser matchUser = matchUsers[j];
                        if (matchUser == null)
                        {
                            Protos.CS2GC_PlayerInfo playerInfo = new Protos.CS2GC_PlayerInfo
                            {
                                Vaild = false,
                            };
                            pMatchState.PlayerInfos.Add(playerInfo);
                        }
                        else
                        {
                            CSUser user = CS.instance.userMgr.GetUser(matchUser.id);
                            Protos.CS2GC_PlayerInfo playerInfo = new Protos.CS2GC_PlayerInfo
                            {
                                Vaild    = true,
                                GcNID    = user.gcNID,
                                Team     = i,
                                ActorID  = user.actorID,
                                Nickname = user.nickname,
                                Avatar   = user.avatar,
                                Gender   = user.gender,
                                Money    = user.money,
                                Diamoned = user.diamoned,
                                Rank     = user.rank
                            };
                            pMatchState.PlayerInfos.Add(playerInfo);
                        }
                    }
                }
                this.Broadcast(state.users, pMatchState);
            }
            break;

            case MatchUserEvent.Type.MatchSuccess:
                this.BeginBattle(state);
                break;
            }
        }