예제 #1
0
        /// <summary>
        /// 根据副本ID和地图编号, 当前所在的层数
        /// </summary>
        /// <param name="fuBenID"></param>
        /// <returns></returns>
        public static int FindMapCodeIndexByFuBenID(int mapCode)
        {
            int fuBenID = FuBenManager.FindFuBenIDByMapCode(mapCode);

            if (fuBenID <= 0)
            {
                return(0);
            }

            //根据副本ID获取副本地图列表
            List <int> mapCodeList = FindMapCodeListByFuBenID(fuBenID);

            if (null == mapCodeList)
            {
                return(0);
            }

            int findIndex = mapCodeList.IndexOf(mapCode);

            if (-1 == findIndex)
            {
                return(0);
            }

            return(findIndex + 1);
        }
예제 #2
0
        public static int FindMapCodeIndexByFuBenID(int mapCode)
        {
            int fuBenID = FuBenManager.FindFuBenIDByMapCode(mapCode);
            int result;

            if (fuBenID <= 0)
            {
                result = 0;
            }
            else
            {
                List <int> mapCodeList = FuBenManager.FindMapCodeListByFuBenID(fuBenID);
                if (null == mapCodeList)
                {
                    result = 0;
                }
                else
                {
                    int findIndex = mapCodeList.IndexOf(mapCode);
                    if (-1 == findIndex)
                    {
                        result = 0;
                    }
                    else
                    {
                        result = findIndex + 1;
                    }
                }
            }
            return(result);
        }
예제 #3
0
        public static int FindNextMapCodeByFuBenID(int mapCode)
        {
            int fuBenID = FuBenManager.FindFuBenIDByMapCode(mapCode);
            int result;

            if (fuBenID <= 0)
            {
                result = -1;
            }
            else
            {
                List <int> mapCodeList = FuBenManager.FindMapCodeListByFuBenID(fuBenID);
                if (null == mapCodeList)
                {
                    result = -1;
                }
                else
                {
                    int findIndex = mapCodeList.IndexOf(mapCode);
                    if (-1 == findIndex)
                    {
                        result = -1;
                    }
                    else if (findIndex >= mapCodeList.Count - 1)
                    {
                        result = -1;
                    }
                    else
                    {
                        result = mapCodeList[findIndex + 1];
                    }
                }
            }
            return(result);
        }
예제 #4
0
        public static bool IsFuBenMap(int mapCode)
        {
            bool isFuBenMap = FuBenManager.FindFuBenIDByMapCode(mapCode) > 0;

            if (Global.GetMapType(mapCode) == MapTypes.HuanYingSiYuan)
            {
                isFuBenMap = true;
            }
            return(isFuBenMap);
        }
예제 #5
0
 public static void SendMsgToClientForGlodCopySceneMonsterWave(GameClient client, int nWave)
 {
     if (client != null)
     {
         int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
         if (fuBenID > 0)
         {
             string       strcmd       = string.Format("{0}:{1}", nWave, Data.Goldcopyscenedata.GoldCopySceneMonsterData.Count <KeyValuePair <int, GoldCopySceneMonster> >());
             TCPOutPacket tcpOutPacket = TCPOutPacket.MakeTCPOutPacket(Global._TCPManager.TcpOutPacketPool, strcmd, 628);
             Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket, true);
         }
     }
 }
예제 #6
0
        /// <summary>
        /// 判断是否能自动领取副本地图中中的奖励
        /// </summary>
        /// <returns></returns>
        public static bool CanAutoGetFuBenMapAwards(GameClient client)
        {
            int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);

            if (fuBenID <= 0)
            {
                return(false);
            }

            if (client.ClientData.FuBenSeqID <= 0)
            {
                return(false);
            }

            FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(client.ClientData.FuBenSeqID);

            if (null == fuBenInfoItem)
            {
                return(false);
            }

            if (fuBenID != fuBenInfoItem.FuBenID)
            {
                return(false);
            }

            FuBenMapItem fuBenMapItem = FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);

            if (null == fuBenMapItem)
            {
                return(false);
            }

            if (null == fuBenMapItem.GoodsDataList || fuBenMapItem.GoodsDataList.Count <= 0)
            {
                if (fuBenMapItem.Experience <= 0)
                {
                    if (fuBenMapItem.Money1 <= 0)
                    {
                        return(false);
                    }
                }
            }

            if (null == fuBenMapItem.GoodsDataList || fuBenMapItem.GoodsDataList.Count <= 0)
            {
                return(true);
            }

            return(false);
        }
