using System; using Sog; using ProtoCSStruct; namespace Game { public class EquipmentHandler : BasePacketHandler { public override int GetServiceType() { return GameServiceType.EquipmentHandler; } //销毁的时候置空 public override void Dispose() { } public EquipmentHandler() { } public override void HandlerClientPacket(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("EquipmentHandler.HandlerClientPacket can not find PlayerOnGame sessionid {0}", playerSession.SessionID); return; } switch (packet.MsgID) { case (int)CSGameMsgID.RecruitReq: RecruitSvc.Recruit(player, packet); break; case (int)CSGameMsgID.RecruitChooseRewardReq: RecruitSvc.RecruitChooseRewardReq(player, packet); break; case (int)CSGameMsgID.EquipOpReq: EquipOpReq(player, packet); break; case (int)CSGameMsgID.EquipBatchsell: EquipBatchsell(player, packet); break; case (int)CSGameMsgID.EquipBuyDepot: EquipBuyDepot(player, packet); break; case (int)CSGameMsgID.EquipSetNewget: EquipSetNewget(player, packet); break; case (int)CSGameMsgID.EquipPutDepot: EquipPutDepot(player, packet); break; case (int)CSGameMsgID.SkinPuton: SkinSvc.PutonOnSkin(player, packet); break; case (int)CSGameMsgID.SkinSetNewget: SkinSvc.SkinSetNewget(player, packet); break; case (int)CSGameMsgID.GemWear: GemSvc.GemWear(player, packet); break; case (int)CSGameMsgID.GemCompose: GemSvc.GemCompose(player, packet); break; case (int)CSGameMsgID.GemComposeOne: GemSvc.GemComposeOne(player, packet); break; case (int)CSGameMsgID.GemComposeOneSave: GemSvc.GemComposeOneSave(player, packet); break; case (int)CSGameMsgID.GemLock: GemSvc.GemLock(player, packet); break; case (int)CSGameMsgID.GemSetnewget: GemSvc.GemSetNewGet(player, packet); break; case (int)CSGameMsgID.OnChangeStarWearReq: WingSvc.OnChangeStarWear(player, packet); break; case (int)CSGameMsgID.OnChangeWingSkinReq: WingSvc.OnChangeWingSkin(player, packet); break; case (int)CSGameMsgID.OnUpgradeMainWingReq: WingSvc.MainWingOption(player, packet); break; case (int)CSGameMsgID.OnUpgradeWingSkinReq: WingSvc.UpgradeWingSkin(player, packet); break; case (int)CSGameMsgID.OnMarkWingNewGetReq: WingSvc.OnMarkNewGet(player); break; case (int)CSGameMsgID.PresetSaveReq: PlayerPresetSvc.PresetSave(player, packet); break; case (int)CSGameMsgID.PresetApplyReq: PlayerPresetSvc.PresetApplyReq(player, packet); break; case (int)CSGameMsgID.PresetBuyOneReq: PlayerPresetSvc.PresetBuyOneReq(player, packet); break; case (int)CSGameMsgID.PresetRenameReq: PlayerPresetSvc.PresetRenameReq(player, packet); break; case (int)CSGameMsgID.EquipCombatPreview: EquipCombatPreview(player, packet); break; default: TraceLog.Error("EquipmentHandler HandlerClientPacket playerUID {0} , message is a invalid id {1} " , playerSession.UserID, packet.MsgID); break; } } public override void HandlerServerPacket(uint serverID, StructPacket packet) { } public static void Shuffle(Random rnd, T[] array) { int n = array.Length; while (n > 1) { int k = rnd.Next(n--); T temp = array[n]; array[n] = array[k]; array[k] = temp; } } private void EquipOpReq(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSEquipOpRes(); res.Ret = CSErrCode.Fail; res.OpType = req.OpType; res.Index = req.Index; int equipId = req.Index; int pos = req.Pos; switch (req.OpType) { case 1: { //分解 //CSEquipDelSync del = new CSEquipDelSync(); UnifyOp op = new UnifyOp(player, BillChangeItemReason.Equipment); bool find = false; for (int j = player.RoleData.PandoraBag.EquipList.Count - 1; j >= 0; j--) { if (player.RoleData.PandoraBag.EquipList[j].SerialNum == equipId && !player.RoleData.PandoraBag.EquipList[j].Lock) { ref var equip = ref player.RoleData.PandoraBag.EquipList[j]; int quality = equip.Quality; string itemid = CommParamDescMgr.Instance.BreakItemId.str_list[quality - 1]; //12 背包 分解获得道具数量(对应装备品质1、2、3、4、5) 10000;10000;10000;10000;10000 int itemCount = CommParamDescMgr.Instance.BreakItemNum.int_list[quality - 1]; op.AddItem(itemid, itemCount); player.RoleData.PandoraBag.EquipList.RemoveAt(j); //var top = new TypeIDValueString(); //top.Id.SetString(itemid); //top.Value = itemCount; //top.Type = (int)GoodsType.Items; //top.Value = itemCount; //res.GetItems.Add(ref top); find = true; //del.DelIds.Add(equip.SerialNum); TaskEXEvent.TriggerBreakEquipN(player, 1); break; } } if (find) { op.DoOp(true, true,true); //PlayerDataSvc.SendEquipListSync(player); // player.SendToClient((int)CSGameMsgID.EquipDelSync, ref del); res.Ret = CSErrCode.None; } player.SendToClient((int)CSGameMsgID.EquipOpRes, ref res); break; } case 2: { res.Ret = EquipmentSvc.WearEquip(player, equipId, pos); player.SendToClient((int)CSGameMsgID.EquipOpRes, ref res); } break; case 3://卸下 { int existIndex = -1; for (int i = 0; i < player.RoleData.Knight.DbHero.WearEquip.Count; i++) { ref var eq = ref player.RoleData.Knight.DbHero.WearEquip[i]; if (eq.SerialNum == equipId) { existIndex = i; break; } } if (existIndex != -1) { ref var eeq = ref player.RoleData.Knight.DbHero.WearEquip[existIndex]; eeq.Pos = 0; eeq.NewGet = false; player.RoleData.PandoraBag.EquipList.Add(ref eeq); var add = new CSEquipSync(); add.Add.CopyFrom(ref eeq); player.RoleData.Knight.DbHero.WearEquip.RemoveAt(existIndex); EquipmentSvc.CheckEquipSuit(ref player.RoleData.Knight.DbHero); RolePropUtil.RecalRoleProp(player); PlayerDataSvc.SendHeroInfoSync(player); // PlayerDataSvc.SendEquipListSync(player); player.SendToClient((int)CSGameMsgID.EquipSync, ref add); res.Ret = CSErrCode.None; } player.SendToClient((int)CSGameMsgID.EquipOpRes, ref res); } break; case 4://锁定 { for (int i = 0; i < player.RoleData.PandoraBag.EquipList.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipList[i]; if (eq.SerialNum == equipId) { eq.Lock = true; res.Ret = CSErrCode.None; break; } } player.MakeDirty(); player.SendToClient((int)CSGameMsgID.EquipOpRes, ref res); break; } case 5://解锁 { for (int i = 0; i < player.RoleData.PandoraBag.EquipList.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipList[i]; if (eq.SerialNum == equipId) { eq.Lock = false; res.Ret = CSErrCode.None; break; } } player.MakeDirty(); player.SendToClient((int)CSGameMsgID.EquipOpRes, ref res); break; } } } private void EquipBatchsell(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSEquipBatchSellRes(); res.Index.CopyFrom(ref req.Index); for(int i = 0;i < req.Index.Count;i++) { var idx = req.Index[i]; if(idx == 0) { break; } bool exist = false; for(int j = 0;j < player.RoleData.PandoraBag.EquipList.Count; j++) { if(player.RoleData.PandoraBag.EquipList[j].SerialNum == idx && !player.RoleData.PandoraBag.EquipList[j].Lock) { exist = true; break; } } if (!exist) { res.Ret = CSErrCode.EquipDecomposeFail; player.SendToClient((int)CSGameMsgID.EquipBatchsellRes, ref res); return; } } UnifyOp op = new UnifyOp(player, BillChangeItemReason.Equipment); for (int i = 0; i < req.Index.Count; i++) { var idx = req.Index[i]; if (idx == 0) { break; } for (int j = player.RoleData.PandoraBag.EquipList.Count -1 ; j >=0; j--) { if (player.RoleData.PandoraBag.EquipList[j].SerialNum == idx && !player.RoleData.PandoraBag.EquipList[j].Lock) { ref var equip = ref player.RoleData.PandoraBag.EquipList[j]; int quality = equip.Quality; string itemid = CommParamDescMgr.Instance.BreakItemId.str_list[quality - 1]; //12 背包 分解获得道具数量(对应装备品质1、2、3、4、5) 10000;10000;10000;10000;10000 int itemCount = CommParamDescMgr.Instance.BreakItemNum.int_list[quality - 1]; op.AddItem(itemid, itemCount); player.RoleData.PandoraBag.EquipList.RemoveAt(j); break; } } } //ref var goodchg = ref UnifyOp.GetGoodsChangeNotify(); //for (int i = 0; i < goodchg.ChgItems.Count; i++) //{ // ref var c = ref goodchg.ChgItems[i]; // TypeIDValueString ittype = new TypeIDValueString(); // ittype.Value = (int)c.ChgCount; // ittype.Type = c.Type; // ittype.Id.SetString(c.Id.GetString()); // res.GetItems.Add(ref ittype); //} op.DoOp(true, true, true); res.Ret = CSErrCode.None; player.SendToClient((int)CSGameMsgID.EquipBatchsellRes, ref res); //PlayerDataSvc.SendBagInfoSync(player); //PlayerDataSvc.SendEquipListSync(player); TaskEXEvent.TriggerBreakEquipN(player, req.Index.Count); } private void EquipBuyDepot(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSEquipBuyDepotRes(); res.Index = req.Index; if(req.Index != player.RoleData.PandoraBag.EuqipDepotCount + 1) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.EquipBuyDepotRes, ref res); return; } if(CommParamDescMgr.Instance.WareRoomNum.int_val == player.RoleData.PandoraBag.EuqipDepotCount) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.EquipBuyDepotRes, ref res); return; } //15 仓库 仓库解锁消耗道具数量(0为默认解锁) 0;10000;10000;10000 //16 仓库 仓库解锁消耗道具id Gold var itemNum = CommParamDescMgr.Instance.WareRoomCostNum.int_list[req.Index - 1]; var itemId = CommParamDescMgr.Instance.WareRoomCostId.str_val; if (itemNum > 0){ UnifyOp unifyOp = new UnifyOp(player, BillChangeItemReason.Equipment); if (unifyOp.GetItemCount(itemId) < itemNum) { res.Ret = CSErrCode.EquipDepotBuyFail; player.SendToClient((int)CSGameMsgID.EquipBuyDepotRes, ref res); return; } unifyOp.CostItem(itemId, itemNum); unifyOp.DoOp(true, true); } res.Ret = CSErrCode.None; player.RoleData.PandoraBag.EuqipDepotCount++; PlayerDataSvc.SendEquipDepotSync(player); player.SendToClient((int)CSGameMsgID.EquipBuyDepotRes, ref res); } private void EquipSetNewget(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); bool change = false; bool depotChange = false; int id = req.EquipId; for(int i = 0;i < player.RoleData.PandoraBag.EquipList.Count;i++) { ref var eq = ref player.RoleData.PandoraBag.EquipList[i]; if (eq.NewGet &&( id ==0 || eq.SerialNum == id)) { eq.NewGet = false; change = true; } } for (int i = 0; i < player.RoleData.PandoraBag.EquipDepot.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipDepot[i]; if (eq.NewGet && (id == 0 || eq.SerialNum == id)) { eq.NewGet = false; depotChange = true; } } bool heroChange = false; for (int i = 0; i < player.RoleData.Knight.DbHero.WearEquip.Count; i++) { ref var eq = ref player.RoleData.Knight.DbHero.WearEquip[i]; if (eq.NewGet && (id == 0 || eq.SerialNum == id)) { eq.NewGet = false; heroChange = true; } } if (change || heroChange) { player.MakeDirty(); if (change) { //PlayerDataSvc.SendEquipListSync(player); } if (depotChange) { //PlayerDataSvc.SendEquipDepotSync(player); } if(heroChange) { PlayerDataSvc.SendHeroInfoSync(player); } } var res = new CSEquipSetNewGetRes(); res.EquipId = id; player.SendToClient((int)CSGameMsgID.EquipSetNewgetRes, ref res); } private void EquipPutDepot(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSEquipPutDepotRes(); res.Ret = CSErrCode.Fail; res.DepotId = req.DepotId; res.Index = req.Index; res.PutType = req.PutType; if(req.DepotId > player.RoleData.PandoraBag.EuqipDepotCount) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.EquipPutDepotRes, ref res); return; } //14 仓库 仓库栏位数 100 if(req.PutType == 1 && player.RoleData.PandoraBag.EquipDepot.Count > CommParamDescMgr.Instance.WareRoomGridNum.int_val * player.RoleData.PandoraBag.EuqipDepotCount) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.EquipPutDepotRes, ref res); return; } if(req.PutType == 2 && player.RoleData.PandoraBag.EquipList.Count >= player.RoleData.PandoraBag.EquipList.GetMaxCount() ) { res.Ret = CSErrCode.Fail; player.SendToClient((int)CSGameMsgID.EquipPutDepotRes, ref res); return; } if (req.PutType == 1) { for (int i = 0; i < player.RoleData.PandoraBag.EquipList.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipList[i]; if (eq.SerialNum == req.Index) { eq.DepotId = req.DepotId; player.RoleData.PandoraBag.EquipDepot.Add(ref eq); player.RoleData.PandoraBag.EquipList.RemoveAt(i); res.Ret = CSErrCode.None; player.MakeDirty(); //PlayerDataSvc.SendEquipListSync(player); //PlayerDataSvc.SendEquipDepotSync(player); break; } } } else { //取出 for (int i = 0; i < player.RoleData.PandoraBag.EquipDepot.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipDepot[i]; if (eq.SerialNum == req.Index && eq.DepotId == req.DepotId) { eq.DepotId = 0; player.RoleData.PandoraBag.EquipList.Add(ref eq); player.RoleData.PandoraBag.EquipDepot.RemoveAt(i); res.Ret = CSErrCode.None; player.MakeDirty(); //PlayerDataSvc.SendEquipListSync(player); //PlayerDataSvc.SendEquipDepotSync(player); break; } } } player.SendToClient((int)CSGameMsgID.EquipPutDepotRes, ref res); } private void EquipCombatPreview(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); int id = req.EquipId; for(int i = 0; i < player.RoleData.PandoraBag.EquipList.Count; i++) { ref var eq = ref player.RoleData.PandoraBag.EquipList[i]; if (eq.SerialNum == id) { //用此装备替换已穿戴同位置装备 var conf = EquipDescMgr.Instance.GetConfigByInternal(eq.DescId); RoleProp cprop = new RoleProp(player.knight.props); for (int k = 0; k < player.RoleData.Knight.DbHero.WearEquip.Count; k++) { if (player.RoleData.Knight.DbHero.WearEquip[k].Pos == (int)conf.type) { ref var eeq = ref player.RoleData.Knight.DbHero.WearEquip[k]; for (int j = 0; j < eeq.BaseProp.Count; j++) { cprop.AddProp(eeq.BaseProp[j].Id, -eeq.BaseProp[j].Value); } for (int j = 0; j < eeq.AddProp.Count; j++) { cprop.AddProp(eeq.AddProp[j].Id, -eeq.AddProp[j].Value); } break; } } for (int j = 0; j < eq.BaseProp.Count; j++) { cprop.AddProp(eq.BaseProp[j].Id, eq.BaseProp[j].Value); } for (int j = 0; j < eq.AddProp.Count; j++) { cprop.AddProp(eq.AddProp[j].Id, eq.AddProp[j].Value); } long newPower = RolePropUtil.CalcPower(cprop); var res = new CSEquipCombatPreviewRes(); res.EquipId = id; res.CombatChange = (int)(newPower - player.RoleBase.Power); player.SendToClient((int)CSGameMsgID.EquipCombatPreviewRes, ref res); return; } } } } }