Beispiel #1
0
        /// <summary>
        /// 鼓舞
        /// </summary>
        /// <param name="isUseGold">是否使用晶石</param>
        /// <param name="percent"></param>
        public bool Inspire(bool isUseGold, out double percent)
        {
            AssignGoup();
            bool result = false;

            percent = 0;

            CountryLvGroup lvGroup;

            if (TryLvGroup(out lvGroup) && lvGroup.UserList.ContainsKey(_countryUser.UserId))
            {
                CountryUser countryUser = lvGroup.UserList[_countryUser.UserId];

                GameUser gameUser = new GameDataCacheSet <GameUser>().FindKey(_countryUser.UserId);
                if (gameUser != null && gameUser.UserStatus == UserStatus.CountryCombat)
                {
                    if (countryUser.InspirePercent < 1 && (isUseGold || RandomUtils.IsHit(InspirePercent)))
                    {
                        result = true;
                        countryUser.InspirePercent = MathUtils.Addition(countryUser.InspirePercent, InspireIncrease, 1);
                    }
                    percent = countryUser.InspirePercent;
                }
            }
            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// 获得战斗过程
        /// </summary>
        /// <param name="isSelf"></param>
        /// <returns></returns>
        public List <CountryCombatProcess> GetCombatProcess(bool isSelf)
        {
            List <CountryCombatProcess> list = new List <CountryCombatProcess>();
            CountryUser    countryUser       = new CountryUser();
            int            version           = 0;
            CountryLvGroup lvGroup;

            if (TryLvGroup(out lvGroup))
            {
                if (lvGroup.UserList.ContainsKey(_countryUser.UserId))
                {
                    countryUser = lvGroup.UserList[_countryUser.UserId];
                    version     = countryUser.Version;
                }
                if (isSelf && _combatProcessList != null)
                {
                    list = _combatProcessList.FindAll(
                        m => (m.WinUserId == _countryUser.UserId || m.FailUserId == _countryUser.UserId) && m.Version > version);
                }
                else if (_combatProcessList != null)
                {
                    list = _combatProcessList.FindAll(m => m.Version > version);
                }

                foreach (var process in list)
                {
                    if (process.Version > countryUser.Version)
                    {
                        countryUser.Version = process.Version;
                        //lvGroup.Update(countryUser);
                    }
                }
            }
            return(list);
        }
Beispiel #3
0
 internal void Update(CountryUser cuser)
 {
     if (UserList.ContainsKey(cuser.UserId))
     {
         UserList[cuser.UserId] = cuser;
     }
 }
Beispiel #4
0
 public void Add(CountryUser cuser)
 {
     lock (lockObject)
     {
         _countryQueue.Enqueue(cuser);
     }
 }
Beispiel #5
0
        /// <summary>
        /// 参战
        /// </summary>
        public bool JoinCombat()
        {
            AssignGoup();

            bool           result = true;
            CountryLvGroup lvGroup;

            if (TryLvGroup(out lvGroup) && lvGroup.UserList.ContainsKey(_countryUser.UserId))
            {
                CountryUser cuser = lvGroup.UserList[_countryUser.UserId];

                if (cuser != null && cuser.Status == 0)
                {
                    cuser.Status  = 1;
                    cuser.Refresh = DateTime.Now;
                    //lvGroup.Update(cuser);
                    lvGroup.CombaQueue.Add(cuser);
                    CombatHelper.EmbattlePostion(cuser.UserId);
                }
                else
                {
                    result = false;
                }
            }

            return(result);
        }
Beispiel #6
0
        /// <summary>
        /// 国家战
        /// </summary>
        /// <param name="cuser1">发起人</param>
        /// <param name="cuser2"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerTournament(CountryUser cuser1, CountryUser cuser2)
        {
            TrumpAbilityAttack.CombatTrumpLift(cuser1.UserId); //法宝每战斗M次就扣除N点寿命
            ICombatController controller   = new TjxCombatController();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.Country);

            plotCombater.SetAttack(new UserEmbattleQueue(cuser1.UserId, GetMagicId(cuser1.UserId), cuser1.InspirePercent, CombatType.Country));
            plotCombater.SetDefend(new UserEmbattleQueue(cuser2.UserId, GetMagicId(cuser2.UserId), cuser2.InspirePercent, CombatType.Country));
            return(plotCombater);
        }