예제 #7
0
 public static void SendMsgToClientForGlodCopyScenePrepare(GameClient client, GoldCopyScene goldcopyscene)
 {
     if (client != null)
     {
         int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
         if (fuBenID > 0)
         {
             long   ticks  = TimeUtil.NOW();
             int    nTimer = (int)(((long)GlodCopySceneManager.m_PrepareTime - (ticks - goldcopyscene.m_StartTimer)) / 1000L);
             string strcmd = string.Format("{0}", nTimer);
             GameManager.ClientMgr.SendToClient(client, strcmd, 627);
         }
     }
 }
예제 #8
0
 /// <summary>
 // 通知客户端怪波数信息
 /// </summary>
 public static void SendMsgToClientForGlodCopySceneMonsterWave(GameClient client, int nWave)
 {
     if (client != null)
     {
         int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
         if (fuBenID > 0)
         {
             string       strcmd       = string.Format("{0}:{1}", nWave, Data.Goldcopyscenedata.GoldCopySceneMonsterData.Count());//1.当前的波数 2.总波数
             TCPOutPacket tcpOutPacket = null;
             tcpOutPacket = TCPOutPacket.MakeTCPOutPacket(Global._TCPManager.TcpOutPacketPool, strcmd, (int)TCPGameServerCmds.CMD_SPR_GOLDCOPYSCENEMONSTERWAVE);
             Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket);
         }
     }
 }
예제 #9
0
        public static bool CanGetFuBenMapAwards(GameClient client)
        {
            int  fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
            bool result;

            if (fuBenID <= 0)
            {
                result = false;
            }
            else if (client.ClientData.FuBenSeqID <= 0)
            {
                result = false;
            }
            else
            {
                FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(client.ClientData.FuBenSeqID);
                if (null == fuBenInfoItem)
                {
                    result = false;
                }
                else if (fuBenID != fuBenInfoItem.FuBenID)
                {
                    result = false;
                }
                else
                {
                    FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);
                    if (null == fuBenMapItem)
                    {
                        result = false;
                    }
                    else
                    {
                        if (fuBenMapItem.GoodsDataList == null || fuBenMapItem.GoodsDataList.Count <= 0)
                        {
                            if (fuBenMapItem.Experience <= 0)
                            {
                                if (fuBenMapItem.Money1 <= 0)
                                {
                                    return(false);
                                }
                            }
                        }
                        result = true;
                    }
                }
            }
            return(result);
        }
예제 #10
0
        /// <summary>
        // 通知客户端
        /// </summary>
        public static void SendMsgToClientForGlodCopyScenePrepare(GameClient client, GoldCopyScene goldcopyscene)
        {
            if (client != null)
            {
                int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
                if (fuBenID > 0)
                {
                    string strcmd = "";

                    long ticks = TimeUtil.NOW();    // 当前tick

                    int nTimer = (int)((m_PrepareTime - (ticks - goldcopyscene.m_StartTimer)) / 1000);

                    strcmd = string.Format("{0}", nTimer);

                    GameManager.ClientMgr.SendToClient(client, strcmd, (int)TCPGameServerCmds.CMD_SPR_GOLDCOPYSCENEPREPAREFIGHT);
                }
            }
        }
