Example #1
0
        public override bool TakeAction()
        {

            //if (ContextUser.EnergyNum <= 0)
            //{
            //    ErrorCode = LanguageManager.GetLang().ErrorCode;
            //    ErrorInfo = LanguageManager.GetLang().St_EnergyNotEnough;
            //    return false;
            //}
            //if (ContextUser.EnergyNum <= 0 && ContextUser.TempEnergyNum == 0)
            //{
            //    ErrorCode = LanguageManager.GetLang().ErrorCode;
            //    ErrorInfo = LanguageManager.GetLang().St_EnergyNotEnough;
            //    return false;
            //}
            if (ContextUser.UserStatus == UserStatus.SaoDang)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4007_Saodanging;
                return false;
            }
            if (ContextUser.UseMagicID == 0)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4004_NoUseMagic;
                return false;
            }
            if (new PersonalCacheStruct<UserEmbattle>().FindAll(Uid, m => m.MagicID == ContextUser.UseMagicID).Count == 0)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4004_EmbattleEmpty;
                return false;
            }

            //if (ContextUser.TempEnergyNum == 0)
            //{
            //    ErrorCode = LanguageManager.GetLang().ErrorCode;
            //    ErrorInfo = LanguageManager.GetLang().St_EnergyNotEnough;
            //    return false;
            //}

            ContextUser.UserStatus = UserStatus.Combat;
            try
            {
                //触发战斗
                PlotNPCInfo npcInfo = new ShareCacheStruct<PlotNPCInfo>().FindKey(PlotNpcID);

                //原因:碰npc时掉线,再请求战斗详情
                if (npcInfo == null)
                {
                    ErrorCode = LanguageManager.GetLang().ErrorCode;
                    ErrorInfo = LanguageManager.GetLang().LoadDataError;
                    return false;
                }

                //原因:最后一个npc时,清空玩家保存副本
                if (ContextUser.UserExtend != null && ContextUser.UserExtend.MercenarySeq > npcInfo.NpcSeqNo)
                {
                    ContextUser.UserStatus = UserStatus.Normal;
                    ContextUser.UserExtend.UpdateNotify(obj =>
                    {
                        ContextUser.UserExtend.PlotStatusID = 0;
                        ContextUser.UserExtend.PlotNpcID = -1;
                        ContextUser.UserExtend.MercenarySeq = 1;
                        ContextUser.UserExtend.IsBoss = false;
                        return true;
                    });
                    //ErrorCode = LanguageManager.GetLang().ErrorCode;
                    //ErrorInfo = LanguageManager.GetLang().St4011_NoMonster;
                    //return false;
                }

                PlotInfo plotInfo = new ShareCacheStruct<PlotInfo>().FindKey(npcInfo.PlotID);
                if (plotInfo == null)
                {
                    ErrorCode = LanguageManager.GetLang().ErrorCode;
                    ErrorInfo = LanguageManager.GetLang().LoadDataError;
                    return false;
                }

                var cacheSetUserPlot = new PersonalCacheStruct<UserPlotPackage>();
                var cacheSetItemInfo = new ShareCacheStruct<ItemBaseInfo>();
                var cacheSet = new PersonalCacheStruct<UserPlotCombat>();
                var userPlotPack = cacheSetUserPlot.FindKey(ContextUser.UserID);
                var userPlot = userPlotPack != null ? userPlotPack.PlotPackage.Find(s => s.PlotID == npcInfo.PlotID) : null;
                //PlotHelper.IsKill(ContextUser.UserID, plotInfo.PlotID, plotInfo.CityID)
                if (userPlot != null && userPlot.PlotNum >= plotInfo.ChallengeNum)
                {
                    if (plotInfo.PlotType == PlotType.Elite)
                    {
                        ErrorCode = LanguageManager.GetLang().ErrorCode;
                        ErrorInfo = LanguageManager.GetLang().St4002_EliteUsed;
                        return false;
                    }
                    else if (plotInfo.PlotType == PlotType.HeroPlot)
                    {
                        ErrorCode = LanguageManager.GetLang().ErrorCode;
                        ErrorInfo = LanguageManager.GetLang().St4002_HeroPlotNum;
                        return false;
                    }
                }

                //if (userPlot != null && userPlot.ItemList != null)
                //{
                //    userPlot.UpdateNotify(obj =>
                //    {
                //        userPlot.ItemList.Clear();
                //        return true;
                //    });
                //}
                if (npcInfo.NpcSeqNo == 1)
                {
                    userPlot.ItemList.Clear();
                    ContextUser.IsItem = false;
                }
                userPlotCombat = cacheSet.FindKey(ContextUser.UserID, PlotNpcID);
                if (userPlotCombat != null && userPlotCombat.IsWin && ContextUser.UserExtend != null &&
                     PlotNpcID == ContextUser.UserExtend.PlotNpcID && !ContextUser.IsItem)
                {
                    prizeItems = PlotHelper.GetPlotMonsterItems(Uid, npcInfo.PlotNpcID);
                }
                else
                {
                    ISingleCombat plotCombater = CombatFactory.TriggerPlot(ContextUser, PlotNpcID);
                    if (plotCombater == null)
                    {
                        ErrorCode = LanguageManager.GetLang().ErrorCode;
                        ErrorInfo = LanguageManager.GetLang().LoadDataError;
                        return false;
                    }
                    if (userPlotCombat == null)
                    {
                        userPlotCombat = new UserPlotCombat()
                                             {
                                                 UserID = ContextUser.UserID,
                                                 PlotNpcID = PlotNpcID
                                             };
                        cacheSet.Add(userPlotCombat);
                        userPlotCombat = cacheSet.FindKey(ContextUser.UserID, PlotNpcID);
                    }
                    userPlotCombat.PlotID = npcInfo.PlotID;
                    userPlotCombat.CombatDate = DateTime.Now;
                    userPlotCombat.IsWin = plotCombater.Doing();
                    if (!userPlotCombat.IsWin)
                    {
                        userPlotCombat.OverNum += 1;
                    }
                    ContextUser.IsItem = npcInfo.NpcSeqNo == 1 ? false : ContextUser.IsItem;
                    combatProcessList = (CombatProcessContainer)plotCombater.GetProcessResult();
                    userPlotCombat.GeneralNum = combatProcessList.AttackList.Count;
                    userPlotCombat.GeneralOverNum = GetOverGeneralNum(combatProcessList.AttackList.ToList());
                    //userPlotCombat.CombatProcess = JsonUtils.Serialize(combatProcessList);
                    int generalNum = combatProcessList.DefenseList.FindAll(s => s.LiveNum > 0).Count;
                    if (userPlotCombat.IsWin)
                    {
                        if (ContextUser.UserExtend != null)
                        {
                            ContextUser.UserExtend.UpdateNotify(obj =>
                            {
                                ContextUser.UserExtend.PlotStatusID = npcInfo.PlotID;
                                ContextUser.UserExtend.PlotNpcID = PlotNpcID;
                                ContextUser.UserExtend.MercenarySeq = MathUtils.Addition(npcInfo.NpcSeqNo, (short)1);
                                ContextUser.UserExtend.IsBoss = npcInfo.IsBoss; //是否最后一个副本npc
                                return true;
                            });
                        }
                        //玩家通过一个城市的所有副本时,增加聊天频道系统提示
                        if (userPlot.PlotStatus != PlotStatus.Completed && npcInfo.IsBoss)      //玩家此副本胜利
                        {
                            var city = new ShareCacheStruct<CityInfo>().FindKey(plotInfo.CityID);
                            var nextPlot = new ShareCacheStruct<PlotInfo>().FindKey(plotInfo.AftPlotID);
                            if (city != null && nextPlot != null && nextPlot.CityID != plotInfo.CityID)            //此城市的最后一个副本
                            {
                                string content = string.Format(LanguageManager.GetLang().St_systemprompts, ContextUser.NickName,
                                                        city.CityName);
                                new TjxChatService().SystemSend(ChatType.World, content);
                            }
                        }
                        PlotHelper.DoPlotPrize(Uid, npcInfo, userPlotCombat, generalNum, out _honourNum);
                        if (npcInfo.NpcSeqNo == 1)
                        {
                            ContextUser.EnergyNum = MathUtils.Subtraction(ContextUser.EnergyNum, ContextUser.TempEnergyNum).ToShort();
                            //原因:刷晶石BUG
                            ContextUser.TempEnergyNum = 0;

                        }
                        if (!ContextUser.IsItem)
                        {
                            prizeItems = PlotHelper.GetPlotMonsterItems(Uid, npcInfo.PlotNpcID);
                        }
                        TaskHelper.KillPlotMonster(Uid, npcInfo.PlotID, PlotNpcID);

                        //var stroyTaskList = new ShareCacheStruct<StoryTaskInfo>().FindAll(s => s.PlotID == plotInfo.AftPlotID);
                        //foreach (var story in stroyTaskList)
                        //{
                        //    var usertask = new PersonalCacheStruct<UserTask>().FindKey(ContextUser.UserID, story.PlotID);
                        //    if (usertask != null)
                        //    {
                        PlotHelper.EnablePlot(Uid, plotInfo.AftPlotID);
                        //    }
                        //}

                        if (plotInfo.PlotType == PlotType.Elite)
                        {
                            EliteDailyRestrain(npcInfo);
                            NoviceHelper.ElitePlotFestivalList(ContextUser); //通关精英副本获得奖励
                        }
                        else if (plotInfo.PlotType == PlotType.Kalpa)
                        {
                            KalpaDailyRestrain(npcInfo);
                        }
                        else if (plotInfo.PlotType == PlotType.HeroPlot)
                        {
                            PlotHelper.EnableHeroPlot(ContextUser.UserID, plotInfo.PlotID);
                            PlotHelper.HeroDailyRestrain(ContextUser.UserID, plotInfo.PlotID, plotInfo.CityID);
                        }

                    }
                    else
                    {

                        ContextUser.GeneralAllCount = 0;
                        ContextUser.GeneralKillCount = 0;
                    }


                    var restrain = new PersonalCacheStruct<UserDailyRestrain>().FindKey(Uid);
                    if (restrain != null)
                    {
                        var restrainSet = new ShareCacheStruct<DailyRestrainSet>().FindKey(RestrainType.PlotGoto);
                        if (restrainSet != null)
                            GotoNum = MathUtils.Subtraction(restrainSet.MaxNum, restrain.Funtion14, 0);
                    }
                }
                //原因:最后一个npc时,清空玩家保存副本
                if (ContextUser.UserExtend != null && ContextUser.UserExtend.IsBoss)
                {
                    ContextUser.UserExtend.UpdateNotify(obj =>
                    {
                        ContextUser.UserExtend.PlotStatusID = 0;
                        ContextUser.UserExtend.PlotNpcID = -1;
                        ContextUser.UserExtend.MercenarySeq = 0;
                        ContextUser.UserExtend.IsBoss = npcInfo.IsBoss;
                        return true;
                    });
                }

                if (!ContextUser.IsItem)
                {
                    foreach (var prize in prizeItems)
                    {
                        if (prize.Type == 0 && userPlot != null)
                        {
                            var itemInfo = cacheSetItemInfo.FindKey(prize.ItemID);
                            UniversalInfo universalInfo = new UniversalInfo();
                            universalInfo.HeadID = itemInfo != null ? itemInfo.HeadID : string.Empty;
                            universalInfo.ItemID = itemInfo != null ? itemInfo.ItemID : 0;
                            universalInfo.ItemDesc = itemInfo != null ? itemInfo.ItemDesc : string.Empty;
                            universalInfo.MaxHeadID = itemInfo != null ? itemInfo.MaxHeadID : string.Empty;
                            universalInfo.Name = itemInfo != null ? itemInfo.ItemName : string.Empty;
                            universalInfo.Num = prize.Num;
                            if (userPlot.ItemList != null && userPlot.ItemList.Count > 0)
                            {
                                var item = userPlot.ItemList.Find(s => s.ItemID == prize.ItemID);
                                if (item != null)
                                {
                                    item.UpdateNotify(obj =>
                                    {
                                        item.Num = MathUtils.Addition(item.Num, prize.Num);
                                        return true;
                                    });
                                }
                                else
                                {
                                    userPlot.UpdateNotify(obj =>
                                    {
                                        userPlot.ItemList.Add(universalInfo);
                                        return true;
                                    });
                                }
                            }
                            else
                            {
                                userPlot.UpdateNotify(obj =>
                                {
                                    userPlot.ItemList.Add(universalInfo);
                                    return true;
                                });
                            }

                        }
                        ContextUser.IsItem = true;
                    }
                }
                var a = userPlot.ItemList;
            }
            finally
            {
                ContextUser.UserStatus = UserStatus.Normal;
            }
            //日志
            UserCombatLog log = new UserCombatLog();
            log.CombatLogID = Guid.NewGuid().ToString("N");
            log.UserID = userPlotCombat.UserID;
            log.CityID = ContextUser.CityID;
            log.PlotID = userPlotCombat.PlotID;
            log.NpcID = userPlotCombat.PlotNpcID;
            log.CombatType = CombatType.Plot;
            log.HostileUser = string.Empty;
            log.IsWin = userPlotCombat.IsWin;
            log.CombatProcess = JsonUtils.Serialize(combatProcessList);
            log.PrizeItem = prizeItems;
            log.CreateDate = DateTime.Now;
            var sender = DataSyncManager.GetDataSender();
            sender.Send(log);

            UserHelper.GetGeneralLife(ContextUser.UserID);
            UserHelper.RegainGeneralLife(ContextUser.UserID);

            //var userEmbattleList = EmbattleHelper.CurrEmbattle(ContextUser.UserID, true);
            //           foreach (var userEmbattle in userEmbattleList)
            //           {
            //               _userTalPriority = MathUtils.Addition(_userTalPriority, PriorityHelper.GeneralTotalPriority(ContextUser.UserID, userEmbattle.GeneralID));
            //           }
            selfAbilityEffectList = UserAbilityHelper.GetSelfAbilityEffectList(ContextUser.UserID, 0);
            //var userEmbattleList = EmbattleHelper.CurrEmbattle(ContextUser.UserID, true);

            _userTalPriority = CombatHelper.TotalPriorityNum(ContextUser.UserID, 0);

            return true;
        }