Beispiel #7
0
        /// <summary>
        /// 获取玩家战斗信息
        /// </summary>
        /// <returns></returns>
        public CountryUser GetCountryUser()
        {
            CountryUser    countryUser = new CountryUser();
            CountryLvGroup lvGroup;

            if (TryLvGroup(out lvGroup) && lvGroup.UserList.ContainsKey(_countryUser.UserId))
            {
                countryUser = lvGroup.UserList[_countryUser.UserId];
            }
            return(countryUser);
        }
Beispiel #8
0
        private static bool TryLvGroup(CountryUser cuser, out CountryLvGroup lvGroup)
        {
            lvGroup = null;
            CountryGroup group;

            if (cuser != null && TryGroup(cuser.GroupType, out group))
            {
                lvGroup = cuser.IsAdvanced ? group.AdvancedGroup : group.NomarlGroup;
                return(true);
            }
            return(false);
        }
Beispiel #9
0
        private static TList <CountryUser> FilterCombatUsers(CountryLvGroup lvGroup)
        {
            var list       = new TList <CountryUser>();
            var removeList = new TList <CountryUser>();

            while (lvGroup.PairCombatQueue.Count > 0)
            {
                CountryUser cuser = lvGroup.PairCombatQueue.Get();
                if (cuser == null)
                {
                    continue;
                }

                GameUser gameUser = new GameDataCacheSet <GameUser>().FindKey(cuser.UserId);
                if (gameUser != null && gameUser.UserStatus == UserStatus.CountryCombat)
                {
                    cuser.Status = 2;
                    list.Add(cuser);
                }
            }
            while (lvGroup.CombaQueue.Count > 0)
            {
                CountryUser cuser = lvGroup.CombaQueue.Get();
                if (cuser == null)
                {
                    continue;
                }

                if (cuser.Status == 1 && cuser.Refresh.AddSeconds(CombatInterval) <= DateTime.Now)
                {
                    GameUser gameUser = new GameDataCacheSet <GameUser>().FindKey(cuser.UserId);
                    if (gameUser != null && gameUser.UserStatus == UserStatus.CountryCombat)
                    {
                        cuser.Status = 2;
                        list.Add(cuser);
                    }
                }
                else if (cuser.Status == 1)
                {
                    removeList.Add(cuser);
                }
            }
            foreach (var countryUser in removeList)
            {
                lvGroup.CombaQueue.Add(countryUser);
            }
            return(list);
        }
Beispiel #10
0
        /// <summary>
        /// 配对战斗
        /// </summary>
        private static void TriggerPairCombat(TList <CountryUser> mogemaUserList, TList <CountryUser> hashideUserList)
        {
            int combatCount = 0;
            TList <CountryUser> tempList = new TList <CountryUser>();

            if (mogemaUserList.Count > hashideUserList.Count)
            {
                combatCount = hashideUserList.Count;
                tempList    = mogemaUserList;
            }
            else
            {
                combatCount = mogemaUserList.Count;
                tempList    = hashideUserList;
            }

            //轮空的
            for (int i = combatCount; i < tempList.Count; i++)
            {
                CountryUser    cuser = tempList[i];
                CountryLvGroup tempGroup;
                if (TryLvGroup(cuser, out tempGroup))
                {
                    tempGroup.PairCombatQueue.Add(cuser);
                }
            }

            for (int i = 0; i < combatCount; i++)
            {
                CountryCombatProcess process = new CountryCombatProcess();

                CountryUser cuser1  = mogemaUserList[i];
                int         toIndex = i + 1;
                CountryUser cuser2  = toIndex < hashideUserList.Count ? hashideUserList[toIndex] : hashideUserList[0];
                if (cuser1 == null || cuser2 == null)
                {
                    continue;
                }
                if (cuser1.UserId.Equals(cuser2.UserId))
                {
                    continue;
                }

                //配对状态
                _log.SaveDebugLog(string.Format("领土战[{0}]配对[{1}]战斗", cuser1.UserName, cuser2.UserName));
                AsyncDoCombat(cuser1, cuser2, process);
            }
        }