예제 #11
0
        /// <summary>
        /// 添加动态爆怪区域,每个地图有一个,所有参数都动态生成
        /// </summary>
        /// <param name="mapCode"></param>
        public void AddDynamicMonsterZone(int mapCode)
        {
            //判断是否是副本地图
            bool isFuBenMap = FuBenManager.FindFuBenIDByMapCode(mapCode) > 0 ? true : false;

            MonsterZone monsterZone = new MonsterZone()
            {
                MapCode    = mapCode,
                ID         = MonsterDynamicZoneDict.Count + 10000, //动态配置 爆怪的区域ID,这个ID这样生成就可以
                Code       = -1,                                   //动态配置---区域怪物ID,需要生成的时候动态配置
                ToX        = -1,                                   //动态配置
                ToY        = -1,                                   //动态配置
                Radius     = 300,                                  //可以动态修改
                TotalNum   = 0,                                    //动态
                Timeslot   = 1,
                IsFuBenMap = isFuBenMap,
                //意味着该区域的怪不管是在副本还说非副本,都由外部代码动态控制怪物的加载,怪物不会被程序定期循环复活
                //同时该区域的怪物一旦死亡,直接销毁【将来或许需要加入一个针对这种类型的最大复活次数?】
                BirthType          = (int)MonsterBirthTypes.CrossMap, //这个字段非常重要,用于区分是动态刷怪区域还是 旧的系统怪区域!!!!!!
                ConfigBirthType    = -1,                              //配置文件可没配置
                BirthTimePointList = null,
                BirthRate          = 10000,                           //必爆
            };

            //追踪范围,动态配置
            monsterZone.PursuitRadius = 0;

            //动态爆怪区域列表--->里面的怪物一旦死亡,移除
            MonsterDynamicZoneDict.Add(mapCode, monsterZone);

            //加入列表
            MonsterZoneList.Add(monsterZone);

            //如果是副本地图, 则加入副本爆怪区域列表
            if (isFuBenMap)
            {
                FuBenMonsterZoneList.Add(monsterZone);
            }

            //加入爆怪区域
            AddMap2MonsterZoneDict(monsterZone);
        }
