public static void ExperienceCopyMapCreateMonster(GameClient client, ExperienceCopyScene ExperienceMapInfo, ExperienceCopyMapDataInfo exMap, int nWave)
        {
            ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterFlag = 1;
            ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave++;
            GameMap gameMap = null;

            if (!GameManager.MapMgr.DictMaps.TryGetValue(ExperienceMapInfo.m_MapCodeID, out gameMap))
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("经验副本 地图配置 ID = {0}", ExperienceMapInfo.m_MapCodeID), null, true);
            }
            else
            {
                int        gridX    = gameMap.CorrectWidthPointToGridPoint(exMap.posX) / gameMap.MapGridWidth;
                int        gridY    = gameMap.CorrectHeightPointToGridPoint(exMap.posZ) / gameMap.MapGridHeight;
                int        gridNum  = gameMap.CorrectWidthPointToGridPoint(exMap.Radius);
                int        nTotal   = 0;
                List <int> nListID  = exMap.MonsterIDList[nWave];
                List <int> nListNum = exMap.MonsterNumList[nWave];
                for (int i = 0; i < nListID.Count; i++)
                {
                    int nID  = nListID[i];
                    int nNum = nListNum[i];
                    GameManager.MonsterZoneMgr.AddDynamicMonsters(ExperienceMapInfo.m_MapCodeID, nID, ExperienceMapInfo.m_CopyMapID, nNum, gridX, gridY, gridNum, 0, SceneUIClasses.Normal, null, null);
                    nTotal += nNum;
                    ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum += nNum;
                    ExperienceMapInfo.m_ExperienceCopyMapRemainMonsterNum += nNum;
                }
                ExperienceMapInfo.m_ExperienceCopyMapNeedKillMonsterNum = ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum * exMap.CreateNextWaveMonsterCondition[nWave] / 100;
                if (client != null)
                {
                    ExperienceCopySceneManager.SendMsgToClientForExperienceCopyMapInfo(client, ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave);
                }
            }
        }
        public static void HeartBeatExperienceCopyMap()
        {
            long nowTicks = TimeUtil.NOW();

            if (nowTicks - ExperienceCopySceneManager.LastHeartBeatTicks >= 1000L)
            {
                ExperienceCopySceneManager.LastHeartBeatTicks = ((ExperienceCopySceneManager.LastHeartBeatTicks < 86400000L) ? nowTicks : (ExperienceCopySceneManager.LastHeartBeatTicks + 1000L));
                List <CopyMap> CopyMapList = new List <CopyMap>();
                lock (ExperienceCopySceneManager.m_ExperienceListCopyMaps)
                {
                    foreach (CopyMap item in ExperienceCopySceneManager.m_ExperienceListCopyMaps.Values)
                    {
                        List <GameClient>         clientsList = item.GetClientsList();
                        ExperienceCopyMapDataInfo tmp         = null;
                        tmp = Data.ExperienceCopyMapDataInfoList[item.MapCode];
                        if (tmp != null)
                        {
                            ExperienceCopyScene tmpExSceneInfo = null;
                            lock (ExperienceCopySceneManager.m_ExperienceListCopyMapsInfo)
                            {
                                if (!ExperienceCopySceneManager.m_ExperienceListCopyMapsInfo.TryGetValue(item.FuBenSeqID, out tmpExSceneInfo))
                                {
                                    continue;
                                }
                            }
                            if (tmpExSceneInfo != null)
                            {
                                int nWave  = tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterWave;
                                int nCount = tmp.MonsterIDList.Count;
                                if (nWave < nCount)
                                {
                                    if (tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterFlag == 0)
                                    {
                                        if (clientsList.Count <GameClient>() != 0 && clientsList[0] != null)
                                        {
                                            ExperienceCopySceneManager.ExperienceCopyMapCreateMonster(clientsList[0], tmpExSceneInfo, tmp, nWave);
                                        }
                                        else
                                        {
                                            ExperienceCopySceneManager.ExperienceCopyMapCreateMonster(null, tmpExSceneInfo, tmp, nWave);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                for (int i = 0; i < CopyMapList.Count; i++)
                {
                    GameManager.CopyMapMgr.ProcessRemoveCopyMap(CopyMapList[i]);
                }
            }
        }
        public static void ExperienceCopyMapKillMonster(GameClient client, Monster monster)
        {
            ExperienceCopyMapDataInfo TmpExInfo = null;

            if (Data.ExperienceCopyMapDataInfoList.TryGetValue(client.ClientData.MapCode, out TmpExInfo))
            {
                ExperienceCopyScene tmpExSceneInfo = null;
                lock (ExperienceCopySceneManager.m_ExperienceListCopyMapsInfo)
                {
                    if (!ExperienceCopySceneManager.m_ExperienceListCopyMapsInfo.TryGetValue(client.ClientData.FuBenSeqID, out tmpExSceneInfo))
                    {
                        return;
                    }
                }
                if (tmpExSceneInfo != null)
                {
                    CopyMap TmpCopyMapInfo = null;
                    if (ExperienceCopySceneManager.m_ExperienceListCopyMaps.TryGetValue(client.ClientData.FuBenSeqID, out TmpCopyMapInfo))
                    {
                        if (TmpCopyMapInfo != null)
                        {
                            tmpExSceneInfo.m_ExperienceCopyMapKillMonsterNum++;
                            tmpExSceneInfo.m_ExperienceCopyMapKillMonsterTotalNum++;
                            tmpExSceneInfo.m_ExperienceCopyMapRemainMonsterNum--;
                            if (tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterFlag == 1 && tmpExSceneInfo.m_ExperienceCopyMapKillMonsterNum == tmpExSceneInfo.m_ExperienceCopyMapNeedKillMonsterNum)
                            {
                                tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterFlag = 0;
                                tmpExSceneInfo.m_ExperienceCopyMapKillMonsterNum    = 0;
                                tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterNum  = 0;
                            }
                            if (tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterWave == TmpExInfo.MonsterIDList.Count && tmpExSceneInfo.m_ExperienceCopyMapKillMonsterTotalNum == TmpExInfo.MonsterSum)
                            {
                                ExperienceCopySceneManager.SendMsgToClientForExperienceCopyMapAward(client);
                            }
                            int nWave = tmpExSceneInfo.m_ExperienceCopyMapCreateMonsterWave;
                            if (tmpExSceneInfo.m_ExperienceCopyMapKillMonsterTotalNum == TmpExInfo.MonsterSum || tmpExSceneInfo.m_ExperienceCopyMapRemainMonsterNum == 0)
                            {
                                nWave++;
                            }
                            ExperienceCopySceneManager.SendMsgToClientForExperienceCopyMapInfo(client, nWave);
                        }
                    }
                }
            }
        }