Beispiel #11
0
        private static void SetUserPrize(CountryUser cuser, int obtainNum, int gameCoin)
        {
            cuser.ObtainNum += obtainNum;
            cuser.GameCoin  += gameCoin;
            GameUser user = new GameDataCacheSet <GameUser>().FindKey(cuser.UserId);

            if (user != null)
            {
                user.ObtainNum = MathUtils.Addition(user.ObtainNum, obtainNum, int.MaxValue);
                user.GameCoin  = MathUtils.Addition(user.GameCoin, gameCoin, int.MaxValue);
                //user.Update();
            }
            else
            {
                _log.SaveLog(new Exception("领土战" + cuser.UserId + "获得奖励异常"));
            }
        }
Beispiel #12
0
        /// <summary>
        /// 初始化
        /// </summary>
        internal static void Init(GameActive gameActive)
        {
            //Trace.WriteLine("领土战初化");
            _gameActive       = gameActive;
            isOver            = false;
            FistCountryUser   = new CountryUser();
            _countryGroupDict = new Dictionary <CountryType, CountryGroup>(2);
            var mogemaGroup  = new CountryGroup(CountryType.M);
            var hashideGroup = new CountryGroup(CountryType.H);

            _countryGroupDict.Add(mogemaGroup.CountryType, mogemaGroup);
            _countryGroupDict.Add(hashideGroup.CountryType, hashideGroup);
            CountryCombatProcess.RestVersion();
            _combatProcessList = new List <CountryCombatProcess>();

            _combatTimer = new Timer(DoCombat, gameActive, 60000, 17 * 1000);
            //_waitCombatTimer = new Timer(DoWaitCombat, gameActive, 60000, 1 * 1000);
        }
Beispiel #13
0
        /// <summary>
        /// 离开主界面
        /// </summary>
        public void Exit()
        {
            CountryLvGroup lvGroup;

            if (TryLvGroup(out lvGroup) && lvGroup.UserList.ContainsKey(_countryUser.UserId))
            {
                CountryUser cuser = lvGroup.UserList[_countryUser.UserId];
                cuser.CurrWinNum = 0;
                cuser.Status     = 0; //未参战状态

                GameUser gameUser = new GameDataCacheSet <GameUser>().FindKey(_countryUser.UserId);
                if (gameUser != null)
                {
                    gameUser.UserStatus = UserStatus.Normal;
                    //gameUser.Update();
                }
            }
        }
Beispiel #14
0
 public CountryCombat(GameUser user)
 {
     _countryUser = new CountryUser()
     {
         UserId         = user.UserID,
         UserName       = user.NickName,
         UserLv         = user.UserLv,
         UserVipLv      = (short)user.VipLv,
         UserExpNum     = user.ExpNum,
         Refresh        = DateTime.Now,
         InspirePercent = 0,
         Status         = 0,
         IsAdvanced     = user.UserLv >= AdvLv
     };
     if (user.GroupType != CountryType.None)
     {
         _countryUser.GroupType = user.GroupType;
     }
 }