예제 #12
0
        /// <summary>
        /// 处理用户的获取副本奖励
        /// </summary>
        /// <param name="client"></param>
        public static bool ProcessFuBenMapAwards(GameClient client, bool notifyClient = false)
        {
            if (client.ClientData.FuBenSeqID < 0)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("您当前的副本顺序ID错误")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            //如果已经获取过一次奖励,则不再提示奖励
            //查找角色的ID+副本顺序ID对应地图编号的奖励领取状态
            int awardState = GameManager.CopyMapMgr.FindAwardState(client.ClientData.RoleID, client.ClientData.FuBenSeqID, client.ClientData.MapCode);

            if (awardState > 0)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("当前副本地图的奖励只能领取一次")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);

            if (fuBenID <= 0)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("没有找到当前地图对应的副本配置")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(client.ClientData.FuBenSeqID);

            if (null == fuBenInfoItem)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("没有找到对应的内存副本信息")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            if (fuBenID != fuBenInfoItem.FuBenID)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("副本ID错误,无法领取其他副本的奖励")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            FuBenMapItem fuBenMapItem = FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);

            if (null == fuBenMapItem)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("没有找到当前副本地图的奖励")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            CopyMap copyMap = null;

            copyMap = GameManager.CopyMapMgr.FindCopyMap(client.ClientData.MapCode);
            if (copyMap == null)
            {
                GameManager.ClientMgr.NotifyImportantMsg(
                    Global._TCPManager.MySocketListener,
                    Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("领取副本奖励出错")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox);
                return(false);
            }

            GameManager.CopyMapMgr.AddAwardState(client.ClientData.RoleID, client.ClientData.FuBenSeqID, client.ClientData.MapCode, 1);

            FuBenTongGuanData fubenTongGuanData = null;

            int  nMaxTime     = fuBenMapItem.MaxTime * 60; //分->秒
            long startTicks   = fuBenInfoItem.StartTicks;
            long endTicks     = fuBenInfoItem.EndTicks;
            int  nFinishTimer = (int)(endTicks - startTicks) / 1000; //毫秒->秒
            int  killedNum    = 0;                                   // copyMap.KilledNormalNum + copyMap.KilledBossNum;
            int  nDieCount    = fuBenInfoItem.nDieCount;

            //向客户的发放通关奖励
            fubenTongGuanData = Global.GiveCopyMapGiftForScore(client, fuBenID, nMaxTime, nFinishTimer, killedNum, nDieCount, fuBenMapItem.Experience, fuBenMapItem.Money1, fuBenMapItem);

            if (fubenTongGuanData != null)
            {
                //发送奖励到客户端
                TCPOutPacket tcpOutPacket = DataHelper.ObjectToTCPOutPacket <FuBenTongGuanData>(fubenTongGuanData, Global._TCPManager.TcpOutPacketPool,
                                                                                                (int)TCPGameServerCmds.CMD_SPR_FUBENPASSNOTIFY);

                if (!Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket))
                {
                    //如果发送失败
                }
            }

            /*if (null != fuBenMapItem.GoodsDataList)
             * {
             *  //判断背包是否空间足够
             *  if (!Global.CanAddGoodsDataList(client, fuBenMapItem.GoodsDataList))
             *  {
             *      GameManager.ClientMgr.NotifyImportantMsg(
             *          Global._TCPManager.MySocketListener,
             *          Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("背包中空格不足,请清理出足够的空格后,再获取副本地图的奖励")), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, (int)HintErrCodeTypes.NoBagGrid);
             *      return false;
             *  }
             * }
             *
             * //添加角色的ID+副本顺序ID对应地图编号的奖励领取状态
             * GameManager.CopyMapMgr.AddAwardState(client.ClientData.RoleID, client.ClientData.FuBenSeqID, client.ClientData.MapCode, 1);
             *
             * if (Global.FilterFallGoods(client)) //是否奖励物品
             * {
             *  //奖励用户物品
             *  if (null != fuBenMapItem.GoodsDataList)
             *  {
             *      for (int i = 0; i < fuBenMapItem.GoodsDataList.Count; i++)
             *      {
             *          //想DBServer请求加入某个新的物品到背包中
             *          //添加物品
             *          Global.AddGoodsDBCommand(Global._TCPManager.TcpOutPacketPool,
             *              client, fuBenMapItem.GoodsDataList[i].GoodsID, fuBenMapItem.GoodsDataList[i].GCount, fuBenMapItem.GoodsDataList[i].Quality, "", fuBenMapItem.GoodsDataList[i].Forge_level, fuBenMapItem.GoodsDataList[i].Binding, 0, "", true, 1, "副本奖励物品", Global.ConstGoodsEndTime, fuBenMapItem.GoodsDataList[i].AddPropIndex, fuBenMapItem.GoodsDataList[i].BornIndex, fuBenMapItem.GoodsDataList[i].Lucky, fuBenMapItem.GoodsDataList[i].Strong);
             *      }
             *  }
             * }
             *
             * //奖励用户经验
             * //异步写数据库,写入经验和级别
             * int experience = fuBenMapItem.Experience;
             *
             * //处理角色经验
             * GameManager.ClientMgr.ProcessRoleExperience(client, experience, true, false);
             *
             * //通知客户端
             * if (notifyClient)
             * {
             *  string msgText = string.Format(Global.GetLang("恭喜您通关本副本后,获得了{0}点经验奖励"), experience);
             *  GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool,
             *      client, msgText, GameInfoTypeIndexes.Hot, ShowGameInfoTypes.ErrAndBox, 0);
             * }
             *
             * //判断如果是最后一层,则不显示
             * int toNextMapCode = FuBenManager.FindNextMapCodeByFuBenID(client.ClientData.MapCode);
             * if (-1 == toNextMapCode) //最后一层?
             * {
             *  //副本通关获取经验通知
             *  Global.BroadcastFuBenExperience(client, fuBenID, experience);
             * }
             *
             * //奖励用户金钱
             * //异步写数据库,写入金钱
             * int money = fuBenMapItem.Money1;
             * if (-1 != money)
             * {
             *  //过滤金币奖励
             *  money = Global.FilterValue(client, money);
             *
             *  //更新用户的铜钱
             *  GameManager.ClientMgr.AddMoney1(Global._TCPManager.MySocketListener, Global._TCPManager.tcpClientPool, Global._TCPManager.TcpOutPacketPool, client, money, false);
             *
             *  //GameManager.SystemServerEvents.AddEvent(string.Format("角色获取金钱, roleID={0}({1}), Money={2}, newMoney={3}", client.ClientData.RoleID, client.ClientData.RoleName, client.ClientData.Money1, money), EventLevels.Record);
             * }*/

            Global.AddFuBenAwardEvent(client, fuBenID);

            return(true);
        }
        public static void SendMsgToClientForExperienceCopyMapAward(GameClient client)
        {
            CopyMap tmpCopyMap = ExperienceCopySceneManager.m_ExperienceListCopyMaps[client.ClientData.FuBenSeqID];

            if (tmpCopyMap != null)
            {
                int fuBenSeqID = FuBenManager.FindFuBenSeqIDByRoleID(client.ClientData.RoleID);
                FuBenTongGuanData fubenTongGuanData = null;
                if (fuBenSeqID > 0)
                {
                    FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(fuBenSeqID);
                    if (null != fuBenInfoItem)
                    {
                        fuBenInfoItem.EndTicks = TimeUtil.NOW();
                        int addFuBenNum = 1;
                        if (fuBenInfoItem.nDayOfYear != TimeUtil.NowDateTime().DayOfYear)
                        {
                            addFuBenNum = 0;
                        }
                        int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
                        if (fuBenID > 0)
                        {
                            int usedSecs = (int)((fuBenInfoItem.EndTicks - fuBenInfoItem.StartTicks) / 1000L);
                            Global.UpdateFuBenDataForQuickPassTimer(client, fuBenID, usedSecs, addFuBenNum);
                            FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);
                            if (fuBenMapItem.Experience > 0 && fuBenMapItem.Money1 > 0)
                            {
                                int  nMaxTime     = fuBenMapItem.MaxTime * 60;
                                long startTicks   = fuBenInfoItem.StartTicks;
                                long endTicks     = fuBenInfoItem.EndTicks;
                                int  nFinishTimer = (int)(endTicks - startTicks) / 1000;
                                int  killedNum    = 0;
                                int  nDieCount    = fuBenInfoItem.nDieCount;
                                fubenTongGuanData = Global.GiveCopyMapGiftForScore(client, fuBenID, client.ClientData.MapCode, nMaxTime, nFinishTimer, killedNum, nDieCount, (int)((double)fuBenMapItem.Experience * fuBenInfoItem.AwardRate), (int)((double)fuBenMapItem.Money1 * fuBenInfoItem.AwardRate), fuBenMapItem, null);
                            }
                            GameManager.DBCmdMgr.AddDBCmd(10053, string.Format("{0}:{1}:{2}:{3}", new object[]
                            {
                                client.ClientData.RoleID,
                                Global.FormatRoleName(client, client.ClientData.RoleName),
                                fuBenID,
                                usedSecs
                            }), null, client.ServerId);
                            int           nLev            = -1;
                            SystemXmlItem systemFuBenItem = null;
                            if (!GameManager.systemFuBenMgr.SystemXmlItemDict.TryGetValue(fuBenID, out systemFuBenItem))
                            {
                                nLev = systemFuBenItem.GetIntValue("FuBenLevel", -1);
                            }
                            GameManager.ClientMgr.UpdateRoleDailyData_FuBenNum(client, 1, nLev, false);
                        }
                    }
                }
                if (fubenTongGuanData != null)
                {
                    TCPOutPacket tcpOutPacket = DataHelper.ObjectToTCPOutPacket <FuBenTongGuanData>(fubenTongGuanData, Global._TCPManager.TcpOutPacketPool, 521);
                    if (!Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket, true))
                    {
                    }
                }
            }
        }
