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
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;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|