Beispiel #15
0
        /// <summary>
        /// 获取国家的参战人员
        /// </summary>
        /// <param name="countryType"></param>
        /// <param name="lv">1:40级内,2:40级发上</param>
        /// <returns></returns>
        public List <CountryUser> GetCountryUser(CountryType countryType, short lv)
        {
            List <CountryUser> list = new List <CountryUser>();
            CountryGroup       countryGroup;

            if (TryGroup(countryType, out countryGroup))
            {
                List <CountryLvGroup> lvGroupList = new List <CountryLvGroup>();
                if (lv == 0)
                {
                    lvGroupList.Add(countryGroup.NomarlGroup);
                    lvGroupList.Add(countryGroup.AdvancedGroup);
                }
                if (lv == 2)
                {
                    lvGroupList.Add(countryGroup.AdvancedGroup);
                }
                else
                {
                    lvGroupList.Add(countryGroup.NomarlGroup);
                }
                foreach (var lvGroup in lvGroupList)
                {
                    KeyValuePair <string, CountryUser>[] cuserList;
                    lvGroup.UserList.CopyTo(out cuserList, 0);

                    foreach (KeyValuePair <string, CountryUser> keyPair in cuserList)
                    {
                        CountryUser cuser = keyPair.Value;
                        if (!list.Exists(m => m.UserId.Equals(cuser.UserId)))
                        {
                            list.Add(cuser);
                        }
                    }
                }
            }
            return(list);
        }
        private static void SendMessage(CountryLvGroup lvGroup)
        {
            List <KeyValuePair <string, CountryUser> > cuserList = lvGroup.UserList.ToList();

            var chatService = new TjxChatService();

            foreach (KeyValuePair <string, CountryUser> keyPair in cuserList)
            {
                CountryUser cuser    = keyPair.Value;
                GameUser    gameUser = new PersonalCacheStruct <GameUser>().FindKey(cuser.UserId);
                if (gameUser != null)
                {
                    gameUser.UserStatus = UserStatus.Normal;
                    gameUser.GroupType  = CountryType.None;
                    //领土战礼包
                    UserItemHelper.AddUserItem(gameUser.UserID, 5013, 1);
                    CombatHelper.EmbattlePostion(gameUser.UserID);
                }
                string content = string.Format(LanguageManager.GetLang().St5204_CombatTransfusion,
                                               cuser.WinCount, cuser.FailCount, cuser.GameCoin, cuser.ObtainNum);
                chatService.SystemSendWhisper(cuser.UserId, cuser.UserName, cuser.UserVipLv, content);
            }
        }
Beispiel #17
0
        //领土战赢杀人不留痕,败纸鸢线断,连胜1奖声10,金币7000,最高连胜杀人不留痕:1,失败方奖声1,金币500

        private static void ProcessPrize(CountryUser wincuser, CountryUser failcuser, CountryCombatProcess process)
        {
            string logStr = string.Format("领土战赢{0}[连{2}],败{1}[连{3}]", wincuser.UserName, failcuser.UserName, wincuser.CurrWinNum, failcuser.CurrWinNum);
            //胜方自动加入下次战斗
            int obtainNum = 0;
            int gameCoin  = 0;

            wincuser.WinCount   = wincuser.WinCount + 1;
            wincuser.CurrWinNum = wincuser.CurrWinNum + 1;
            //连胜奖励:声望=M*(X+1),金币=N+X*2000
            obtainNum = ObtainNum * wincuser.CurrWinNum;
            gameCoin  = PrizeGameCoin + (wincuser.CurrWinNum - 1) * 2000;
            logStr   += string.Format(",连胜{2}奖声{0},金币{1}", obtainNum, gameCoin, wincuser.CurrWinNum);

            if (failcuser.CurrWinNum > 0)
            {
                //击杀连胜额外:声望=M*X,金币=N+X*1000
                obtainNum += ObtainNum * failcuser.CurrWinNum;
                gameCoin  += PrizeGameCoin + failcuser.CurrWinNum * 1000;
                logStr    += string.Format(",击杀连胜后声{0},金币{1}", obtainNum, gameCoin);
                //Contribution(wincuser.UserId, obtainNum); //公会贡献
            }
            if (FistCountryUser != null && wincuser.UserId.Equals(FistCountryUser.UserId))
            {
                //最高连胜额外:N+X(最高连胜次数)*2000
                gameCoin += PrizeGameCoin + (wincuser.CurrWinNum - 1) * 2000;
                logStr   += string.Format(",最高连胜后金币{0}", gameCoin);
            }
            if (wincuser.CurrWinNum > wincuser.MaxWinNum)
            {
                wincuser.MaxWinNum = wincuser.CurrWinNum;
            }
            //最高连胜
            if (FistCountryUser != null && wincuser.CurrWinNum > FistCountryUser.CurrWinNum)
            {
                lock (thisLock)
                {
                    FistCountryUser            = new CountryUser();
                    FistCountryUser.CurrWinNum = wincuser.CurrWinNum;
                    FistCountryUser.MaxWinNum  = wincuser.MaxWinNum;
                    FistCountryUser.WinCount   = wincuser.WinCount;
                    FistCountryUser.UserId     = wincuser.UserId;
                    FistCountryUser.UserName   = wincuser.UserName;
                    FistCountryUser.UserVipLv  = wincuser.UserVipLv;
                }

                logStr += string.Format(",最高连胜{0}:{1}", FistCountryUser.UserName, FistCountryUser.CurrWinNum);
                //Trace.WriteLine(string.Format("领土战最高连胜{0}:{1}", FistCountryUser.UserName, FistCountryUser.CurrWinNum));
            }
            SetUserPrize(wincuser, obtainNum, gameCoin);
            wincuser.Status      = 1;
            process.WinUserId    = wincuser.UserId;
            process.WinUserName  = wincuser.UserName;
            process.KillNum      = wincuser.CurrWinNum;
            process.WinObtainNum = obtainNum;
            process.WinGameCoin  = gameCoin;
            process.FaildKillNum = failcuser.CurrWinNum;//打败几连杀
            //获胜方公会贡献
            Contribution(wincuser.UserId, obtainNum);

            obtainNum = (int)Math.Floor((double)ObtainNum / 5);
            gameCoin  = (int)Math.Floor((double)PrizeGameCoin / 10);

            logStr              += string.Format(",失败方[{2}连杀]奖声{0},金币{1}", obtainNum, gameCoin, process.FaildKillNum);
            failcuser.Status     = 0;
            failcuser.CurrWinNum = 0;
            failcuser.FailCount  = failcuser.FailCount + 1;
            SetUserPrize(failcuser, obtainNum, gameCoin);

            process.FailUserId    = failcuser.UserId;
            process.FailUserName  = failcuser.UserName;
            process.FailObtainNum = obtainNum;
            process.FailGameCoin  = gameCoin;
            //战败方公会贡献
            Contribution(failcuser.UserId, obtainNum);
            _log.SaveDebugLog(logStr);
            CombatHelper.EmbattlePostion(failcuser.UserId);
        }
