public void TimerProc() { long nowTicks = TimeUtil.NOW(); if (nowTicks >= WanMoXiaGuManager._nextHeartBeatTicks) { WanMoXiaGuManager._nextHeartBeatTicks = nowTicks + 1020L; long nowSecond = nowTicks / 1000L; List <WanMoXiaGuScene> removeList = new List <WanMoXiaGuScene>(); lock (this.RuntimeData.Mutex) { foreach (WanMoXiaGuScene scene in this.SceneDict.Values) { int nID = scene.FuBenSeqId; int nCopyID = scene.CopyMapID; int nMapID = scene.MapID; if (nID >= 0 && nCopyID >= 0 && nMapID >= 0) { CopyMap copyMap = scene.CopyMapInfo; if (scene.SceneStatus == GameSceneStatuses.STATUS_NULL) { scene.PrepareTime = nowSecond; scene.BeginTime = nowSecond + (long)this.RuntimeData.PrepareSecs; scene.SceneStatus = GameSceneStatuses.STATUS_PREPARE; scene.StateTimeData.GameType = 8; scene.StateTimeData.State = (int)scene.SceneStatus; scene.StateTimeData.EndTicks = nowTicks + (long)(this.RuntimeData.PrepareSecs * 1000); GameManager.ClientMgr.BroadSpecialCopyMapMessage <GameSceneStateTimeData>(827, scene.StateTimeData, scene.CopyMapInfo); } else if (scene.SceneStatus == GameSceneStatuses.STATUS_PREPARE) { if (nowSecond >= scene.BeginTime) { scene.SceneStatus = GameSceneStatuses.STATUS_BEGIN; scene.EndTime = nowSecond + (long)this.RuntimeData.FightingSecs; scene.StateTimeData.GameType = 8; scene.StateTimeData.State = (int)scene.SceneStatus; scene.StateTimeData.EndTicks = nowTicks + (long)(this.RuntimeData.FightingSecs * 1000); GameManager.ClientMgr.BroadSpecialCopyMapMessage <GameSceneStateTimeData>(827, scene.StateTimeData, scene.CopyMapInfo); } } else if (scene.SceneStatus == GameSceneStatuses.STATUS_BEGIN) { if (nowSecond >= scene.EndTime) { scene.SceneStatus = GameSceneStatuses.STATUS_END; } else if (null == scene.Boss) { scene.Boss = (GameManager.MonsterMgr.FindMonsterByExtensionID(copyMap.CopyMapID, this.RuntimeData.BossMonsterID).FirstOrDefault <object>() as Monster); if (null != scene.Boss) { scene.ScoreData.MonsterID = scene.Boss.RoleID; scene.ScoreData.BossLifePercent = 1.0; } } else if (scene.Boss != null && scene.Boss.Alive) { if (!scene.MonsterCreated && scene.BossLifePercent < this.RuntimeData.WanMoXiaGuCall) { int rnd = Global.GetRandomNumber(this.RuntimeData.BeginNum, this.RuntimeData.EndNum); foreach (WanMoXiaGuMonsterConfigInfo item in this.RuntimeData.MonsterOrderConfigList.Values) { if (rnd >= item.BeginNum && rnd <= item.EndNum) { scene.ScoreData.Intro = item.Intro; scene.ScoreData.Decorations = item.Decorations; scene.ZuoQiInfo = item; this.CreateMonster(scene, scene.ZuoQiInfo); scene.MonsterCreated = true; scene.NextRelifeTicks = nowTicks + (long)(scene.ZuoQiInfo.RecoverTime * 1000); } } } if (scene.ZuoQiInfo != null) { if (scene.MonsterCount != scene.ScoreData.MonsterCount) { scene.MonsterCount = scene.ScoreData.MonsterCount; foreach (string pstr in scene.ZuoQiInfo.Props.Split(new char[] { '|' })) { string[] strs = pstr.Split(new char[] { ',' }); ExtPropIndexes propIdx; double propValue; if (strs.Length == 2 && Enum.TryParse <ExtPropIndexes>(strs[0], out propIdx) && double.TryParse(strs[1], out propValue)) { scene.Boss.TempPropsBuffer.AddTempExtProp((int)propIdx, propValue * (double)scene.MonsterCount, long.MaxValue); } } } if (nowTicks >= scene.NextRelifeTicks) { scene.NextRelifeTicks = nowTicks + (long)(scene.ZuoQiInfo.RecoverTime * 1000); if (scene.MonsterCount > 0) { Monster monster = scene.Boss; monster.AddLife((long)(scene.ZuoQiInfo.RecoverNum * scene.MonsterCount)); List <object> listObjs = Global.GetAll9Clients(monster); GameManager.ClientMgr.NotifyOthersRelife(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, monster, monster.MonsterZoneNode.MapCode, monster.CopyMapID, monster.RoleID, (int)monster.SafeCoordinate.X, (int)monster.SafeCoordinate.Y, (int)monster.SafeDirection, monster.VLife, monster.VMana, 120, listObjs, 0); } scene.BossLifePercent = (scene.ScoreData.BossLifePercent = scene.Boss.VLife / scene.Boss.MonsterInfo.VLifeMax); GameManager.ClientMgr.BroadSpecialCopyMapMessage <WanMoXiaGuScoreData>(1266, scene.ScoreData, scene.CopyMapInfo); } } } else { scene.Success = 1; scene.SceneStatus = GameSceneStatuses.STATUS_END; } } else if (scene.SceneStatus == GameSceneStatuses.STATUS_END) { scene.SceneStatus = GameSceneStatuses.STATUS_AWARD; scene.EndTime = nowSecond; scene.LeaveTime = scene.EndTime + (long)this.RuntimeData.ClearRolesSecs; if (scene.Success > 0) { this.GiveAwards(scene); } scene.StateTimeData.GameType = 8; scene.StateTimeData.State = 3; scene.StateTimeData.EndTicks = nowTicks + (long)(this.RuntimeData.ClearRolesSecs * 1000); GameManager.ClientMgr.BroadSpecialCopyMapMessage <GameSceneStateTimeData>(827, scene.StateTimeData, scene.CopyMapInfo); } else if (scene.SceneStatus == GameSceneStatuses.STATUS_AWARD) { if (nowSecond >= scene.LeaveTime) { removeList.Add(scene); copyMap.SetRemoveTicks(scene.LeaveTime); scene.SceneStatus = GameSceneStatuses.STATUS_CLEAR; try { List <GameClient> objsList = copyMap.GetClientsList(); if (objsList != null && objsList.Count > 0) { for (int i = 0; i < objsList.Count; i++) { GameClient c = objsList[i]; if (c != null) { KuaFuManager.getInstance().GotoLastMap(c); } } } } catch (Exception ex) { DataHelper.WriteExceptionLogEx(ex, "【万魔峡谷】清场调度异常"); } } } } } } if (removeList.Count > 0) { lock (this.RuntimeData.Mutex) { foreach (WanMoXiaGuScene scene in removeList) { WanMoXiaGuScene item2; this.SceneDict.TryRemove(scene.FuBenSeqId, out item2); } } } } }