using Org.BouncyCastle.Bcpg; using ProtoCSStruct; using Sog; using System; using System.Collections.Generic; using System.Net.Sockets; namespace Game { public class CBattleSvc { public static void OnBurn(PlayerOnGame player) { long now = GameServerUtils.GetTimeMs(); player.RoleData.Cbdata.LastFreshTickTime = now; player.RoleData.Cbdata.LastLayer = 0; player.RoleData.Cbdata.MaxLayer = 0; UnifyOp op = new UnifyOp(player, BillChangeItemReason.CBC); op.AddItem(CommParamDescMgr.Instance.ContBttlCost.str_list[0], CommParamDescMgr.Instance.ContBttlRecover.int_val); op.DoOp(); } public static void OnNewDay(PlayerOnGame player, bool notify) { long now = GameServerUtils.GetTimeMs(); if (!AppTime.IsSameDay(now/1000, player.RoleData.Cbdata.LastFreshTickTime/1000)) { UnifyOp op = new UnifyOp(player, BillChangeItemReason.CBC); int c = (int)op.GetItemCount(CommParamDescMgr.Instance.ContBttlCost.str_list[0]); if (c < CommParamDescMgr.Instance.ContBttlReLimit.int_val) { int add = Math.Min(CommParamDescMgr.Instance.ContBttlReLimit.int_val - c, CommParamDescMgr.Instance.ContBttlRecover.int_val); op.AddItem(CommParamDescMgr.Instance.ContBttlCost.str_list[0], add); op.DoOp(true, notify); } player.RoleData.Cbdata.LastFreshTickTime = now; } if (!AppTime.IsSameWeek127(now/1000, player.RoleData.Cbdata.LastWeekScoreRst / 1000)) { player.RoleData.Cbdata.WeekScore = 0; player.RoleData.Cbdata.LastWeekScoreRst = now; } } private static ContinueBattleDesc GetContinueBattleDescByMaxLayer(int maxLayer) { if(maxLayer < 1) maxLayer = 1; foreach (var item in ContinueBattleDescMgr.Instance.ItemTable) { if (maxLayer == item.Value.historyStage) { return item.Value; } } return null; } public static void OnBattleStart(PlayerOnGame player, StructPacket packet) { player.msgCache.clear(); UnifyOp op = new UnifyOp(player, BillChangeItemReason.CBC); var c = op.GetItemCount(CommParamDescMgr.Instance.ContBttlCost.str_list[0]); if (c < int.Parse(CommParamDescMgr.Instance.ContBttlCost.str_list[1])) { CSCBStartRes res = new CSCBStartRes(); res.Ret = CSErrCode.NotEnoughItem; player.SendToClient((int)CSGameMsgID.CbStartRes, ref res); return; } ref var req = ref packet.GetMessage(); var battleId = CommParamDescMgr.Instance.ContBttlId.int_val; var battleDesc = ChapterBattleDescMgr.Instance.GetConfig(battleId); if (battleDesc == null) { return; } if (player.RoleData.IsInBattle) { player.RoleData.BattleRecord.Clear(); player.RoleData.IsInBattle = false; } player.RoleData.Cbdata.NowStartTime = GameServerUtils.GetTimeMs(); player.RoleData.Cbdata.NowScore = 0; player.RoleData.Cbdata.NowReward.Clear(); player.RoleData.Cbdata.RednamestageId = 0; player.RoleData.Cbdata.NowBoosC = 0; player.RoleData.Cbdata.NowRedC = 0; player.RoleData.Cbdata.NowRedCTotal = 0; int stageId = battleDesc.firstChapterBattleStageId; int initLayer = 1; if (player.RoleData.Cbdata.MaxLayer > 1) { var d = GetContinueBattleDescByMaxLayer(player.RoleData.Cbdata.MaxLayer); if (d != null) { stageId = stageId + d.firstStage - 1; initLayer = d.firstStage; //给与1-initlayer的奖励 for (int i = 1; i < initLayer; i++) { player.RoleData.Cbdata.NowScore += 100; player.RoleData.Cbdata.NowBoosC++; var desc = ChapterBattleStageDescMgr.Instance.GetConfig(battleDesc.firstChapterBattleStageId + i - 1); if (desc != null) { var msn = desc.monster[0].List[0]; var mdesc = MonsterPropDescMgr.Instance.GetConfig(msn); if (mdesc != null) { var list = ChapterHelper.ConvRewardInternal(player, mdesc.dropConfig, false, false); foreach (var reward in list) { if (reward.Type == (int)GoodsType.ContBattle) {//红名场景 continue; } bool exist = false; for (int j = 0; j < player.RoleData.Cbdata.NowReward.Count; j++) { ref var rw = ref player.RoleData.Cbdata.NowReward[j]; if (rw.Type == reward.Type && rw.Id == reward.Id) { rw.Value += reward.Value; exist = true; break; } } if (!exist) { player.RoleData.Cbdata.NowReward.Add(reward); } } } } } } else { return; } } player.RoleData.Cbdata.BeginLayer = initLayer; player.RoleData.Cbdata.NowLayer = initLayer; player.RoleData.Cbdata.NowStageId = stageId; ref var record = ref player.RoleData.BattleRecord; record.Clear(); var now = GameServerUtils.GetTimeSecond(); record.BattleBeginTime = now; record.BeginTime = now; record.BattleData.BattleId = battleId; record.BattleData.BattleStatus = BattleStatus.NONE; ChapterSvc.InitBuildMonsterInfo(player, battleId, stageId); player.RoleData.IsInBattle = true; player.MakeDirty(); var cbres = new CSCBStartRes(); cbres.BattleData.CopyFrom(ref record.BattleData); cbres.Ret = (int)CSErrCode.None; cbres.InitBattleId = stageId; cbres.InitLayer = initLayer; cbres.Data.CopyFrom(ref player.RoleData.Cbdata); player.SendToClient((int)CSGameMsgID.CbStartRes, ref cbres); } public static void OnFinishLayer(PlayerOnGame player, StructPacket packet) { if(player.msgCache.CheckRepeateMsg(player, packet)) return; ref var req = ref packet.GetMessage(); if (req.HpReamin > 100) return; CSCBFinishLayerRes cbres = new CSCBFinishLayerRes(); cbres.HpReamin = req.HpReamin; cbres.Layer = req.Layer; cbres.MsgSeq = req.MsgSeq; var battleDesc = ChapterBattleDescMgr.Instance.GetConfig(CommParamDescMgr.Instance.ContBttlId.int_val); var now = GameServerUtils.GetTimeSecond(); var df = now - player.RoleData.BattleRecord.BattleBeginTime; if (player.RoleData.Cbdata.NowStartTime == 0) { cbres.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbFinishRes, ref cbres); TraceLog.Error("cbattle finishlayer not start uid={0}", player.UserID); return; } bool enterNext = false; if (req.HpReamin == 0) { if (player.RoleData.Cbdata.NowLayer != req.Layer) { cbres.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbFinishRes, ref cbres); return; } player.RoleData.Cbdata.NowLayer++; player.RoleData.Cbdata.NowScore += 100; enterNext = true; if (player.RoleData.Cbdata.RednamestageId > 0) { player.RoleData.Cbdata.NowRedC++; } else { player.RoleData.Cbdata.NowBoosC++; } player.RoleData.Cbdata.RednamestageId = 0; } else { player.RoleData.Cbdata.NowScore += (100 - req.HpReamin ); if (player.RoleData.Cbdata.RednamestageId > 0 && req.ForceLeave == 0) { player.RoleData.Cbdata.RednamestageId = 0; //按照百分比折扣指定掉落,其余的清空 RepeatedTypeIDValue32_128 rev = new RepeatedTypeIDValue32_128(); for (int i = 0; i < player.RoleData.Cbdata.NowReward.Count; i++) { ref var reward = ref player.RoleData.Cbdata.NowReward[i]; for(int j = 0; j < CommParamDescMgr.Instance.KeepRewardType.int_list.Length; j++) { if (reward.Type == CommParamDescMgr.Instance.KeepRewardType.int_list[j] && reward.Id == GetConfInterId((GoodsType)CommParamDescMgr.Instance.KeepRewardType.int_list[j], CommParamDescMgr.Instance.KeepRewardId.str_list[j])) { int v = (int)( reward.Value * CommParamDescMgr.Instance.KeepRewardRatio.int_list[j] * 1.0 / 1_0000 ); rev.Add(new TypeIDValue32() { Type = reward.Type, Id = reward.Id, Value = v }); break; } } } player.RoleData.Cbdata.NowReward.Clear(); player.RoleData.Cbdata.NowReward.CopyFrom(ref rev); player.RoleData.Cbdata.NowLayer++; player.RoleData.Cbdata.NowBoosC = 0; player.RoleData.Cbdata.NowRedC = 0; enterNext = true; } } if (enterNext) { int nextStage = 0; for (int i = 0; i < player.RoleData.BattleRecord.DropReward.Count; i++) { ref var reward = ref player.RoleData.BattleRecord.DropReward[i]; if (reward.Type == (int)GoodsType.ContBattle) {//红名场景,直接进入下一关 nextStage = reward.Id; continue; } bool exist = false; for (int j = 0; j < player.RoleData.Cbdata.NowReward.Count; j++) { ref var rw = ref player.RoleData.Cbdata.NowReward[j]; if (rw.Type == reward.Type && rw.Id == reward.Id) { rw.Value += reward.Value; exist = true; break; } } if (!exist) { player.RoleData.Cbdata.NowReward.Add(ref reward); } cbres.ThisReward.Add(ref reward); } var nextConf = ContinueBattleDescMgr.Instance.GetConfig(player.RoleData.Cbdata.NowLayer ); if(nextConf == null) { //直接结算 cbres.Ret = (int)CSErrCode.None; cbres.Score = player.RoleData.Cbdata.NowScore; cbres.Data.CopyFrom(ref player.RoleData.Cbdata); player.SendToClient((int)CSGameMsgID.CbFinishRes, ref cbres); //var leveReq = new CSCBLeaveReq(); //leveReq.Layer = player.RoleData.Cbdata.NowLayer; //OnLeave(player, ref leveReq); return; } int initBattleId = battleDesc.firstChapterBattleStageId; var nextStageId = initBattleId + player.RoleData.Cbdata.NowLayer - 1; if (nextStage > 0) { nextStageId = nextStage; cbres.RednamestageId = nextStage; player.RoleData.Cbdata.RednamestageId = nextStage; player.RoleData.Cbdata.NowStageId = nextStageId; player.RoleData.Cbdata.NowRedCTotal++; //随机玩家id var d = GetContinueBattleDescByMaxLayer(player.RoleData.Cbdata.MaxLayer); var rankreq = new CSRankPlayerByLevelReq(); rankreq.Uid = player.UserID; rankreq.RealmId = player.RealmID; rankreq.LvMin = player.RoleBase.Level + d.invasionLevel[0]; rankreq.LvMax = player.RoleBase.Level + d.invasionLevel[1]; GameServerUtils.GetPacketSender().SendToRankServer((int)CSGameMsgID.RankPlayerBylevelReq, ref rankreq, player.UserID); } else { player.RoleData.Cbdata.NowStageId = nextStageId; player.RoleData.Cbdata.RednamestageId = 0; } ref var record = ref player.RoleData.BattleRecord; var otime = record.BattleTimeDuration; record.Clear(); record.BattleTimeDuration = otime; record.BattleBeginTime = now; record.BattleData.BattleId = CommParamDescMgr.Instance.ContBttlId.int_val; record.BattleData.BattleStatus = BattleStatus.NONE; ChapterSvc.InitBuildMonsterInfo(player, CommParamDescMgr.Instance.ContBttlId.int_val, nextStageId); player.RoleData.IsInBattle = true; player.MakeDirty(); cbres.BattleData.CopyFrom(ref record.BattleData); TraceLog.Trace("cbattle uid={0}, layer={1}, timeused={2}, score={3}", player.UserID, req.Layer, df, player.RoleData.Cbdata.NowScore); } cbres.Ret = (int)CSErrCode.None; cbres.Score = player.RoleData.Cbdata.NowScore; cbres.Data.CopyFrom(ref player.RoleData.Cbdata); player.SendToClient((int)CSGameMsgID.CbFinishRes, ref cbres); MsgCache cache = new MsgCache(); //cache.Parser = CSCBFinishLayerRes.Parser; //cache.GetMessage().CopyFrom(ref cbres); cache.SetData(ref cbres); player.msgCache.AddSendMsg(player, packet, cache); } public static int GetConfInterId(GoodsType type, string code) { int internalId = 0; switch (type) { case GoodsType.Equipment: { var desc = EquipDescMgr.Instance.GetConfig(code); internalId = desc?.InternalId ?? 0; } break; case GoodsType.Items: { var desc = ItemDescMgr.Instance.GetConfig(code); internalId = desc?.InternalId ?? 0; } break; case GoodsType.EquipSkin: { var desc = RoleModelDescMgr.Instance.GetConfig(int.Parse(code)); internalId = desc?.InternalId ?? 0; } break; case GoodsType.ContBattle: break; } return internalId; } public static void OnLeave(PlayerOnGame player, StructPacket packet) { if (player.msgCache.CheckRepeateMsg(player, packet)) return; ref var req = ref packet.GetMessage(); OnLeave(player, ref req, packet); } public static void OnLeave(PlayerOnGame player, ref CSCBLeaveReq req, StructPacket packetReq = null) { var res = new CSCBLeaveRes(); res.MsgSeq = req.MsgSeq; //if(req.Layer != player.RoleData.Cbdata.NowLayer) //{ // res.Ret = CSErrCode.Fail; // player.SendToClient((int)CSGameMsgID.CbLeaveRes, ref res); // return; //} req.Layer = player.RoleData.Cbdata.NowLayer; var df0 = player.RoleData.BattleRecord.BattleTimeDuration; if(player.RoleData.Cbdata.NowStartTime == 0) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbLeaveRes, ref res); TraceLog.Error("cbattle not start uid={0}", player.UserID); return; } var df = GameServerUtils.GetTimeMs() - player.RoleData.Cbdata.NowStartTime; var battleDesc = ChapterBattleDescMgr.Instance.GetConfig(CommParamDescMgr.Instance.ContBttlId.int_val); if(df0 > battleDesc.chapterBattleLimitedTime + 10) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbLeaveRes, ref res); return; } res.Ret = (int)CSErrCode.None; UnifyOp op = new UnifyOp(player, BillChangeItemReason.CBC); var r = op.CostItem(CommParamDescMgr.Instance.ContBttlCost.str_list[0], int.Parse(CommParamDescMgr.Instance.ContBttlCost.str_list[1])); if (r != CSErrCode.None) { res.Ret = r; player.SendToClient((int)CSGameMsgID.CbLeaveRes, ref res); return; } for (int i = 0; i < player.RoleData.Cbdata.NowReward.Count; i++) { ref var reward = ref player.RoleData.Cbdata.NowReward[i]; op.AddGoods(reward.Type, reward.Id, reward.Value); } if (req.Layer - 1 >= player.RoleData.Cbdata.MaxLayer) { player.RoleData.Cbdata.MaxLayer = req.Layer - 1; } player.RoleData.Cbdata.LastLayer = req.Layer - 1; player.RoleData.Cbdata.WeekScore += player.RoleData.Cbdata.NowScore; List list = new List(); op.DoOp(true, true, false, list); for (int i = 0; i < list.Count; i++) { res.Items.Add(list[i]); } res.Data.CopyFrom(ref player.RoleData.Cbdata); player.SendToClient((int)CSGameMsgID.CbLeaveRes, ref res); GameTALogUtils.LogContinueBattle(player, player.RoleData.Cbdata.BeginLayer, player.RoleData.Cbdata.NowLayer, 1, (int)df/1000, player.RoleData.Cbdata.NowScore, player.RoleData.Cbdata.NowRedCTotal, player.RoleData.Cbdata.NowRedC, ref player.RoleData.Cbdata.NowReward, ref player.RoleData.BattleRecord.PropVal); player.RoleData.Cbdata.NowLayer = 0; player.RoleData.Cbdata.NowStartTime = 0; player.RoleData.Cbdata.NowReward.Clear(); player.RoleData.Cbdata.NowScore = 0; player.RoleData.BattleRecord.Clear(); player.RoleData.IsInBattle = false; //今日排行 RankSvc.UpdateRankScore(player, 2, req.Layer - 1); //周积分 RankSvc.UpdateRankScore(player, 3, player.RoleData.Cbdata.WeekScore); TraceLog.Trace("{0} leave cbattle layer={1} score={2} usedtime = {3}", player.UserID, req.Layer, player.RoleData.Cbdata.NowScore, df); TaskEXEvent.TriggerContBttlTimesN(player); if(req.MsgSeq >= 0 && packetReq != null) { MsgCache cache = new MsgCache(); //cache.Parser = CSCBLeaveRes.Parser; //cache.GetMessage().CopyFrom(ref res); cache.SetData(ref res); player.msgCache.AddSendMsg(player, packetReq, cache); } } public static void OnGetLayerAward(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); CSCBGetLayerRewardRes res = new CSCBGetLayerRewardRes(); res.Layer = req.Layer; //if (req.Layer > player.RoleData.Cbdata.MaxLayer) //{ // res.Ret = CSErrCode.Fail; // player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); // return; //} //var desc = GetContinueBattleDescByMaxLayer(req.Layer); var desc = ContinueBattleDescMgr.Instance.GetConfig(req.Layer); if (desc == null) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); return; } if(desc.historyStage > player.RoleData.Cbdata.MaxLayer) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); return; } if(desc.levelReward == null || desc.levelReward == "") { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); return; } for (int i = 0; i < player.RoleData.Cbdata.GetLayerReward.Count; i++) { if (player.RoleData.Cbdata.GetLayerReward[i] == desc.id) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); return; } } player.RoleData.Cbdata.GetLayerReward.Add(desc.id); var list = RewardSvc.Reward(player, desc.levelReward, false, false); RewardSvc.ApplyGiveReward(player, list, true, BillChangeItemReason.CBC); res.Ret = CSErrCode.None; res.Data.CopyFrom(ref player.RoleData.Cbdata); player.SendToClient((int)CSGameMsgID.CbGetlayerrewardRes, ref res); } public static void RankPlayerBylevelRes( StructPacket packet) { ref var res = ref packet.GetMessage(); long uid = res.Uid; if (res.Uids.Count == 0) { } else { uid = res.Uids[0]; } PlayerOnGame target = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (target == null) { var req = new CSPlayerQueryOtherRoleInfoReq(); req.TargetUid = uid; req.QueryRoleType = QueryRoleType.CBC; GameServerUtils.GetPacketSender().SendToWorldServer((int)CSGameMsgID.PlayerQueryOtherRoleInfoReq, ref req, res.Uid); } else { CSCBCPlayerQuerySync queryRes = new CSCBCPlayerQuerySync(); HeroPropUtils.FillHeroInfo(ref queryRes.Info.HeroInfo, ref target.RoleData); PlayerUtils.GetRoleBaseInfo(target, ref queryRes.Info.RoleBaseInfo); queryRes.Info.RoleBaseInfo.Nick.SetString(GetRobotLastNameByIdx()); PlayerOnGame p = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(res.Uid); if (p != null) { p.SendToClient((int)CSGameMsgID.CbcPlayerSync, ref queryRes); } } } public static void CbcPlayerRes(ref CSPlayerQueryOtherRoleInfoRes res) { CSCBCPlayerQuerySync queryRes = new CSCBCPlayerQuerySync(); queryRes.Info.CopyFrom(ref res.ShowInfo); PlayerOnGame p = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(res.FromUid); if (p != null) { queryRes.Info.RoleBaseInfo.Nick.SetString(GetRobotLastNameByIdx()); p.SendToClient((int)CSGameMsgID.CbcPlayerSync, ref queryRes); } } private static string GetRobotLastNameByIdx( ) { int c = RandNameDescMgr.Instance.ItemTable.Count; int idx = GameServerUtils.GetGameServerData().m_app.Rand.Next(0, c); string name = ""; var desc = RandNameDescMgr.Instance.GetConfig(idx); if (desc != null) { int randNameRow = 0; string strRandNameRow = GameServerUtils.GetApp().GetCluster().GetAppParamByKey("randNameRow"); //读第几列,从0开始 if (!string.IsNullOrEmpty(strRandNameRow)) { int.TryParse(strRandNameRow, out randNameRow); } if (randNameRow + 1 <= desc.name.Length) { if (!string.IsNullOrEmpty(desc.name[randNameRow].LastName)) { name = desc.name[randNameRow].LastName; } } } return name; } } }