예제 #14
0
        /// <summary>
        // 经验副本奖励
        /// </summary>
        public static void SendMsgToClientForExperienceCopyMapAward(GameClient client)
        {
            CopyMap tmpCopyMap = null;

            tmpCopyMap = m_ExperienceListCopyMaps[client.ClientData.FuBenSeqID];

            if (tmpCopyMap == null)
            {
                return;
            }

            int fuBenSeqID = FuBenManager.FindFuBenSeqIDByRoleID(client.ClientData.RoleID);

            FuBenTongGuanData fubenTongGuanData = null;

            if (fuBenSeqID > 0) //如果副本不存在
            {
                FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(fuBenSeqID);
                if (null != fuBenInfoItem)
                {
                    fuBenInfoItem.EndTicks = DateTime.Now.Ticks / 10000;
                    int addFuBenNum = 1;
                    if (fuBenInfoItem.nDayOfYear != TimeUtil.NowDateTime().DayOfYear)
                    {
                        addFuBenNum = 0;
                    }

                    int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
                    if (fuBenID > 0)
                    {
                        int usedSecs = (int)((fuBenInfoItem.EndTicks - fuBenInfoItem.StartTicks) / 1000);

                        // 更新玩家通关时间信息
                        Global.UpdateFuBenDataForQuickPassTimer(client, fuBenID, usedSecs, addFuBenNum);

                        // 给玩家物品
                        FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);

                        if (fuBenMapItem.Experience > 0 && fuBenMapItem.Money1 > 0)
                        {
                            int  nMaxTime     = fuBenMapItem.MaxTime * 60; //分->秒
                            long startTicks   = fuBenInfoItem.StartTicks;
                            long endTicks     = fuBenInfoItem.EndTicks;
                            int  nFinishTimer = (int)(endTicks - startTicks) / 1000; //毫秒->秒
                            int  killedNum    = 0;                                   // tmpCopyMap.KilledNormalNum + tmpCopyMap.KilledBossNum;
                            int  nDieCount    = fuBenInfoItem.nDieCount;

                            //向客户的发放通关奖励
                            fubenTongGuanData = Global.GiveCopyMapGiftForScore(client, fuBenID, nMaxTime, nFinishTimer, killedNum, nDieCount, fuBenMapItem.Experience, fuBenMapItem.Money1, fuBenMapItem);
                        }

                        GameManager.DBCmdMgr.AddDBCmd((int)TCPGameServerCmds.CMD_DB_ADDFUBENHISTDATA, string.Format("{0}:{1}:{2}:{3}", client.ClientData.RoleID,
                                                                                                                    Global.FormatRoleName(client, client.ClientData.RoleName), fuBenID, usedSecs), null);

                        int           nLev            = -1;
                        SystemXmlItem systemFuBenItem = null;
                        if (!GameManager.systemFuBenMgr.SystemXmlItemDict.TryGetValue(fuBenID, out systemFuBenItem))
                        {
                            nLev = systemFuBenItem.GetIntValue("FuBenLevel");
                        }

                        //更新每日的通关副本的数量
                        GameManager.ClientMgr.UpdateRoleDailyData_FuBenNum(client, 1, nLev, false);

                        //副本通关
                        //Global.BroadcastFuBenOk(client, usedSecs, fuBenID);
                    }
                }
            }

            if (fubenTongGuanData != null)
            {
                //发送奖励到客户端
                TCPOutPacket tcpOutPacket = DataHelper.ObjectToTCPOutPacket <FuBenTongGuanData>(fubenTongGuanData, Global._TCPManager.TcpOutPacketPool, (int)TCPGameServerCmds.CMD_SPR_FUBENPASSNOTIFY);

                if (!Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket))
                {
                    ;
                }
            }
        }
