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); } } }
//按照某个玩家的阵营,自动分队 public void AutoEnterTeam(FightQueueScene scene, ulong guid, int camp) { var team = scene.team1; if (camp == 1) { team = scene.team2; } foreach (var i in team) { if (i.Key == guid) { continue; } var t = GetCharacterTeam(i.Key); if (t == null) { continue; } if (t.TeamList.Count < 5) { t.PushCharacter(guid); return; } } }
//一个新的排队OK了 public FightQueueScene CreateScene(int qId) { var temp = new FightQueueScene(0, qId); QueueSceneManager.newCreateScenes.Add(temp); return(temp); }
//初始化添加某个玩家进入 public void InitCharacter(FightQueueScene _this, ulong cId, int camp) { Dictionary <ulong, int> team; if (camp == 0) { team = _this.team1; } else { team = _this.team2; } if (team.ContainsKey(cId)) { Logger.Error("InitCharacter cId = {0}", cId); } else { team.Add(cId, 0); } if (QueueSceneManager.characters.ContainsKey(cId)) { QueueSceneManager.characters[cId] = _this; } else { QueueSceneManager.characters.Add(cId, _this); } }
public void SetState(FightQueueScene _this, SceneState value) { switch (value) { case SceneState.Init: //初始状态 { } break; case SceneState.Full: //已全部进场景状态 { Stoptrigger(_this); QueueSceneManager.EnterFull(_this); } break; case SceneState.NoFull: //缺人状态 { if (_this.mState != SceneState.NoFull) { QueueSceneManager.FirstNotFull(_this); } } break; } _this.mState = value; }
public void Construct(FightQueueScene _this, ulong sceneGuid, int queueId) { _this.QueueId = queueId; _this.mSceneGuid = sceneGuid; _this.mTrigger = TeamServerControl.tm.CreateTrigger(DateTime.Now.AddSeconds(20), () => TimeOver(_this)); _this.mStartTime = DateTime.Now; }
private void TimeOver(FightQueueScene _this) { List <ulong> leaves = new List <ulong>(); foreach (var i in _this.team1) { if (i.Value == 0) { leaves.Add(i.Key); } } foreach (var i in _this.team2) { if (i.Value == 0) { leaves.Add(i.Key); } } // 移除超时的 foreach (var id in leaves) { LeaveScene(_this, id, _this.mSceneGuid); } //if (State == SceneState.Init) //{ // //一直没人进来 // FightMatchingSceneManager.CleanScene(_this); // return; //} Logger.Warn("FightMatchingScene TimeOver State ={0}", _this.mState); }
private void Stoptrigger(FightQueueScene _this) { if (_this.mTrigger != null) { TeamServerControl.tm.DeleteTrigger(_this.mTrigger); _this.mTrigger = null; } }
//通知玩家修改PvP的Camp private static IEnumerator NotifyCharacterSceneCamp(Coroutine co, FightQueueScene _this, ulong character, int camp) { var msgChgScene = TeamServer.Instance.SceneAgent.SSPvPSceneCampSet(character, camp); yield return(msgChgScene.SendAndWaitUntilDone(co)); }
//某个队满了又 private void RemoveSceneQueue(FightQueueScene scene) { var list = GetQueueNotFullList(scene.QueueId); if (list == null) { return; } list.Remove(scene); }
//获取玩家在哪个阵营 private int GetCharacterCamp(FightQueueScene _this, ulong cId) { if (_this.team1.ContainsKey(cId)) { return(0); } if (_this.team2.ContainsKey(cId)) { return(1); } return(-1); }
//某个场景要结束了 private void CleanScene(FightQueueScene scene) { foreach (var i in scene.team1) { QueueSceneManager.characters.Remove(i.Key); QueueTeamManager.LeaveScene(i.Key); #if DEBUG PlayerLog.WriteLog((int)LogType.BattleLog, "SSCharacterLeaveBattle CleanScene c={0},s={1}", i.Key, scene.mSceneGuid); #endif } foreach (var i in scene.team2) { QueueSceneManager.characters.Remove(i.Key); QueueTeamManager.LeaveScene(i.Key); #if DEBUG PlayerLog.WriteLog((int)LogType.BattleLog, "SSCharacterLeaveBattle CleanScene c={0},s={1}", i.Key, scene.mSceneGuid); #endif } foreach (var character in scene.FollowCharacters) { foreach (var data in character.mDatas) { TeamServer.Instance.ServerControl.TeamServerMessage(data.Id, (int)eLeaveMatchingType.SceneOver, string.Empty); } character.mLogic.PushFront(character); } scene.FollowCharacters.Clear(); #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "CleanScene(). scene.FollowCharacters.Clear(). scene={0}", scene.mSceneGuid); #endif switch (scene.State) { case SceneState.Init: { } break; case SceneState.Full: { } break; case SceneState.NoFull: { } break; } }
//有场景缺人了 public void FirstNotFull(FightQueueScene scene) { if (scene.State == SceneState.Init) { QueueSceneManager.newCreateScenes.Remove(scene); } else if (scene.State == SceneState.Full) { QueueSceneManager.fullScenes.Remove(scene.mSceneGuid); } QueueSceneManager.noFullScenes.Add(scene.mSceneGuid, scene); var tempList = GetQueueNotFullList(scene.QueueId); tempList.Add(scene); }
//后续排入的某个玩家进入 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 void LeaveScene(FightQueueScene _this, ulong cId, ulong sceneGuid) { if (sceneGuid != _this.mSceneGuid) { Logger.Warn("FightMatchingScene LeaveScene scene not same! cId={0},sceneGuid={1},teamGuid ={2}", cId, sceneGuid, _this.mSceneGuid); return; } QueueSceneManager.characters.Remove(cId); int state; if (_this.team1.TryGetValue(cId, out state)) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "LeaveScene() team1.Remove id={0}", cId); #endif _this.team1.Remove(cId); _this.mStateCount--; SetState(_this, SceneState.NoFull); var t = QueueTeamManager.GetCharacterTeam(cId); if (t != null) { t.RemoveCharacter(cId); } } else if (_this.team2.TryGetValue(cId, out state)) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "LeaveScene() team2.Remove id={0}", cId); #endif _this.team2.Remove(cId); _this.mStateCount--; SetState(_this, SceneState.NoFull); var t = QueueTeamManager.GetCharacterTeam(cId); if (t != null) { t.RemoveCharacter(cId); } } else { Logger.Warn("FightMatchingScene LeaveScene cId={0},sceneGuid={1}", cId, sceneGuid); } }
//有场景进满人了 public void EnterFull(FightQueueScene scene) { if (scene.mSceneGuid == 0) { Logger.Error("EnterFull sceneGuid={0}", scene.mSceneGuid); return; } if (scene.State == SceneState.Init) { QueueSceneManager.newCreateScenes.Remove(scene); } else if (scene.State == SceneState.NoFull) { QueueSceneManager.noFullScenes.Remove(scene.mSceneGuid); var tempList = GetQueueNotFullList(scene.QueueId); tempList.Remove(scene); } QueueSceneManager.fullScenes.Add(scene.mSceneGuid, scene); }
//有人进入场景了 public void EnterScene(FightQueueScene _this, ulong cId, ulong sceneGuid) { if (_this.mSceneGuid == 0) { _this.mSceneGuid = sceneGuid; } int state; if (_this.team1.TryGetValue(cId, out state)) { if (state == 0) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "EnterScene() team1[{0}] = 1", cId); #endif _this.team1[cId] = 1; _this.mStateCount++; if (_this.mStateCount == Table.GetQueue(_this.QueueId).CountLimit *2) { SetState(_this, SceneState.Full); } } } else if (_this.team2.TryGetValue(cId, out state)) { if (state == 0) { #if DEBUG PlayerLog.WriteLog((int)LogType.QueueMessage, "EnterScene() team2[{0}] = 1", cId); #endif _this.team2[cId] = 1; _this.mStateCount++; if (_this.mStateCount == Table.GetQueue(_this.QueueId).CountLimit *2) { SetState(_this, SceneState.Full); } } } else { Logger.Warn("FightMatchingScene EnterScene cId={0},sceneGuid={1}", cId, sceneGuid); } }
//开始创建副本 private static IEnumerator NotifyCreateChangeSceneCoroutine(Coroutine co, FightQueueScene _this, List <ulong> characters, int serverId) { //排队创建场景时,根据合服ID进行 var serverLogicId = SceneExtension.GetServerLogicId(serverId); PlayerLog.WriteLog((int)LogType.QueueMessage, "NotifyCreateChangeSceneCoroutine Team={0}", characters.GetDataString()); var sceneInfo = new ChangeSceneInfo { SceneId = -1, ServerId = serverLogicId, SceneGuid = _this.mSceneGuid, Type = (int)eScnenChangeType.EnterDungeon }; sceneInfo.Guids.AddRange(characters); var msgChgScene = TeamServer.Instance.SceneAgent.SBChangeSceneByTeam(characters[0], sceneInfo); yield return(msgChgScene.SendAndWaitUntilDone(co)); if (msgChgScene.State != MessageState.Reply) { yield break; } if (msgChgScene.Response == 0) { foreach (var characterGuid in characters) { PlayerLog.WriteLog((int)LogType.BattleLog, "SSCharacterEnterBattle Faild c={0},s={1}", characterGuid, _this.mSceneGuid); QueueTeamManager.LeaveScene(characterGuid); QueueSceneManager.LeaveScene(characterGuid, _this.mSceneGuid); } } }
//按照某个玩家的阵营,自动分队 public static void AutoEnterTeam(FightQueueScene scene, ulong guid, int camp) { mImpl.AutoEnterTeam(scene, guid, camp); }
//有场景缺人了 public static void FirstNotFull(FightQueueScene scene) { mImpl.FirstNotFull(scene); }
//有场景进满人了 public static void EnterFull(FightQueueScene scene) { mImpl.EnterFull(scene); }