Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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;
        }