using Sog; using Sog.Log; using ProtoCSStruct; using TencentCloud.Scf.V20180416.Models; using System.Collections.Generic; namespace Game { class ExchangeCodeHandler : BasePacketHandler { public ExchangeCodeHandler(RootMessageHandler mgr) { RegisterMsgs(mgr); } public override void Dispose() { } public override int GetServiceType() { return GameServiceType.ExchangeCodeHandler; } protected void RegisterMsgs(RootMessageHandler mgr) { mgr.RegisterPacketHandler((int)CSGameMsgID.ExchangeCodeTakeReq, this); mgr.RegisterPacketHandler((int)SSGameMsgID.ExchangeCodeSynNotify, this); mgr.RegisterPacketHandler((int)SSGameMsgID.ExchangeCodeTakeRes, this); } public override void HandlerClientPacket(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("ExchangeCodeHandler.HandlerClientPacket can not find PlayerOnGame sessionid {0}", playerSession.SessionID); return; } switch (packet.MsgID) { case (int)CSGameMsgID.ExchangeCodeTakeReq: OnExchangeCodeTakeReq(player, packet); break; default: TraceLog.Error("ExchangeCodeHandler.HandlerClientPacket msg {0} not handle", packet.MsgID); break; } } public override void HandlerServerPacket(uint serverID, StructPacket packet) { switch(packet.MsgID) { //case (int)SSGameMsgID.ExchangeCodeSynNotify: //OnExchangeCodeSynNotify(packet); //break; case (int)SSGameMsgID.ExchangeCodeTakeRes: OnExchangeCodeTakeRes(packet); break; default: break; } } public static void SendExchangeCodeTakeReq(PlayerOnGame player, string code) { TraceLog.Debug("ExchangeCodeHandler.SendExchangeCodeTakeReq: uid:{0}, exchageCode:{1}", player.UserID, code); //转给playeropsvr处理 SSExchangeCodeTakeReq ssreq = new SSExchangeCodeTakeReq() { Uid = player.UserID }; ssreq.Code.SetString(code); GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.ExchangeCodeTakeReq, ref ssreq, player.UserID, 0); } private void OnExchangeCodeTakeReq(PlayerOnGame player, StructPacket packet) { ref CSExchangeCodeTakeReq req = ref packet.GetMessage(); SendExchangeCodeTakeReq(player, req.Code.GetString()); } private void OnExchangeCodeTakeRes(StructPacket packet) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(packet.ObjectID); if (player == null) { TraceLog.Error("ExchangeCodeHandler.OnExchangeCodeTakeRes no player:{0}", packet.ObjectID); return; } ref SSExchangeCodeTakeRes svrRes = ref packet.GetMessage(); CSExchangeCodeTakeRes csRes = new CSExchangeCodeTakeRes(); csRes.Ret = svrRes.Ret; if(csRes.Ret != 0) { SendToPlayer(player, (int)CSGameMsgID.ExchangeCodeTakeRes, ref csRes); return; } //UnifyOp op = new UnifyOp(player, BillChangeItemReason.ExchangeCodeRewards); //string billLogStr = ""; csRes.RewardList.CopyFrom(ref svrRes.RewardList); //for (int i = 0; i < csRes.RewardList.Count; i++) //{ // ref var it = ref csRes.RewardList[i]; // billLogStr += it.Reward.Id.GetString() + ":" + it.Reward.Type.ToString() + ":" + it.Reward.Value.ToString() + "#"; // op.AddGoods(it.Reward.Type, it.Reward.Id.ToString(), it.Reward.Value); //} //csRes.Ret = (int)op.DoOp(true, true, true); //if(csRes.Ret != 0) //op失败了,要回退吗? //{ // TraceLog.Error("ExchangeCodeHandler.OnExchangeCodeTakeRes DoOp failed: uid:{0} codeId:{1}", packet.ObjectID, svrRes.CodeId); //} List res = new List(); for (int i = 0; i < csRes.RewardList.Count; i++) { ref var it = ref csRes.RewardList[i]; RewardItemRW r = new RewardItemRW(); r.type = it.Reward.Type; r.amount = it.Reward.Value; r.code = it.Reward.Id.GetString(); res.Add(r); } MailSender.SendNewMailToPlayer(player, 3, res); //op失败,但实际已经认为领取成功,概率很低,反馈后补发吧 SendToPlayer(player, (int)CSGameMsgID.ExchangeCodeTakeRes, ref csRes); return; } } }