コード例 #1
0
        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);
                        }
                    }
                }
            }
        }