public void DealWithTeamChange(QueueLogic _this, TeamChangedType type, QueueCharacter character, List <ulong> teamList, ulong characterId) { switch (type) { case TeamChangedType.Request: break; case TeamChangedType.AcceptRequest: case TeamChangedType.AcceptJoin: var queueCharacter = QueueManager.GetMatchingCharacter(characterId); if (queueCharacter != null && queueCharacter.result != null) { return; } QueueManager.PushOneCharacter(characterId, character); break; case TeamChangedType.Leave: case TeamChangedType.Kick: if (character.result == null) { QueueManager.Pop(characterId, eLeaveMatchingType.TeamChange); } break; case TeamChangedType.Disband: break; } }
public override void DealWithTeamChange(TeamChangedType type, QueueCharacter character, List <ulong> teamList, ulong characterId) { mImpl.DealWithTeamChange(this, type, character, teamList, characterId); }
public void RemoveFollowCharacter(FightQueueScene _this, QueueCharacter c) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "RemoveFollowCharacter(). c={0}, ids={1}", c.Guid, c.mDatas.Select(d => d.Id).GetDataString()); #endif _this.FollowCharacters.Remove(c); foreach (var data in c.mDatas) { var id = data.Id; QueueSceneManager.characters.Remove(id); int state; if (_this.team1.TryGetValue(id, out state)) { _this.team1.Remove(id); #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "RemoveFollowCharacter() team1.Remove id={0}", id); #endif } else if (_this.team2.TryGetValue(id, out state)) { _this.team2.Remove(id); #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "RemoveFollowCharacter() team2.Remove id={0}", id); #endif } else { Logger.Warn("FightMatchingScene LeaveScene cId={0},sceneGuid={1}", id, _this.mSceneGuid); } } }
//通知队伍进行了某个排队 private void SendTeamMatch(QueueCharacter character) { foreach (var data in character.mDatas) { SendTeamMemberMatch(data, character); } }
public void DealWithTeamChange(ActivityFubenQueue _this, TeamChangedType type, QueueCharacter character, List <ulong> teamList, ulong characterId) { switch (type) { case TeamChangedType.Request: break; case TeamChangedType.AcceptRequest: case TeamChangedType.AcceptJoin: { var queueCharacter = QueueManager.GetMatchingCharacter(characterId); if (queueCharacter != null) { if (queueCharacter.result == null) { QueueManager.Pop(characterId, eLeaveMatchingType.TeamChange); } else { return; } } QueueManager.PushOneCharacter(characterId, character); } break; case TeamChangedType.Kick: case TeamChangedType.Leave: { //characterId离队的情况 if (character.result == null) { var characterData = character.mDatas.Find(data => data.Id == characterId); if (characterData != null) { character.mDatas.Remove(characterData); } else { Logger.Error("Can't find character data for character[{0}]", characterId); } QueueManager.Remove(characterId, eLeaveMatchingType.TeamChange); } } break; case TeamChangedType.Disband: break; } }
public void Pop(QueueLogic _this, QueueCharacter character, eLeaveMatchingType type) { _this.mCharacters.Remove(character); #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "Pop mCharacters.Remove c={0}, ids={1}, type={2}", character.Guid, character.mDatas.Select(d => d.Id).GetDataString(), type); #endif if (_this.mCharacters.Count == 0) { StopTrigger(_this); } }
public void RemoveCharacterOne(FollowQueueResult _this, QueueCharacter character) { QueueResultBase.GetImpl().RemoveCharacterOne(_this, character); var scene = QueueSceneManager.GetCharacterScene(_this.Character.mDatas[0].Id); if (scene == null) { Logger.Error("In AllOK scene == null!!!"); return; } scene.RemoveFollowCharacter(character); }
//开始排队 public ErrorCodes Push(int queueId, List <CharacterSimpleData> simpleDatas, MatchingResult result) { PlayerLog.WriteLog((int)LogType.QueueMessage, "Push character={0}", simpleDatas[0].Id); var tbQuene = Table.GetQueue(queueId); if (tbQuene == null) { return(ErrorCodes.Error_FubenID); } if (tbQuene.CountLimit > 0 && simpleDatas.Count > tbQuene.CountLimit) { return(ErrorCodes.Error_QueueCountMax); } var nowCharacter = GetMatchingCharacter(simpleDatas[0].Id); if (nowCharacter != null && nowCharacter.result != null) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "Push 1 id={0}, ids = {1}", nowCharacter.Guid, nowCharacter.mDatas.Select(d => d.Id).GetDataString()); #endif nowCharacter.result.MatchingBack(simpleDatas[0].Id, false); } else { foreach (var characterSimpleData in simpleDatas) { if (QueueManager.Characters.ContainsKey(characterSimpleData.Id)) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "Push 2 id={0}", characterSimpleData.Id); #endif QueueManager.Pop(characterSimpleData.Id, eLeaveMatchingType.PushCannel); } } } var matching = GetMatching(tbQuene); var character = new QueueCharacter(matching, simpleDatas); SendTeamMatch(character); foreach (var characterSimpleData in simpleDatas) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "Push().Matching Add character={0} c={1} ids={2}", characterSimpleData.Id, character.Guid, character.mDatas.Select(d => d.Id).GetDataString()); #endif QueueManager.Characters.Add(characterSimpleData.Id, character); } matching.PushBack(character); return(ErrorCodes.OK); }
//通知某个队员,进行了某个排队 private void SendTeamMemberMatch(CharacterSimpleData data, QueueCharacter character) { TeamCharacterProxy toCharacterProxy; if (TeamServer.Instance.ServerControl.Proxys.TryGetValue(data.Id, out toCharacterProxy)) { var info = new QueueInfo(); info.QueueId = character.mLogic.mQueueId; info.NeedSeconds = character.mLogic.GetAverageTime(); info.StartTime = character.StartTime.ToBinary(); var ChattoCharacterProxy = toCharacterProxy as TeamProxy; ChattoCharacterProxy.NotifyMatchingData(info); } }
//后续排入的某个玩家进入 public void FollowCharacter(FightQueueScene _this, QueueCharacter c, int camp) { PlayerLog.WriteLog((int)LogType.QueueMessage, "FollowCharacter c={0}, ids={1}", c.Guid, c.mDatas.Select(d => d.Id).GetDataString()); var result = new FollowQueueResult(c.mLogic); result.PushOneCharacter(c); result.StartTrigger(); c.mLogic.Pop(c, eLeaveMatchingType.InTemp); _this.FollowCharacters.Add(c); foreach (var data in c.mDatas) { InitCharacter(_this, data.Id, camp); } }
//后续排队的人返回结果了 public void FollowResult(FightQueueScene _this, QueueCharacter c, int result) { if (!_this.FollowCharacters.Contains(c)) { Logger.Warn("FollowResult error! c={0},r={1}", c.Guid, result); return; } PlayerLog.WriteLog((int)LogType.QueueMessage, "FollowResult(). c={0}, ids={1}, result={2}", c.Guid, c.mDatas.Select(d => d.Id).GetDataString(), result); _this.FollowCharacters.Remove(c); Stoptrigger(_this); if (result == 0) { //拒绝了 RemoveFollowCharacter(_this, c); } else { //同意了 _this.mStateCount += c.mDatas.Count; var tbQueue = Table.GetQueue(_this.QueueId); if (_this.mStateCount == tbQueue.CountLimit * 2) { SetState(_this, SceneState.Full); } var charList = new List <ulong>(); foreach (var data in c.mDatas) { var id = data.Id; charList.Add(id); var camp = GetCharacterCamp(_this, id); if (camp == -1) { Logger.Error("FollowResult camp error!c={0}", c); return; } //把该玩家的排队队伍整理一下 QueueTeamManager.AutoEnterTeam(_this, id, camp); CoroutineFactory.NewCoroutine(NotifyCharacterSceneCamp, _this, id, camp).MoveNext(); } CoroutineFactory.NewCoroutine(NotifyCreateChangeSceneCoroutine, _this, charList, c.mDatas[0].ServerId) .MoveNext(); } }
public string GetLog(QueueCharacter _this) { var ccc = ""; var index = 0; foreach (var data in _this.mDatas) { if (index == 0) { ccc = string.Format("[{0}", data.Id); } else { ccc = string.Format("{0}|{1}", ccc, data.Id); } } ccc = string.Format("{0}]", ccc); return(ccc); }
//排队结果,添加一个队伍的人,目前只有活动副本的预约要用这个函数 public void PushOneCharacter(QueueResultBase _this, QueueCharacter queue) { queue.result = _this; foreach (var i in queue.mDatas) { if (_this.CharacterState.ContainsKey(i.Id)) { Logger.Error("result PushCharacter Same C={0}", i.Id); _this.CharacterState[i.Id] = 0; } else { _this.CharacterState.Add(i.Id, 0); } } var teamList = new List <QueueCharacter>(); teamList.Add(queue); _this.mTeamList.Add(teamList); _this.ServerId = queue.mDatas[0].ServerId; }
public void Construct(QueueCharacter _this, QueueLogic logic, List <CharacterSimpleData> datas) { _this.mDatas = datas; _this.mLogic = logic; _this.Guid = QueueCharacter.NextId++; _this.StartTime = DateTime.Now; PlayerLog.WriteLog((int)LogType.QueueMessage, "Construct Guid={0}, ids={1}", _this.Guid, datas.Select(d => d.Id).GetDataString()); #if DEBUG var matchs = QueueManager.Matchings.Values; foreach (var match in matchs) { var f = match.mCharacters.Find(c => c.mDatas[0].Id == datas[0].Id); if (f != null) { PlayerLog.WriteLog((int)LogType.QueueLog, "Duplicate queue, queueId0 = {0}, team0 = {1}, queueId1 = {2}, team1 = {3}", _this.Guid, datas.Select(d => d.Id).GetDataString(), f.Guid, f.mDatas.Select(d => d.Id).GetDataString()); } } #endif }
public void PushFront(QueueLogic _this, QueueCharacter queueC) { if (_this.mCharacters.Count == 0) { _this.StartTrigger(); } PlayerLog.WriteLog((int)LogType.QueueMessage, "PushFront queueC={1},character={0}", queueC.mDatas[0].Id, queueC.Guid); queueC.result = null; #if DEBUG foreach (var data in queueC.mDatas) { var t = QueueManager.GetMatchingCharacter(data.Id); if (t == null) { PlayerLog.WriteLog((ulong)LogType.QueueMessage, "PushFront t == null!! c = {0} ids = {1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); } } foreach (var queueCharacter in _this.mCharacters) { foreach (var datas in queueCharacter.mDatas) { foreach (var data in queueC.mDatas) { if (datas.Id == data.Id) { PlayerLog.WriteLog((ulong)LogType.QueueMessage, "PushFront datas.Id == data.Id!! c = {0} ids = {1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); } } } } #endif PlayerLog.WriteLog((int)LogType.QueueMessage, "PushFront mCharacters.Insert c={0}, ids={1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); _this.mCharacters.Insert(0, queueC); }
private void RemoveCharacter(QueueResultBase _this, QueueCharacter character) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "RemoveCharacter c={0}, ids={1}", character.Guid, character.mDatas.Select(c => c.Id).GetDataString()); #endif foreach (var data in character.mDatas) { _this.CharacterState.Remove(data.Id); } var isRemove = false; foreach (var team in _this.mTeamList) //所有队伍 -》临时队伍 { foreach (var c in team) //临时队伍-》单独排队 { if (character == c) { team.Remove(c); c.result = null; isRemove = true; break; } if (c.mDatas[0].Id == character.mDatas[0].Id) { PlayerLog.WriteLog((int)LogType.QueueLog, "RemoveCharacter Error not Same in={0},for={1}", character.Guid, c.Guid); } } if (isRemove) { break; } } if (!isRemove) { PlayerLog.WriteLog((int)LogType.QueueLog, "RemoveCharacter Error c={0},n={1}", character.mDatas[0].Id, character.mDatas.Count); } }
//新增至某队首 public ErrorCodes PushFront(QueueCharacter character) { var tbQuene = Table.GetQueue(character.mLogic.mQueueId); if (tbQuene == null) { return(ErrorCodes.Error_FubenID); } var matching = GetMatching(tbQuene); foreach (var characterSimpleData in character.mDatas) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "In PushFront(). Matching Add ccharacter={0} c={1} ids={2}", characterSimpleData.Id, character.Guid, character.mDatas.Select(d => d.Id).GetDataString()); #endif QueueManager.Characters.Add(characterSimpleData.Id, character); } matching.PushFront(character); //PushLog(); return(ErrorCodes.OK); }
public void PushBack(QueueLogic _this, QueueCharacter queueC) { if (_this.mCharacters.Count == 0) { _this.StartTrigger(); } #if DEBUG foreach (var data in queueC.mDatas) { var t = QueueManager.GetMatchingCharacter(data.Id); if (t == null) { PlayerLog.WriteLog((ulong)LogType.QueueMessage, "PushBack t == null!! c = {0} ids = {1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); } } foreach (var queueCharacter in _this.mCharacters) { foreach (var datas in queueCharacter.mDatas) { foreach (var data in queueC.mDatas) { if (datas.Id == data.Id) { PlayerLog.WriteLog((ulong)LogType.QueueMessage, "PushBack datas.Id == data.Id!! c = {0} ids = {1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); } } } } #endif PlayerLog.WriteLog((int)LogType.QueueMessage, "PushBack mCharacters.Add c={0}, ids={1}", queueC.Guid, queueC.mDatas.Select(d => d.Id).GetDataString()); _this.mCharacters.Add(queueC); }
//把一个新的characterId 加入到 character 里 private IEnumerator PushOneCharacterCoroutine(Coroutine co, ulong characterId, QueueCharacter character) { if (character.result != null) { yield break; } PlayerLog.WriteLog((int)LogType.QueueMessage, "PushOnCharacter character={0}", characterId); //在线检查 if (!TeamServer.Instance.ServerControl.Proxys.ContainsKey(characterId)) { Logger.Error("PushOneCharacterCoroutine(), character {0} not online", characterId); yield break; } //检查进入条件 if (QueueManager.Characters.ContainsKey(characterId)) { Logger.Error("PushOneCharacterCoroutine(), character {0} already in queue", characterId); yield break; } //确定玩家的进入条件满足 var tbQueue = character.mLogic.tbQueue; var logicResult = TeamServer.Instance.LogicAgent.CheckCharacterInFuben(characterId, tbQueue.Param); yield return(logicResult.SendAndWaitUntilDone(co)); if (logicResult.State != MessageState.Reply) { Logger.Error( "PushOneCharacterCoroutine(), CheckCharacterInFuben not replied! character = {0},fubenid = {1}", characterId, tbQueue.Id); yield break; } if (logicResult.ErrorCode != (int)ErrorCodes.OK) { Logger.Debug("PushOneCharacterCoroutine(), character {0} already in queue", characterId); yield break; } //从scene获取simpledata var dbSceneSimple = TeamServer.Instance.SceneAgent.GetSceneSimpleData(characterId, 0); yield return(dbSceneSimple.SendAndWaitUntilDone(co)); if (dbSceneSimple.State != MessageState.Reply) { Logger.Error("PushOnCharacter Error! GetSceneSimpleData not replied! Id = {0}", characterId); yield break; } if (dbSceneSimple.ErrorCode != (int)ErrorCodes.OK) { Logger.Error("PushOnCharacter Error! GetSceneSimpleData return with err = {0}", dbSceneSimple.ErrorCode); yield break; } var data = new CharacterSimpleData { Id = dbSceneSimple.Response.Id, TypeId = dbSceneSimple.Response.TypeId, Name = dbSceneSimple.Response.Name, SceneId = dbSceneSimple.Response.SceneId, FightPoint = dbSceneSimple.Response.FightPoint, Level = dbSceneSimple.Response.Level, Ladder = dbSceneSimple.Response.Ladder, ServerId = dbSceneSimple.Response.ServerId }; if (character.result != null) { yield break; } character.mDatas.Add(data); SendTeamMemberMatch(data, character); #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "PushOneCharacterCoroutine().Matching Add c={0}, ids={1}", character.Guid, character.mDatas.Select(d => d.Id).GetDataString()); #endif QueueManager.Characters.Add(characterId, character); }
public override void PushOneCharacter(QueueCharacter queue) { mImpl.PushOneCharacter(this, queue); }
//把一个新的characterId 加入到 character 里 public void PushOneCharacter(ulong characterId, QueueCharacter character) { CoroutineFactory.NewCoroutine(PushOneCharacterCoroutine, characterId, character).MoveNext(); }
//排队结果,移除一个人 public override void RemoveCharacterOne(QueueCharacter character) { mImpl.RemoveCharacterOne(this, character); }
public void PushOneCharacter(QueueResult _this, QueueCharacter queue) { QueueResultBase.GetImpl().PushOneCharacter(_this, queue); }
public void Tick(FightQueue _this) { var needCount = _this.tbQueue.CountLimit; var needCount1 = _this.tbQueue.CountLimit; var needCount2 = _this.tbQueue.CountLimit; var noFullSceneList = QueueSceneManager.GetQueueNotFullList(_this.mQueueId); foreach (var nofullscene in noFullSceneList) { needCount1 = needCount - nofullscene.team1.Count; needCount2 = needCount - nofullscene.team2.Count; if (needCount1 == needCount2) { //两边要同时进人 if (needCount2 < 1) { continue; } //找人 { QueueCharacter gotoTeam1 = null; foreach (var mCharacter in _this.mCharacters) { if (mCharacter.mDatas.Count > needCount1) { continue; } if (gotoTeam1 == null) { gotoTeam1 = mCharacter; } else if (mCharacter.mDatas.Count == gotoTeam1.mDatas.Count) { nofullscene.FollowCharacter(gotoTeam1, 0); nofullscene.FollowCharacter(mCharacter, 1); return; } } } } else { //少的一边先进 var diff = Math.Abs(needCount1 - needCount2); foreach (var mCharacter in _this.mCharacters) { if (diff >= mCharacter.mDatas.Count) { if (needCount1 > needCount2) { nofullscene.FollowCharacter(mCharacter, 0); return; } nofullscene.FollowCharacter(mCharacter, 1); return; } } } } needCount1 = needCount; needCount2 = needCount; _this.tempTeam1.Clear(); _this.tempTeam2.Clear(); var isCanOver1 = false; var isCanOver2 = false; foreach (var mCharacter in _this.mCharacters) { if (mCharacter.mDatas.Count <= needCount1) { _this.tempTeam1.Add(mCharacter); needCount1 -= mCharacter.mDatas.Count; if (needCount1 == 0) { isCanOver1 = true; if (isCanOver2) { break; } } } else if (mCharacter.mDatas.Count <= needCount2) { _this.tempTeam2.Add(mCharacter); needCount2 -= mCharacter.mDatas.Count; if (needCount2 == 0) { isCanOver2 = true; if (isCanOver1) { break; } } } } if (isCanOver1 && isCanOver2) { _this.MatchOver(); } // 如果已经很长时间没有匹配到人了,把这些人降级 { if (_this.NextQueue != null) { List <QueueCharacter> removes = new List <QueueCharacter>(); foreach (var character in _this.mCharacters) { if ((DateTime.Now - character.StartTime).Seconds > _this.tbQueue.WaitTime) { removes.Add(character); //_this.Pop内会执行mCharacters.Remove(character),导致移除 //character.mLogic = _this.NextQueue; //character.StartTime = DateTime.Now; //_this.Pop(character, eLeaveMatchingType.MoveDown); //_this.NextQueue.PushBack(character); } } foreach (var queueCharacter in removes) { queueCharacter.mLogic = _this.NextQueue; queueCharacter.StartTime = DateTime.Now; _this.Pop(queueCharacter, eLeaveMatchingType.MoveDown); _this.NextQueue.PushBack(queueCharacter); } } } }
//排队结果,移除一个人 public virtual void RemoveCharacterOne(QueueCharacter character) { mImpl.RemoveCharacterOne(this, character); }
//新增至某队首 public static ErrorCodes PushFront(QueueCharacter character) { return(mStaticImpl.PushFront(character)); }
//排队结果,移除一个人 public void RemoveCharacterOne(QueueResultBase _this, QueueCharacter character) { RemoveCharacter(_this, character); }
public void RemoveCharacterOne(QueueResult _this, QueueCharacter character) { QueueResultBase.GetImpl().RemoveCharacterOne(_this, character); _this.PushFront(eLeaveMatchingType.OtherRefuse); }
//把一个新的characterId 加入到 character 里 public static void PushOneCharacter(ulong characterId, QueueCharacter character) { mStaticImpl.PushOneCharacter(characterId, character); }
//排队结果,添加一个队伍的人,目前只有活动副本的预约要用这个函数 public virtual void PushOneCharacter(QueueCharacter queue) { mImpl.PushOneCharacter(this, queue); }