Example #2
0
        /// <summary>
        /// 副本奖励,如果通关下发通关奖励
        /// </summary>
        /// <param name="userID"></param>
        /// <param name="plotNpcInfo"></param>
        /// <param name="userPlotCombat"></param>
        internal static void DoPlotPrize(string userID, PlotNPCInfo plotNpcInfo, UserPlotCombat userPlotCombat, int npcGeneralNum, out int honourNum)
        {
            honourNum = 0;
            int experience = 0;
            PlotInfo plotInfo = new ConfigCacheSet<PlotInfo>().FindKey(plotNpcInfo.PlotID);
            var package = UserPlotPackage.Get(userID);
            if (plotInfo == null || plotNpcInfo == null || userPlotCombat == null || package == null)
            {
                return;
            }

            GameUser user = new GameDataCacheSet<GameUser>().FindKey(userID);

            if (user != null)
            {

                experience += plotNpcInfo.Experience;
                userPlotCombat.Experience = plotNpcInfo.Experience;
                if (!string.IsNullOrEmpty(user.MercenariesID))
                {
                    //公会技能加成
                    userPlotCombat.Experience = MathUtils.RoundCustom(experience * CombatHelper.GetGuildAbilityNum(user.UserID, GuildAbilityType.Experience)).ToInt();
                    experience = userPlotCombat.Experience;
                }
                var cacheSetGeneral = new GameDataCacheSet<UserGeneral>();
                var userMagic = new GameDataCacheSet<UserMagic>().Find(user.UserID, s => s.IsEnabled);
                int userMagicID = userMagic == null ? 0 : userMagic.MagicID;
                var userEmbattleList = new GameDataCacheSet<UserEmbattle>().FindAll(userID, s => s.MagicID == userMagicID && s.GeneralID > 0);
                int generalNum = 0;
                userEmbattleList.ForEach(userEmbattle =>
                {
                    var userGeneral = cacheSetGeneral.FindKey(userID, userEmbattle.GeneralID);
                    generalNum = userGeneral != null && userGeneral.LifeNum > 0
                                     ? MathUtils.Addition(generalNum, 1)
                                     : generalNum;
                });
                user.GeneralAllCount = MathUtils.Addition(user.GeneralAllCount, userPlotCombat.GeneralNum);
                user.GeneralKillCount = MathUtils.Addition(user.GeneralKillCount,
                                                           (userPlotCombat.GeneralNum - generalNum));
                //怪物掉落物品)
                if (plotNpcInfo.IsBoss)
                {

                    if (plotInfo.PlotType == PlotType.Normal && user.PlotProgress < plotInfo.PlotID)
                    {
                        user.PlotProgress = plotInfo.PlotID;
                    }

                    //日常任务-通关副本
                    TaskHelper.TriggerDailyTask(userID, 4005);

                    DateTime currDate = DateTime.Now;
                    //通关奖励

                    var userPlot = UserPlotHelper.GetUserPlotInfo(userID, plotNpcInfo.PlotID);
                    if (userPlot == null)
                    {
                        userPlot = new UserPlotInfo();
                        userPlot.PlotID = plotNpcInfo.PlotID;
                        userPlot.CreateDate = currDate;
                        package.SaveItem(userPlot);
                    }

                    NoviceHelper.PlotFestivalList(user, plotInfo.PlotID); //活动集合
                    List<UserPlotCombat> preUserPlotList = new GameDataCacheSet<UserPlotCombat>().FindAll(userID, m => !m.PlotNpcID.Equals(userPlotCombat.PlotNpcID) && m.PlotID == plotNpcInfo.PlotID);
                    preUserPlotList.Add(userPlotCombat);
                    List<UserPlotCombat> plotCombatList = preUserPlotList;
                    short starScore;
                    PlotSuccessType plotSuccessType = PlotSuccessType.No;
                    userPlot.ScoreNum = GetPlotScoreNum(plotCombatList, out starScore);

                    userPlot.PlotStatus = PlotStatus.Completed;
                    userPlot.AttackScore = 0;
                    userPlot.DefenseScore = 0;
                    userPlot.ItemID = 0;
                    userPlot.EnchantID = 0;

                    userPlot.PlotSuccessType = plotSuccessType;
                    //获得星星等级
                    if (userPlotCombat.IsWin)
                    {
                        double pren = 0;
                        GetStar(user, generalNum, out starScore, out plotSuccessType, out  pren);
                        userPlot.StarScore = starScore;
                        userPlot.PlotSuccessType = plotSuccessType;
                        //获得荣誉值
                        honourNum = plotInfo.HonourNum;

                        userPlot.PlotNum = MathUtils.Addition(userPlot.PlotNum, 1);
                        if (GetPlotChallengeNum(userID, plotNpcInfo.PlotID) == 1)
                        {
                            if (starScore >= 3)
                            {
                                if (plotInfo.PlotType==PlotType.Elite)  // 如果是精英副本
                                {
                                    if (userPlot.FirstWin==false)  // 如果是首次获得3星
                                    {
                                        userPlot.FirstWin = true;
                                        userPlot.ExpNum = (int)(plotInfo.ExpNum * 2);
                                        userPlot.PennyNum = (int)(plotInfo.GameCoin * 2);
                                    }
                                    else
                                    {
                                        userPlot.ExpNum = plotInfo.ExpNum;
                                        userPlot.PennyNum = plotInfo.GameCoin;
                                    }
                                }
                                else
                                {
                                    userPlot.ExpNum = (int)(plotInfo.ExpNum * 2);
                                    userPlot.PennyNum = (int)(plotInfo.GameCoin * 2);
                                }
                            }
                            else
                            {
                                userPlot.ExpNum = plotInfo.ExpNum;
                                userPlot.PennyNum = plotInfo.GameCoin;
                            }
                            honourNum = honourNum * starScore;
                        }
                        else
                        {
                            userPlot.ExpNum = plotInfo.ExpNum;
                            userPlot.PennyNum = plotInfo.GameCoin;
                        }
                        userPlot.HonourNum = honourNum;
                        GeneralEscalateHelper.AddUserLv(user, honourNum);
                    }
                    else
                    {
                        PlotFailureType plotFailureType;
                        GetFailure(npcGeneralNum, out plotFailureType);
                        userPlot.PlotFailureType = plotFailureType;

                    }

                    // userPlot.ExpNum = plotInfo.ExpNum;
                    userPlot.GoldNum = plotInfo.GetRandomGold();
                    if (!string.IsNullOrEmpty(user.MercenariesID))
                    {
                        //公会技能加成
                        userPlot.Experience = MathUtils.RoundCustom(userPlot.Experience * CombatHelper.GetGuildAbilityNum(user.UserID, GuildAbilityType.Experience)).ToInt();
                        userPlot.ExpNum = MathUtils.RoundCustom(userPlot.ExpNum * CombatHelper.GetGuildAbilityNum(user.UserID, GuildAbilityType.ExpNum)).ToInt();
                        userPlot.PennyNum = MathUtils.RoundCustom(userPlot.PennyNum * CombatHelper.GetGuildAbilityNum(user.UserID, GuildAbilityType.CoinNum)).ToInt();
                    }
                    CacheList<PrizeItemInfo> itemList = new CacheList<PrizeItemInfo>();
                    string itemName = string.Empty;
                    if (plotInfo.PlotType != PlotType.Kalpa)
                    {
                        var copyList = GetPrizeItems(userID, plotInfo.ItemProbability, plotInfo.ItemRank, plotInfo.PlotID, userPlot);
                        copyList.Foreach(item =>
                        {
                            if (item.Type == 0)
                            {
                                itemList.Add(item);
                            }
                            return true;
                        });

                        if (itemList.Count > 0)
                        {
                            userPlot.ItemID = itemList[0].ItemID;
                            var item = new ConfigCacheSet<ItemBaseInfo>().FindKey(userPlot.ItemID);
                            itemName = item != null ? item.ItemName : string.Empty;
                        }
                    }
                    if (!string.IsNullOrEmpty(plotInfo.EnchantID) && plotInfo.EnchantProbability > 0)
                    {
                        var copyList = GetKalpaPrizeItems(userID, plotInfo.ItemProbability, plotInfo.ItemRank, plotInfo.PlotID, userPlot);
                        copyList.Foreach(item =>
                        {
                            if (item.Type == 2)
                            {
                                itemList.Add(item);
                                if (plotInfo.PlotType != PlotType.Kalpa)
                                {
                                    userPlot.EnchantID = item.ItemID;
                                    EnchantAddUser(user, item.ItemID);
                                }
                            }
                            return true;
                        });

                    }

                    if (plotInfo.PlotType == PlotType.Elite)
                    {
                        //精英副本奖励发聊天<label color='0,255,0' >{0}</label><label>{0}</label>
                        string content = string.Format(LanguageManager.GetLang().St_PlotRewardNotice, user.NickName, plotNpcInfo.NpcName,
                           itemName);
                        new TjxChatService().SystemSend(ChatType.World, content);
                    }
                    //祝福加金币
                    if (UserHelper.GainBlessing(user, 0) > 0)
                    {
                        UserHelper.GainBlessing(user, 1);
                        userPlot.BlessPennyNum = (int)Math.Floor(userPlot.PennyNum * new GuildMember().BlessingCionPercent);
                        userPlot.PennyNum = MathUtils.Addition(userPlot.PennyNum, userPlot.BlessPennyNum);
                        user.GameCoin = MathUtils.Addition(user.GameCoin, userPlot.PennyNum, int.MaxValue);
                    }

                    if (userPlot.CompleteDate <= MathUtils.SqlMinDate)
                    {
                        userPlot.CompleteDate = currDate;
                    }
                    userPlot.RefleshDate = currDate;
                    //experience = userPlot.Experience;
                    //userPlotCombat.Experience = experience;
                    experience += userPlot.Experience + userPlot.BlessExperience;
                    user.GameCoin = MathUtils.Addition(user.GameCoin, userPlot.PennyNum, int.MaxValue);
                    user.ExpNum = MathUtils.Addition(user.ExpNum, userPlot.ExpNum, int.MaxValue);
                    user.ItemGold = MathUtils.Addition(user.ItemGold, userPlot.GoldNum, int.MaxValue);
                    //user.Update();

                    //奖励日志
                    UserPlotPrizeLog prizeLog = new UserPlotPrizeLog
                    {
                        PrizeLogID = Guid.NewGuid().ToString(),
                        ScoreNum = userPlot.ScoreNum,
                        StarScore = userPlot.StarScore,
                        PrizeItem = itemList,
                        Experience = userPlot.Experience,
                        ExpNum = userPlot.ExpNum,
                        GameCoin = userPlot.PennyNum,
                        PlotID = userPlot.PlotID,
                        UserID = userID,
                        CreateDate = DateTime.Now
                    };
                    var sender = DataSyncManager.GetDataSender();
                    sender.Send(prizeLog);
                    //重置评价
                    foreach (UserPlotCombat plotCombat in plotCombatList)
                    {
                        //只有一个NPC时更新不了
                        //if (plotCombatList.Count > 1 && plotCombat.Equals(userPlotCombat)) continue;

                        plotCombat.GeneralNum = 0;
                        plotCombat.GeneralOverNum = 0;
                        plotCombat.OverNum = 0;
                        //plotCombat.Update();

                    }
                    //通关副本 副本ID清空
                    if (user.UserExtend != null)
                    {
                        user.UserExtend.UpdateNotify(obj =>
                        {
                            user.UserExtend.PlotStatusID = 0;
                            user.UserExtend.PlotNpcID = 0;
                            user.UserExtend.MercenarySeq = 0;
                            return true;
                        });
                    }
                    package.SaveItem(userPlot);
                    user.GeneralAllCount = 0;
                    user.GeneralKillCount = 0;
                    if (plotInfo.PlotType == PlotType.Normal)
                    {
                        int multiple = FestivalHelper.DuplicateDropDouble(user.UserID);
                        if (multiple > 1)
                        {
                            FestivalHelper.DuplicateDropDoubleRestrain(user.UserID);
                        }
                    }
                }

                //佣兵经验
                AddExprerience(user, experience);

            }
        }
