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); }
internal void RaiseEvent(MatchUserEvent.Type type, MatchUser user, MatchState state) { this.eventHandler?.Invoke(type, user, state); }
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; } }