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.
 
 
 
 
 
 

549 lines
23 KiB

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<T>(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<CSEquipOpReq>();
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<CSEquipBatchSell>();
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<CSEquipBuyDepot>();
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<CSEquipSetNewGet>();
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<CSEquipPutDepot>();
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<CSEquipCombatPreview>();
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;
}
}
}
}
}