/// <summary> /// 加载血色城堡场景到管理器 /// </summary> public void LoadBloodCastleListScenes() { int[] nArray = GameManager.systemParamsList.GetParamValueIntArrayByName("BloodCastleMapCodeID"); for (int i = 0; i < nArray.Length; ++i) { BloodCastleScene tmpMap = new BloodCastleScene(); tmpMap.CleanAllInfo(); tmpMap.m_nMapCode = nArray[i]; AddBloodCastleListScenes(nArray[i], tmpMap); } // 向DB请求最高积分信息 Global.QueryDayActivityTotalPointInfoToDB(SpecialActivityTypes.BloodCastle); m_nPushMsgDayID = Global.SafeConvertToInt32(GameManager.GameConfigMgr.GetGameConifgItem(GameConfigNames.BloodCastlePushMsgDayID)); }
/// <summary> // 心跳处理 /// </summary> public void HeartBeatBloodCastScene() { //int[] nArray = GameManager.systemParamsList.GetParamValueIntArrayByName("BloodCastleMapCodeID"); foreach (var BloodCastleScenes in m_BloodCastleListScenes) { //for (int i = 0; i < nArray.Length; ++i) //{ BloodCastleDataInfo bcDataTmp = Data.BloodCastleDataInfoList[BloodCastleScenes.Key]; BloodCastleScene bcTmp = GetBloodCastleListScenes(BloodCastleScenes.Key); if (bcTmp == null || bcDataTmp == null) { continue; } int nRoleNum = 0; nRoleNum = GameManager.ClientMgr.GetMapClientsCount(bcTmp.m_nMapCode); if (nRoleNum <= 0) { if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_BEGIN) { // 做清空处理 比如 所有动态刷出的怪 都delete掉 CleanBloodCastScene(bcTmp.m_nMapCode); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = BloodCastleScenes.Key; } //continue; } // 区分时段 注意 每个时段都要计时 // 当前tick long ticks = DateTime.Now.Ticks / 10000; if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_NULL) // 如果处于空状态 -- 是否要切换到准备状态 { bool bPushMsg = false; if (Global.CanEnterBloodCastleOnTime(bcDataTmp.BeginTime, 0 /*bcDataTmp.PrepareTime*/)) { bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_PREPARE; bcTmp.m_lPrepareTime = DateTime.Now.Ticks / 10000; //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); // 消息推送 int nNow = DateTime.Now.DayOfYear; if (bPushMsg && m_nPushMsgDayID != nNow) { //Global.DayActivityTiggerPushMessage((int)SpecialActivityTypes.BloodCastle); Global.UpdateDBGameConfigg(GameConfigNames.BloodCastlePushMsgDayID, nNow.ToString()); m_nPushMsgDayID = nNow; } } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_PREPARE) // 场景战斗状态切换 { if (ticks >= (bcTmp.m_lPrepareTime + (bcDataTmp.PrepareTime * 1000))) { // 准备战斗 通知客户端 面前的阻挡消失 玩家可以上桥上去杀怪了 bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_BEGIN; bcTmp.m_lBeginTime = DateTime.Now.Ticks / 10000; int nTimer = (int)((bcDataTmp.DurationTime * 1000 - (ticks - bcTmp.m_lBeginTime)) / 1000); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, BloodCastleScenes.Key, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEBEGINFIGHT, nTimer); // 战斗结束倒计时 // 把城门刷出来 int monsterID = bcDataTmp.GateID; string[] sfields = bcDataTmp.GatePos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(bcDataTmp.MapCode, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("血色城堡报错 地图配置 ID = {0}", bcDataTmp.MapCode)); return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; //System.Console.WriteLine("liaowei是帅哥 血色堡垒{0}里 刷城门怪了--1!!!", BloodCastleScenes.Key); GameManager.MonsterZoneMgr.AddDynamicMonsters(BloodCastleScenes.Key, monsterID, -1, 1, gridX, gridY, 0); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 1); // 杀死桥上的怪 0/50 -- 显示杀怪状态 //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_BEGIN) // 战斗开始 { if (ticks >= (bcTmp.m_lBeginTime + (bcDataTmp.DurationTime * 1000))) { bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_END; bcTmp.m_lEndTime = DateTime.Now.Ticks / 10000; //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_END) // 战斗结束 { // 血色堡垒结束战斗 客户端显示倒计时界面 int nTimer = (int)((bcDataTmp.LeaveTime * 1000 - (ticks - bcTmp.m_lEndTime)) / 1000); if (bcTmp.m_bEndFlag == false) { // 剩余时间奖励 long nTimerInfo = 0; nTimerInfo = bcTmp.m_lEndTime - bcTmp.m_lBeginTime; long nRemain = 0; nRemain = ((bcDataTmp.DurationTime * 1000) - nTimerInfo) / 1000; if (nRemain >= bcDataTmp.DurationTime) { nRemain = bcDataTmp.DurationTime / 2; } int nTimeAward = 0; nTimeAward = (int)(bcDataTmp.TimeModulus * nRemain); if (nTimeAward < 0) { nTimeAward = 0; } GameManager.ClientMgr.NotifyBloodCastleMsgEndFight(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, BloodCastleScenes.Key, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEENDFIGHT, nTimer, nTimeAward); } if (ticks >= (bcTmp.m_lEndTime + (bcDataTmp.LeaveTime * 1000))) { // 清场 List <Object> objsList = GameManager.ClientMgr.GetMapClients(BloodCastleScenes.Key); if (objsList != null) { for (int n = 0; n < objsList.Count; ++n) { GameClient c = objsList[n] as GameClient; if (c == null) { continue; } if (c.ClientData.MapCode != BloodCastleScenes.Key) { continue; } // 完成该血色堡垒 //CompleteBloodCastScene(c, bcTmp, bcDataTmp); // 根据公式和积分奖励经验 注释掉 //GiveAwardBloodCastScene(c); // 退出场景 int toMapCode = GameManager.MainMapCode; //主城ID 防止意外 int toPosX = -1; int toPosY = -1; if (MapTypes.Normal == Global.GetMapType(c.ClientData.LastMapCode)) { if (GameManager.BattleMgr.BattleMapCode != c.ClientData.LastMapCode || GameManager.ArenaBattleMgr.BattleMapCode != c.ClientData.LastMapCode) { toMapCode = c.ClientData.LastMapCode; toPosX = c.ClientData.LastPosX; toPosY = c.ClientData.LastPosY; } } GameMap gameMap = null; if (GameManager.MapMgr.DictMaps.TryGetValue(toMapCode, out gameMap)) { c.ClientData.bIsInBloodCastleMap = false; GameManager.ClientMgr.NotifyChangeMap(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, c, toMapCode, toPosX, toPosY, -1); } } } CleanBloodCastScene(BloodCastleScenes.Key); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = BloodCastleScenes.Key; } } //} } return; }