예제 #15
0
        public static bool ProcessFuBenMapAwards(GameClient client, bool notifyClient = false)
        {
            bool result;

            if (client.ClientData.FuBenSeqID < 0)
            {
                GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(113, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                result = false;
            }
            else
            {
                int awardState = GameManager.CopyMapMgr.FindAwardState(client.ClientData.RoleID, client.ClientData.FuBenSeqID, client.ClientData.MapCode);
                if (awardState > 0)
                {
                    GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(21, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                    result = false;
                }
                else
                {
                    int fuBenID = FuBenManager.FindFuBenIDByMapCode(client.ClientData.MapCode);
                    if (fuBenID <= 0)
                    {
                        GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(114, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                        result = false;
                    }
                    else
                    {
                        FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(client.ClientData.FuBenSeqID);
                        if (null == fuBenInfoItem)
                        {
                            GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(115, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                            result = false;
                        }
                        else if (fuBenID != fuBenInfoItem.FuBenID)
                        {
                            GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(116, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                            result = false;
                        }
                        else
                        {
                            FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(fuBenID, client.ClientData.MapCode);
                            if (null == fuBenMapItem)
                            {
                                GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(117, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                                result = false;
                            }
                            else
                            {
                                CopyMap copyMap = GameManager.CopyMapMgr.FindCopyMap(client.ClientData.MapCode);
                                if (copyMap == null)
                                {
                                    GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, StringUtil.substitute(GLang.GetLang(118, new object[0]), new object[0]), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 0);
                                    result = false;
                                }
                                else
                                {
                                    GameManager.CopyMapMgr.AddAwardState(client.ClientData.RoleID, client.ClientData.FuBenSeqID, client.ClientData.MapCode, 1);
                                    int  nMaxTime     = fuBenMapItem.MaxTime * 60;
                                    long startTicks   = fuBenInfoItem.StartTicks;
                                    long endTicks     = fuBenInfoItem.EndTicks;
                                    int  nFinishTimer = (int)(endTicks - startTicks) / 1000;
                                    int  killedNum    = 0;
                                    int  nDieCount    = fuBenInfoItem.nDieCount;
                                    FuBenTongGuanData fubenTongGuanData = Global.GiveCopyMapGiftForScore(client, fuBenID, client.ClientData.MapCode, nMaxTime, nFinishTimer, killedNum, nDieCount, (int)((double)fuBenMapItem.Experience * fuBenInfoItem.AwardRate), (int)((double)fuBenMapItem.Money1 * fuBenInfoItem.AwardRate), fuBenMapItem, null);
                                    if (fubenTongGuanData != null)
                                    {
                                        TCPOutPacket tcpOutPacket = DataHelper.ObjectToTCPOutPacket <FuBenTongGuanData>(fubenTongGuanData, Global._TCPManager.TcpOutPacketPool, 521);
                                        if (!Global._TCPManager.MySocketListener.SendData(client.ClientSocket, tcpOutPacket, true))
                                        {
                                        }
                                    }
                                    Global.AddFuBenAwardEvent(client, fuBenID);
                                    result = true;
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }
예제 #16
0
        /// <summary>
        /// 加载怪物
        /// </summary>
        public void AddMapMonsters(int mapCode, GameMap gameMap)
        {
            //对于每一个地图,都要加入一个动态刷怪区域,用于动态刷怪管理
            AddDynamicMonsterZone(mapCode);

            string   fileName = string.Format("Map/{0}/Monsters.xml", mapCode);
            XElement xml      = null;

            try
            {
                xml = XElement.Load(Global.GameResPath(fileName));
            }
            catch (Exception)
            {
                throw new Exception(string.Format("加载地图怪物配置文件:{0}, 失败。没有找到相关XML配置文件!", fileName));
            }

            IEnumerable <XElement> monsterItems = xml.Elements("Monsters").Elements();

            if (null == monsterItems)
            {
                return;
            }

            //判断是否是副本地图
            bool isFuBenMap = FuBenManager.FindFuBenIDByMapCode(mapCode) > 0 ? true : false;

            foreach (var monsterItem in monsterItems)
            {
                String timePoints      = Global.GetSafeAttributeStr(monsterItem, "TimePoints");
                int    configBirthType = (int)Global.GetSafeAttributeLong(monsterItem, "BirthType");
                int    realBirthType   = configBirthType;

                String realTimePoints = timePoints;
                int    spawnMonstersAfterKaiFuDays = 0;
                int    spawnMonstersDays           = 0;
                List <BirthTimeForDayOfWeek> CreateMonstersDayOfWeek = new List <BirthTimeForDayOfWeek>();
                List <BirthTimePoint>        birthTimePointList      = null;

                //对于开服多少天之后才开始刷怪,进行特殊配置 格式:开服多少天;连续刷多少天[负数0表示一直];刷怪方式0或1;0或1的配置
                if ((int)MonsterBirthTypes.AfterKaiFuDays == configBirthType || (int)MonsterBirthTypes.AfterHeFuDays == configBirthType || (int)MonsterBirthTypes.AfterJieRiDays == configBirthType)
                {
                    String[] arr = timePoints.Split(';');
                    if (4 != arr.Length)
                    {
                        throw new Exception(String.Format("地图{0}的类型4的刷怪配置参数个数不对!!!!", mapCode));
                    }

                    spawnMonstersAfterKaiFuDays = int.Parse(arr[0]);
                    spawnMonstersDays           = int.Parse(arr[1]);
                    realBirthType  = int.Parse(arr[2]);
                    realTimePoints = arr[3];

                    if ((int)MonsterBirthTypes.TimePoint != realBirthType && (int)MonsterBirthTypes.TimeSpan != realBirthType)
                    {
                        throw new Exception(String.Format("地图{0}的类型4的刷怪配置子类型不对!!!!", mapCode));
                    }
                }

                // MU新增 一周中的哪天刷 TimePoints 配置形式 周几,时间点|周几,时间点|周几,时间点... [1/10/2014 LiaoWei]
                if ((int)MonsterBirthTypes.CreateDayOfWeek == configBirthType)
                {
                    String[] arrTime = timePoints.Split('|');

                    if (arrTime.Length > 0)
                    {
                        for (int nIndex = 0; nIndex < arrTime.Length; ++nIndex)
                        {
                            string sTimePoint = null;
                            sTimePoint = arrTime[nIndex];

                            if (sTimePoint != null)
                            {
                                String[] sTime = null;
                                sTime = sTimePoint.Split(',');

                                if (sTime != null && sTime.Length == 2)
                                {
                                    string sTimeString = null;
                                    int    nDayOfWeek  = -1;

                                    nDayOfWeek  = int.Parse(sTime[0]);
                                    sTimeString = sTime[1];

                                    if (nDayOfWeek != -1 && !string.IsNullOrEmpty(sTimeString))
                                    {
                                        string[] fields2 = sTimeString.Split(':');
                                        if (fields2.Length != 2)
                                        {
                                            continue;
                                        }

                                        string str1 = fields2[0].TrimStart('0');
                                        string str2 = fields2[1].TrimStart('0');

                                        BirthTimePoint birthTimePoint = new BirthTimePoint()
                                        {
                                            BirthHour   = Global.SafeConvertToInt32(str1),
                                            BirthMinute = Global.SafeConvertToInt32(str2),
                                        };

                                        BirthTimeForDayOfWeek BirthTimeTmp = new BirthTimeForDayOfWeek();

                                        BirthTimeTmp.BirthDayOfWeek = nDayOfWeek;
                                        BirthTimeTmp.BirthTime      = birthTimePoint;

                                        CreateMonstersDayOfWeek.Add(BirthTimeTmp);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    birthTimePointList = ParseBirthTimePoints(realTimePoints);
                }

                MonsterZone monsterZone = new MonsterZone()
                {
                    MapCode                     = mapCode,
                    ID                          = (int)Global.GetSafeAttributeLong(monsterItem, "ID"),
                    Code                        = (int)Global.GetSafeAttributeLong(monsterItem, "Code"),
                    ToX                         = (int)Global.GetSafeAttributeLong(monsterItem, "X") / gameMap.MapGridWidth,
                    ToY                         = (int)Global.GetSafeAttributeLong(monsterItem, "Y") / gameMap.MapGridHeight,
                    Radius                      = (int)Global.GetSafeAttributeLong(monsterItem, "Radius") / gameMap.MapGridWidth,
                    TotalNum                    = (int)Global.GetSafeAttributeLong(monsterItem, "Num"),
                    Timeslot                    = (int)Global.GetSafeAttributeLong(monsterItem, "Timeslot"),
                    IsFuBenMap                  = isFuBenMap,
                    BirthType                   = realBirthType,
                    ConfigBirthType             = configBirthType,
                    SpawnMonstersAfterKaiFuDays = spawnMonstersAfterKaiFuDays,
                    SpawnMonstersDays           = spawnMonstersDays,
                    SpawnMonstersDayOfWeek      = CreateMonstersDayOfWeek,
                    BirthTimePointList          = birthTimePointList,
                    BirthRate                   = (int)(Global.GetSafeAttributeDouble(monsterItem, "BirthRate") * 10000),
                };

                XAttribute attrib = monsterItem.Attribute("PursuitRadius");
                if (null != attrib)
                {
                    monsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "PursuitRadius");
                }
                else
                {
                    monsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "Radius");
                }

                //加入列表
                MonsterZoneList.Add(monsterZone);

                //如果是副本地图, 则加入副本爆怪区域列表
                if (isFuBenMap)
                {
                    FuBenMonsterZoneList.Add(monsterZone);
                }

                //加入爆怪区域
                AddMap2MonsterZoneDict(monsterZone);

                //加载静态的怪物信息
                monsterZone.LoadStaticMonsterInfo();

                //加载怪物
                monsterZone.LoadMonsters();//暂时屏蔽怪物加载
            }
        }