Example #3
0
        public override bool TakeAction()
        {
            var cacheEnvSet = new ConfigCacheSet<ConfigEnvSet>();
            var envset = cacheEnvSet.FindKey("CombatMaxBout");
            if (envset != null)
            {

            }
            PlotNPCInfo npcInfo = new ConfigCacheSet<PlotNPCInfo>().FindKey(PlotNpcID);
            if (npcInfo == null)
            {
                return false;
            }
            PlotInfo plotInfo = new ConfigCacheSet<PlotInfo>().FindKey(npcInfo.PlotID);
            if (plotInfo == null)
            {
                return false;
            }
            //判断是否有下一关
            int nextLayerNum = MathUtils.Addition(ContextUser.UserExtend.LayerNum, 1);
            int nextHurdleNum = MathUtils.Addition(ContextUser.UserExtend.HurdleNum, 1);
            if ((UserHelper.IsLastLayer(plotInfo) || !IsGotoNextLayer(nextLayerNum)))
            {
                if (UserHelper.IsKill(ContextUser, npcInfo.PlotID))
                {
                    ErrorCode = LanguageManager.GetLang().ErrorCode;
                    ErrorInfo = LanguageManager.GetLang().St4303_PlotNotEnableLayerNum;
                    return false;
                }
            }

            if (ops != 1 && UserHelper.IsPromptBlood(ContextUser.UserID))
            {
                ErrorCode = 1;
                ErrorInfo = LanguageManager.GetLang().St4002_PromptBlood;
                return false;
            }
            //原因:灵件背包满时未提示
            if (ops != 1 && UserHelper.IsSpareGridNum(ContextUser, 0))
            {
                ErrorCode = 1;
                ErrorInfo = LanguageManager.GetLang().St_User_SpareBeiBaoMsg;
                return false;
            }

            if (ops != 1 && !string.IsNullOrEmpty(plotInfo.EnchantID) && plotInfo.EnchantProbability > 0 && EnchantHelper.IsEnchantPackage(ContextUser.UserID))
            {
                ErrorCode = 1;
                ErrorInfo = LanguageManager.GetLang().St4002_EnchantPackageFull;
                return false;
            }

            if (ContextUser.UserStatus == UserStatus.SaoDang)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4007_Saodanging;
                return false;
            }
            if (ContextUser.UseMagicID == 0)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4004_NoUseMagic;
                return false;
            }
            if (new GameDataCacheSet<UserEmbattle>().FindAll(Uid, m => m.MagicID == ContextUser.UseMagicID).Count == 0)
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4004_EmbattleEmpty;
                return false;
            }
            //PlotNPCInfo npcInfo = new ConfigCacheSet<PlotNPCInfo>().FindKey(PlotNpcID);
            if (IsPlotOut(npcInfo))
            {
                ErrorCode = LanguageManager.GetLang().ErrorCode;
                ErrorInfo = LanguageManager.GetLang().St4303_PlotNotEnable;
                return false;
            }

            UserHelper.UserGeneralPromptBlood(ContextUser);//佣兵自动使用绷带补血

            //触发战斗
            ISingleCombat plotCombater = CombatFactory.TriggerPlot(ContextUser, PlotNpcID);
            if (plotCombater == null)
            {
                return false;
            }
            var cacheSet = new GameDataCacheSet<UserPlotCombat>();
            userPlotCombat = cacheSet.FindKey(ContextUser.UserID, PlotNpcID);
            if (userPlotCombat == null)
            {
                userPlotCombat = new UserPlotCombat()
                {
                    UserID = ContextUser.UserID,
                    PlotNpcID = PlotNpcID
                };
                cacheSet.Add(userPlotCombat);
                userPlotCombat = cacheSet.FindKey(ContextUser.UserID, PlotNpcID);
            }
            userPlotCombat.PlotID = npcInfo.PlotID;
            userPlotCombat.CombatDate = DateTime.Now;
            userPlotCombat.IsWin = plotCombater.Doing();
            if (!userPlotCombat.IsWin)
            {
                userPlotCombat.OverNum += 1;
            }
            combatProcessList = (CombatProcessContainer)plotCombater.GetProcessResult();
            userPlotCombat.GeneralNum = combatProcessList.AttackList.Count;
            userPlotCombat.GeneralOverNum = GetOverGeneralNum(combatProcessList.AttackList.ToList());

            if (userPlotCombat.IsWin)
            {
                int honourNum = 0;
                PlotHelper.DoPlotPrize(Uid, npcInfo, userPlotCombat, 0, out honourNum);
                prizeItems = PlotHelper.GetKalpaPlotMonsterItems(Uid, npcInfo.PlotID, npcInfo.PlotNpcID);
                universalArray = GetUniversalList().ToArray();
                if (plotInfo.PlotType == PlotType.Kalpa)
                {

                    KalpaDailyRestrain(npcInfo);
                    if (ContextUser.UserExtend == null)
                    {
                        ContextUser.UserExtend = new GameUserExtend();
                    }

                    PlotInfo[] plotInfoList = new ConfigCacheSet<PlotInfo>().FindAll(m => m.LayerNum == ContextUser.UserExtend.LayerNum && m.PlotSeqNo == nextHurdleNum && m.PlotType == PlotType.Kalpa).ToArray();
                    if (plotInfoList.Length > 0)
                    {
                        int layerNum = ContextUser.UserExtend.LayerNum;
                        int hurdleNum = ContextUser.UserExtend.HurdleNum;

                        if (CheckHurdleNum(ContextUser.UserID, layerNum, hurdleNum))
                        {
                            ContextUser.UserExtend.UpdateNotify(obj =>
                                {
                                    ContextUser.UserExtend.HurdleNum = nextHurdleNum;
                                    return true;
                                });
                            //ContextUser.Update();
                            PlotHelper.EnablePlot(ContextUser.UserID, plotInfo.AftPlotID);
                        }
                    }
                    else if (IsGotoNextLayer(nextLayerNum))
                    {
                        //判断是否能到下一层
                        plotInfoList = new ConfigCacheSet<PlotInfo>().FindAll(m => m.LayerNum == nextLayerNum && m.PlotType == PlotType.Kalpa).ToArray();
                        if (plotInfoList.Length > 0)
                        {
                            ContextUser.UserExtend.UpdateNotify(obj =>
                            {
                                ContextUser.UserExtend.LayerNum = nextLayerNum;
                                ContextUser.UserExtend.HurdleNum = 1;
                                return true;
                            });
                            //ContextUser.Update();
                            PlotHelper.EnablePlot(ContextUser.UserID, plotInfo.AftPlotID);
                        }
                    }
                }
            }

            //日志
            UserCombatLog log = new UserCombatLog();
            log.CombatLogID = Guid.NewGuid().ToString();
            log.UserID = userPlotCombat.UserID;
            log.CityID = ContextUser.CityID;
            log.PlotID = userPlotCombat.PlotID;
            log.NpcID = userPlotCombat.PlotNpcID;
            log.CombatType = CombatType.Kalpa;
            log.HostileUser = string.Empty;
            log.IsWin = userPlotCombat.IsWin;
            log.CombatProcess = JsonUtils.Serialize(combatProcessList);
            log.PrizeItem = prizeItems;
            log.CreateDate = DateTime.Now;
            var sender = DataSyncManager.GetDataSender();
            sender.Send(log);

            UserHelper.GetGeneralLife(ContextUser.UserID);

            return true;
        }