You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

577 lines
26 KiB

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<CSCBStartReq>();
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<CSCBFinishLayerReq>();
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<CSRankPlayerByLevelReq>((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<CSCBFinishLayerRes>().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<CSCBLeaveReq>();
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<CSItemChgInfo> list = new List<CSItemChgInfo>();
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<CSCBLeaveRes>().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<CSCBGetLayerRewardReq>();
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<CSRankPlayerByLevelRes>();
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<CSPlayerQueryOtherRoleInfoReq>((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;
}
}
}