/// <summary> /// 体力恢复 /// </summary> /// <param name="arenaManagerInfo"></param> /// <param name="isUpdate"></param> /// <returns></returns> public ArenaStamina RestoreStamina(ArenaManagerinfoEntity arenaManagerInfo, bool isUpdate = false) { ArenaStamina response = new ArenaStamina(); DateTime dateTime = DateTime.Now; try { int staminaStartStopHour = 1; int staminaEndStopHour = 8; //用于比较的恢复时间截止点 DateTime restoreTime = dateTime; int hour = dateTime.Hour; response.IsRestoreStamina = true; //恢复时间截止1点 if (hour >= staminaStartStopHour && hour < staminaEndStopHour) { restoreTime = dateTime.Date.AddHours(staminaStartStopHour); response.IsRestoreStamina = false; } if (arenaManagerInfo == null) { response.Stamina = CacheFactory.ArenaCache.ArenaMaxStamina; response.MaxStamina = CacheFactory.ArenaCache.ArenaMaxStamina; return(response); } var vipLevel = 0; var manager = ManagerCore.Instance.GetManager(arenaManagerInfo.ManagerId, arenaManagerInfo.SiteId); if (manager != null) { vipLevel = manager.VipLevel; } //获取多少秒恢复1点体力 var restoreTimes = CacheFactory.ArenaCache.StaminaRestoreTime(vipLevel); var presentStamina = arenaManagerInfo.Stamina; response.Stamina = presentStamina; response.MaxStamina = arenaManagerInfo.MaxStamina; response.Stamina = arenaManagerInfo.Stamina; response.RestoreTimes = restoreTimes; if (arenaManagerInfo.Stamina >= arenaManagerInfo.MaxStamina) { return(response); } //每天8点恢复所有体力 if (hour >= staminaEndStopHour && arenaManagerInfo.StaminaRestoreTime < DateTime.Now.Date.AddHours(staminaEndStopHour)) { arenaManagerInfo.StaminaRestoreTime = DateTime.Now.AddDays(-1); } //上次恢复体力距离现在时间 var lastTime = (int)restoreTime.Subtract(arenaManagerInfo.StaminaRestoreTime).TotalSeconds; if (lastTime <= 0) { return(response); } //恢复多少体力 var stamina = lastTime / restoreTimes; if (stamina <= 0) { response.NextRestoreStaminaTick = ShareUtil.GetTimeTick(arenaManagerInfo.StaminaRestoreTime.AddSeconds(restoreTimes)); return(response); } arenaManagerInfo.Stamina += stamina; if (arenaManagerInfo.Stamina > arenaManagerInfo.MaxStamina) { arenaManagerInfo.Stamina = arenaManagerInfo.MaxStamina; } presentStamina = arenaManagerInfo.Stamina; arenaManagerInfo.StaminaRestoreTime = dateTime; if (arenaManagerInfo.Stamina < arenaManagerInfo.MaxStamina) { //恢复体力后多出来的秒数 var surplusTime = lastTime % restoreTimes; arenaManagerInfo.StaminaRestoreTime = dateTime.AddSeconds(-surplusTime); //下次恢复时间 response.NextRestoreStaminaTick = ShareUtil.GetTimeTick(arenaManagerInfo.StaminaRestoreTime.AddSeconds(restoreTimes)); } else { response.NextRestoreStaminaTick = 0; } response.Stamina = presentStamina; response.MaxStamina = arenaManagerInfo.MaxStamina; response.Stamina = arenaManagerInfo.Stamina; response.RestoreTimes = restoreTimes; if (isUpdate) { ArenaManagerinfoMgr.Update(arenaManagerInfo); } } catch (Exception ex) { SystemlogMgr.Error("体力恢复", ex); } return(response); }
/// <summary> /// 获取对手 /// </summary> /// <param name="managerId"></param> /// <returns></returns> public ArenaGetOpponentResponse GetOpponent(Guid managerId) { var response = new ArenaGetOpponentResponse(); response.Data = new ArenaOpponent(); try { if (!IsStart) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.SeasonNotStart)); } var info = GetArenaInfo(managerId); if (info == null) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } switch (this.ArenaType) { case 1: if (!info.Teammember1Status) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } break; case 2: if (!info.Teammember2Status) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } break; case 3: if (!info.Teammember3Status) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } break; case 4: if (!info.Teammember4Status) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } break; case 5: if (!info.Teammember5Status) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.TeammemberNotNumber)); } break; } info.OpponentList = AnalyseOpponent(info.Opponent); if (info.OpponentList == null || info.OpponentList.OpponentList.Count == 0) { var opponentList = RefreshOpponent(managerId, info.DanGrading, null); if (opponentList == null) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.NbParameterError)); } info.OpponentList = opponentList; info.Opponent = GenerateString(opponentList); if (info.Opponent == null) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.NbParameterError)); } response.Data.StaminaEntity = RestoreStamina(info); if (!ArenaManagerinfoMgr.Update(info)) { return(ResponseHelper.Create <ArenaGetOpponentResponse>(MessageCode.NbUpdateFail)); } } response.Data = info.OpponentList; } catch (Exception ex) { SystemlogMgr.Error("竞技场获取对手", ex); response.Code = (int)MessageCode.NbParameterError; } return(response); }
/// <summary> /// 购买通行证参数 /// </summary> /// <param name="managerId"></param> /// <returns></returns> public ArenaBuyStaminaResponse BuyStamina(Guid managerId) { var response = new ArenaBuyStaminaResponse(); response.Data = new ArenaBuyStamina(); try { //恢复体力 var info = GetArenaInfo(managerId); if (info == null) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbParameterError)); } RestoreStamina(info); if (info.Stamina >= CacheFactory.ArenaCache.ArenaMaxStamina) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.StaminaHaveMax)); } var user = PayCore.Instance.GetPayUser(managerId, info.SiteId); if (user == null) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbParameterError)); } //获取消耗多少点卷 var consumPoint = CacheFactory.ArenaCache.GetBuyStaminaPoint(info.BuyStaminaNumber + 1); if (consumPoint == -1) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbParameterError)); } if (user.Point + user.Bonus < consumPoint) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbPointShortage)); } info.BuyStaminaNumber++; info.Stamina++; if (info.Stamina >= info.MaxStamina) { info.StaminaRestoreTime = DateTime.Now.Date.AddDays(1); } if (!ArenaManagerinfoMgr.Update(info)) { return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbUpdateFail)); } //扣除点卷 var messCode = PayCore.Instance.ConsumePointForGamble(user.Account, managerId, (int)EnumConsumeSourceType.ArenaGamble, ShareUtil.GenerateComb().ToString(), consumPoint, info.SiteId); if (messCode != MessageCode.Success) { //扣除点卷失败 还原体力 info.BuyStaminaNumber--; info.Stamina--; ArenaManagerinfoMgr.Update(info); return(ResponseHelper.Create <ArenaBuyStaminaResponse>(MessageCode.NbUpdateFail)); } response.Data.Point = (user.Point + user.Bonus) - consumPoint; response.Data.StaminaEntity = RestoreStamina(info, true); } catch (Exception ex) { SystemlogMgr.Error("竞技场补充体力", ex); response.Code = (int)MessageCode.NbParameterError; } return(response); }
/// <summary> /// 打比赛 /// </summary> /// <param name="managerId"></param> /// <param name="opponentId"></param> /// <returns></returns> public ArenaFightResponse Fight(Guid managerId, Guid opponentId) { ArenaFightResponse response = new ArenaFightResponse(); response.Data = new ArenaFight(); try { //还未开始 if (!IsStart) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.SeasonNotStart)); } if (IsEnd) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.SeasonNotStart)); } DateTime date = DateTime.Now; var info = GetArenaInfo(managerId); //阵型未组建完成 if (info == null) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.TeammemberNotNumber)); } RestoreStamina(info); //体力不足 if (info.Stamina <= 0) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.StaminaInsufficient)); } var arenaInfo = new ArenaTeammemberFrame(managerId, (EnumArenaType)this.ArenaType, info.SiteId); //阵型人数<7 if (arenaInfo.TeammebmerDic.Count < 7) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.TeammemberNotNumber)); } info.OpponentList = AnalyseOpponent(info.Opponent); //对手列表里找对手 var opponent = info.OpponentList.OpponentList.Find(r => r.OpponentManagerId == opponentId); if (opponent == null) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.NbParameterError)); } if (!opponent.IsNpc) { //对手信息 var opponentInfo = new ArenaTeammemberFrame(opponentId, (EnumArenaType)this.ArenaType, opponent.OpponentZoneName); //对手信息不完整 刷新 if (info.OpponentList == null || info.OpponentList.OpponentList.Count == 0 || opponentInfo.TeammebmerDic.Count < 7) { List <Guid> matcOpponet = null; if (info.OpponentList != null) { matcOpponet = info.OpponentList.MatchOpponent; } var opponentList = RefreshOpponent(managerId, info.DanGrading, matcOpponet); info.OpponentList = opponentList; info.Opponent = GenerateString(info.OpponentList); ArenaManagerinfoMgr.Update(info); return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.NbParameterError)); } } var matchHome = new MatchManagerInfo(managerId, info.SiteId, info.ArenaType); MatchManagerInfo matchAway = null; if (!opponent.IsNpc) { matchAway = new MatchManagerInfo(opponent.OpponentManagerId, opponent.OpponentZoneName, info.ArenaType); } else { matchAway = new MatchManagerInfo(opponent.OpponentManagerId, true, info.ArenaType); } var matchId = ShareUtil.GenerateComb(); var matchData = new BaseMatchData((int)EnumMatchType.Arena, matchId, matchHome, matchAway); matchData.ErrorCode = (int)MessageCode.MatchWait; MemcachedFactory.MatchClient.Set(matchData.MatchId, matchData); MatchCore.CreateMatch(matchData); if (matchData.ErrorCode != (int)MessageCode.Success) { return(ResponseHelper.Create <ArenaFightResponse>(matchData.ErrorCode)); } //打比赛 自己为主队 int homeGoals = matchData.Home.Score; int awayGoals = matchData.Away.Score; if (info.Stamina == info.MaxStamina) { info.StaminaRestoreTime = date; } info.Stamina--; if (info.OpponentList.MatchOpponent == null) { info.OpponentList.MatchOpponent = new List <Guid>(); } info.OpponentList.MatchOpponent.Add(opponentId); //打完比赛重新刷新对手 info.OpponentList = RefreshOpponent(managerId, info.DanGrading, info.OpponentList.MatchOpponent); info.Opponent = GenerateString(info.OpponentList); if (homeGoals > awayGoals) //胜利了获得对手的积分 { info.Integral += opponent.GetIntegral; response.Data.Integral = opponent.GetIntegral; info.UpdateTime = DateTime.Now; } //计算段位 CalculateDanGrading(ref info); info.Status = 1; response.Data.StaminEntity = RestoreStamina(info, false); if (!ArenaManagerinfoMgr.Update(info)) { return(ResponseHelper.Create <ArenaFightResponse>(MessageCode.NbUpdateFail)); } response.Data.OpponentList = info.OpponentList.OpponentList; response.Data.MyIntegral = info.Integral; response.Data.DanGrading = info.DanGrading; //更新排名 SetRank(managerId, info.Integral); response.Data.MyRank = GetRank(managerId); response.Data.MatchId = matchId; if (info.DanGrading == 1) { response.Data.IsMaxDanGrading = true; } else { var dangradingConfig = CacheFactory.ArenaCache.GetDangrading(info.DanGrading); if (dangradingConfig != null) { response.Data.UpIntegral = dangradingConfig.Integral - info.Integral; } } MemcachedFactory.ArenaMatchClient.Set <BaseMatchData>(matchId, matchData); } catch (Exception ex) { SystemlogMgr.Error("打比赛", ex); response.Code = (int)MessageCode.NbParameterError; } return(response); }