Beispiel #18
0
        private static void AsyncDoCombat(CountryUser cuser1, CountryUser cuser2, CountryCombatProcess process)
        {
            CountryLvGroup userLvGroup1;
            CountryLvGroup userLvGroup2;

            if (TryLvGroup(cuser1, out userLvGroup1) && TryLvGroup(cuser2, out userLvGroup2))
            {
                ISingleCombat combater = CombatFactory.TriggerTournament(cuser1, cuser2);
                bool          isWin    = combater.Doing();
                if (isWin)
                {
                    ProcessPrize(cuser1, cuser2, process);
                    cuser1.Refresh = DateTime.Now;
                    cuser1.Status  = 1;
                    userLvGroup1.CombaQueue.Add(cuser1);
                    CountryGroup userGroup1;
                    if (TryGroup(cuser1.GroupType, out userGroup1))
                    {
                        userGroup1.Score++;
                    }
                    cuser2.Refresh = DateTime.Now;
                    cuser2.Status  = 1;
                    userLvGroup2.CombaQueue.Add(cuser2);
                }
                else
                {
                    ProcessPrize(cuser2, cuser1, process);
                    cuser2.Refresh = DateTime.Now;
                    cuser2.Status  = 1;
                    userLvGroup2.CombaQueue.Add(cuser2);
                    CountryGroup userGroup2;
                    if (TryGroup(cuser2.GroupType, out userGroup2))
                    {
                        userGroup2.Score++;
                    }
                    cuser1.Refresh = DateTime.Now;
                    cuser1.Status  = 1;
                    userLvGroup1.CombaQueue.Add(cuser1);
                }

                process.ProcessContainer = (CombatProcessContainer)combater.GetProcessResult();

                lock (thisLock)
                {
                    if (_combatProcessList != null)
                    {
                        _combatProcessList.Add(process);
                    }
                    //日志
                    UserCombatLog log = new UserCombatLog();
                    log.CombatLogID   = Guid.NewGuid().ToString();
                    log.UserID        = cuser1.UserId;
                    log.CityID        = 0;
                    log.PlotID        = 0;
                    log.NpcID         = 0;
                    log.CombatType    = CombatType.Country;
                    log.HostileUser   = cuser2.UserId;
                    log.IsWin         = isWin;
                    log.CombatProcess = JsonUtils.Serialize(process);
                    log.CreateDate    = DateTime.Now;
                    var sender = DataSyncManager.GetDataSender();
                    sender.Send(log);
                }
            }
        }