/// <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); }
/// <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); }
internal void Update(CountryUser cuser) { if (UserList.ContainsKey(cuser.UserId)) { UserList[cuser.UserId] = cuser; } }
public void Add(CountryUser cuser) { lock (lockObject) { _countryQueue.Enqueue(cuser); } }
/// <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); }
/// <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); }
/// <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); }
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); }
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); }
/// <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); } }
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 + "获得奖励异常")); } }
/// <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); }
/// <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(); } } }
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; } }
/// <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); } }
//领土战赢杀人不留痕,败纸鸢线断,连胜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); }
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); } } }