Esempio n. 1
0
UINT CGUnEquipHandler::Execute( CGUnEquip* pPacket, Player* pPlayer )
{
	__ENTER_FUNCTION

	GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
	Assert( pGamePlayer ) ;

	Obj_Human* pHuman = pGamePlayer->GetHuman() ;
	Assert( pHuman ) ;

	Scene* pScene = pHuman->getScene() ;
	if( pScene==NULL )
	{
		Assert(FALSE) ;
		return PACKET_EXE_ERROR ;
	}

	//检查线程执行资源是否正确
	Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;

	HUMAN_EQUIP	EquipPoint = (HUMAN_EQUIP)pPacket->getEquipPoint();

	//Assert( pHuman->GetDB()->GetEquipDB()->IsSet(EquipPoint) ) ;



	Item*	pEquipItem = HumanItemLogic::GetEquip(pHuman,EquipPoint);
	
	if(!pEquipItem)
	{
		Assert(pEquipItem);
		return	PACKET_EXE_CONTINUE;
	}
	if(pEquipItem->IsEmpty())
	{
		return	PACKET_EXE_CONTINUE;
	}

	UCHAR	itemClass = pEquipItem->GetItemClass();
	if(itemClass ==	ICLASS_EQUIP)
	{
		INT		BagIndex;//	=	pHuman->GetFirstEmptyBagIndex();

		ItemContainer*	pEquipContainer = pHuman->GetEquipContain();
		ItemContainer*	pBaseContainer	= pHuman->GetBaseContain();

		if(!pEquipContainer)
		{
			Assert(pEquipItem);
			return	PACKET_EXE_CONTINUE;
		}
		
		BYTE	DeliverBagIndex = pPacket->getBagIndex();

		if(DeliverBagIndex<pBaseContainer->GetContainerSize())
		{
			BagIndex	=	g_ItemOperator.MoveItem(pEquipContainer,
				EquipPoint,
				pBaseContainer,DeliverBagIndex);
		}
		else
		{
			BagIndex	=	g_ItemOperator.MoveItem(pEquipContainer,
							EquipPoint,
							pBaseContainer);
		}
		

		GCUnEquipResult	 Msg;
		if(BagIndex>=0
			&& BagIndex<pBaseContainer->GetContainerSize())
		{
			Msg.setEquipPoint(EquipPoint);
			Msg.setBagIndex(BagIndex);
			Msg.setItemID(pEquipItem->GetGUID());
			Msg.setItemTableIndex(pEquipItem->GetItemTableIndex());
			Msg.setResult(UNEQUIP_SUCCESS);
			pHuman->SetEquipVer(pHuman->GetEquipVer()+1);
			pHuman->ItemEffectFlush();

			pGamePlayer->SendPacket( &Msg ) ;

			//如果可见
			if(pHuman->IsVisualPart(EquipPoint))
			{	
				GCCharEquipment OtherMsg;
				OtherMsg.setObjID(pHuman->GetID());
				//if(EquipPoint == HEQUIP_WEAPON)
				//{
				//	UINT uGemID = GetEquipmentMaxLevelGemID(pEquipItem);
				//	OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), uGemID);
				//}
				//else
				//{
					OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), -1);
				//}
				pScene->BroadCast(&OtherMsg,pHuman,TRUE);
			}
		}
		else
		{
			if(ITEMOE_DESTOPERATOR_HASITEM == BagIndex)
			{
				Msg.setResult(UNEQUIP_HAS_ITEM);
				pGamePlayer->SendPacket( &Msg ); 
			}
			else if(ITEMOE_DESTOPERATOR_FULL == BagIndex)
			{
				Msg.setResult(UNEQUIP_BAG_FULL);
				pGamePlayer->SendPacket( &Msg ); 
			}
		}
		
	}
	else
	{
		Assert(FALSE);
		//装备为什么不是 ICLASS_EQUIP
	}
	
	g_pLog->FastSaveLog( LOG_FILE_1, "CGUnEquipHandler EquipPoint=%d itemClass=%d",
		EquipPoint, itemClass  ) ;

	
	return PACKET_EXE_CONTINUE ;

	__LEAVE_FUNCTION

	return PACKET_EXE_ERROR ;
}
Esempio n. 2
0
uint CGEquipSuitExchangeHandler::Execute(CGEquipSuitExchange* pPacket, Player* pPlayer )
{
	__ENTER_FUNCTION

	GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
	Assert( pGamePlayer ) ;

	Obj_Human* pHuman = pGamePlayer->GetHuman() ;
	Assert( pHuman ) ;

	Scene* pScene = pHuman->getScene() ;
	if( pScene==NULL )
	{
		Assert(FALSE) ;
		return PACKET_EXE_ERROR ;
	}

	//检查线程执行资源是否正确
	Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;

	//交易状态不可操作
	if(pHuman->m_ExchangBox.m_Status > 0)
	{//丢弃
		g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ExchangBox::m_Status>0" ,pHuman->GetID()) ;
		return PACKET_EXE_CONTINUE ;
	}
	//摆摊状态不可操作
	if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN)
	{//丢弃
		g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ;
		return PACKET_EXE_CONTINUE ;
	}

	//切场景时丢弃换装消息
	if(pGamePlayer->GetPlayerStatus()!=PS_SERVER_NORMAL ||
		!pHuman->IsActiveObj() )
	{
		g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: change scene") ;
		return PACKET_EXE_CONTINUE;
	}
	//摆摊不可操作
	if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN)
	{//丢弃
		g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ;
		return PACKET_EXE_CONTINUE ;
	}

	UINT  nSuitNum = pPacket->getEquipSuitNum();

	if( nSuitNum > MAX_EQUIP_SUIT_NUM )
	{
		return PACKET_EXE_ERROR ;
	}

	ItemContainer* pEquipContainer = pHuman->GetEquipContain();
	
	Assert(pEquipContainer);
	_SUIT_SETTING suitSetting = pHuman->GetEquipSuitSetting(nSuitNum);

	GCEquipSuitExchangeResult Msg;
	GCDetailEquipList	SelfMsg;
	GCCharEquipment OtherMsg;
	SelfMsg.setObjID( pHuman->GetID() );
	BOOL bChange = FALSE;
	UINT RetPart = 0;

	//遍历所有套装
	for(INT i=0; i<HEQUIP_NUMBER; ++i)
	{
		//存在套装数据
		if(!suitSetting.m_EquipData[i].isNull())
		{
			//检查装备栏
			Item* pEquip = pEquipContainer->GetItem(i);
			Assert(pEquip);

			//装备有变化,装备栏数据与保存的对应位置套装信息不一致,需要到背包里找
			if(!(pEquip->GetGUID() == suitSetting.m_EquipData[i]))
			{
				INT nPos = INVALID_INDEX;
				ItemContainer* pBagContainer = HumanItemLogic::GetBagItemContain(pHuman, &suitSetting.m_EquipData[i], nPos);
				//背包里也找不到,需记录下来(卖掉了?丢掉了?。。)
				if(nPos == INVALID_INDEX)
				{
					EXCHANGE_EQUIP_INFO ExchangeInfo;
					ExchangeInfo.m_BagIndex = INVALID_ITEM_POS;
					ExchangeInfo.m_EquipPoint	= INVALID_ITEM_POS;
					Msg.setEquipInfo(ExchangeInfo, i);
					continue;
				}
				
				//找到了
				Item*	pExchangeItem = HumanItemLogic::GetBagItem(pHuman, nPos);
				
				Assert(pExchangeItem->GetItemClass() == ICLASS_EQUIP);
				if(pExchangeItem->GetEquipPoint() != i)
				{
					if(pExchangeItem->GetEquipPoint() == HEQUIP_RING1)
					{
						Assert(i == HEQUIP_RING2);
					}
					else if(pExchangeItem->GetEquipPoint() == HEQUIP_ADORN1)
					{
						Assert(i == HEQUIP_ADORN2);
					}
					else
						Assert(0);
				}
				//玩家可能等级变了
				if(pExchangeItem->GetRequireLevel() > pHuman->GetLevel() )
				{
					EXCHANGE_EQUIP_INFO ExchangeInfo;
					ExchangeInfo.m_BagIndex = INVALID_ITEM_POS;
					ExchangeInfo.m_EquipPoint	= i;
					Msg.setEquipInfo(ExchangeInfo, i);
					g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: Equiplevel , pEquip->GetRequireLevel()=%d", pEquip->GetRequireLevel() ) ;
					continue;
				}
				
				//可能换职业了
				if(!pExchangeItem->IsWuMenPai())
				{
					if(!pExchangeItem->InReqJob(pHuman->GetMenPai()))
					{
						EXCHANGE_EQUIP_INFO ExchangeInfo;
						ExchangeInfo.m_BagIndex = INVALID_ITEM_POS;
						ExchangeInfo.m_EquipPoint	= i;
						Msg.setEquipInfo(ExchangeInfo, i);
						g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: ReqJob") ;
						continue;
					}
				}
				if (pEquip->IsEmpty())
				{
					g_ItemOperator.MoveItem( pBagContainer,
						pBagContainer->BagIndex2ConIndex(nPos),
						pEquipContainer,
						i ) ;
				}
				
				else
				{
					if (pBagContainer->IsCanUse())
					{
						//与装备的物品进行交换
						g_ItemOperator.ExchangeItem(pBagContainer,
							pBagContainer->BagIndex2ConIndex(nPos),
							pEquipContainer,
							i);
					}
					else //背包已经过期
					{
						EXCHANGE_EQUIP_INFO ExchangeInfo;
						ExchangeInfo.m_BagIndex = INVALID_ITEM_POS;
						ExchangeInfo.m_EquipPoint	= INVALID_ITEM_POS;
						Msg.setEquipInfo(ExchangeInfo, i);
						continue;
					}
				}
				EXCHANGE_EQUIP_INFO ExchangeInfo;
				ExchangeInfo.m_BagIndex = nPos;
				ExchangeInfo.m_EquipPoint	= i;
				Msg.setEquipInfo(ExchangeInfo, i);

				//交换到人身上了,重新获取一下
				Item* pEquipItem = HumanItemLogic::GetEquip(pHuman, (HUMAN_EQUIP)i);
				if(!pEquipItem)
				{
					Assert(FALSE);
					return PACKET_EXE_CONTINUE;
				}
				Assert(!pEquipItem->IsEmpty()); 

				pEquipItem->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)i));
				RetPart|=(1<<((UINT)i));
				SelfMsg.SetAskPart(RetPart);
				RetPart = 0;
				//如果可见
				if(pHuman->IsVisualPart((HUMAN_EQUIP)i))
				{	
					OtherMsg.setObjID(pHuman->GetID());
					OtherMsg.setID((HUMAN_EQUIP)i, pEquipItem->GetItemTableIndex());
				}

				//换装了
				bChange = TRUE;
			}

			//装备正穿着呢,不需要通知
			continue;
		}
		else
		{
			//根本没有呀
			EXCHANGE_EQUIP_INFO ExchangeInfo;
			ExchangeInfo.m_BagIndex = INVALID_ITEM_POS;
			ExchangeInfo.m_EquipPoint	= i;
			Msg.setEquipInfo(ExchangeInfo, i);
		}
	}

	
	if(bChange)
	{
		Msg.setResult(EQUIPSUIT_SUCCESS);
		pGamePlayer->SendPacket(&Msg);
		pGamePlayer->SendPacket( &SelfMsg ) ;
		pScene->BroadCast(&OtherMsg,pHuman,TRUE);
		pHuman->SetEquipVer(pHuman->GetEquipVer()+1);
		//刷新装备对人物的属性影响

		pHuman->ItemEffectFlush();
	}
	else
	{
		Msg.setResult(EQUIPSUIT_SUCCESS);
		pGamePlayer->SendPacket(&Msg);
	}

	g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: nSuitNum=%d", nSuitNum ) ;

	return PACKET_EXE_CONTINUE ;

	__LEAVE_FUNCTION

		return PACKET_EXE_ERROR ;
}
uint CGCharAskEquipmentHandler::Execute( CGCharAskEquipment* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION

		GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
		Assert( pGamePlayer ) ;

		Obj_Human* pHuman = pGamePlayer->GetHuman() ;
		Assert( pHuman ) ;

		Scene* pScene = pHuman->getScene() ;
		if( pScene==NULL )
		{
			Assert(FALSE) ;
			return PACKET_EXE_ERROR ;
		}

		//检查线程执行资源是否正确
		Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;



		ObjID_t ObjID = pPacket->getObjID();
		if( ObjID == INVALID_ID )
		{
			Assert(FALSE) ;
			return PACKET_EXE_ERROR ;
		}

		Obj* pObj = pScene->GetObjManager()->GetObj( ObjID ) ;
		if( pObj==NULL )
		{
			g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: not find obj=%d", ObjID ) ;
			return PACKET_EXE_CONTINUE ;
		}

		if( !IsCharacterObj( pObj->GetObjType() ) )
		{
			g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: not character obj=%d", ObjID ) ;
			return PACKET_EXE_CONTINUE ;
		}

		Obj_Character* pCharacter = (Obj_Character*)pObj ;

		GCCharEquipment	Msg;
		Msg.setObjID(pCharacter->GetID());
		if ( pCharacter->GetObjType() == Obj::OBJ_TYPE_HUMAN )
		{
			Obj_Human* pDest = (Obj_Human*)pCharacter ;
			if(pDest->GetEquipID(HEQUIP_WEAPON)> 0)
			{
				Msg.setWeaponID(pDest->GetEquipID(HEQUIP_WEAPON));
				UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_WEAPON));
				Msg.setWeaponGemID(uGemID);
			}
			if(pDest->GetEquipID(HEQUIP_BOOT)>0)
			{
				Msg.setBootID(pDest->GetEquipID(HEQUIP_BOOT));
				UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_BOOT));
				Msg.setBootGemID(uGemID);
			}
			if(pDest->GetEquipID(HEQUIP_CUFF)>0)
			{
				Msg.setCuffID(pDest->GetEquipID(HEQUIP_CUFF));
				UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_CUFF));
				Msg.setCuffGemID(uGemID);
			}
			if(pDest->GetEquipID(HEQUIP_CAP)>0)
			{
				Msg.setCapID(pDest->GetEquipID(HEQUIP_CAP));
				UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_CAP));
				Msg.setCapGemID(uGemID);
			}
			if(pDest->GetEquipID(HEQUIP_ARMOR)>0)
			{
				Msg.setArmourID(pDest->GetEquipID(HEQUIP_ARMOR));
				UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_ARMOR));
				Msg.setArmourGemID(uGemID);
			}

			pGamePlayer->SendPacket( &Msg ) ;
		}
		g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: ok obj=%d scene=%d", 
		ObjID, pScene->SceneID() ) ;

		return PACKET_EXE_CONTINUE ;
		

		__LEAVE_FUNCTION
		return PACKET_EXE_ERROR ;
}
uint CGDiscardEquipHandler::Execute(CGDiscardEquip* pPacket, Player* pPlayer )
{
	__ENTER_FUNCTION


	GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
	Assert( pGamePlayer ) ;

	Obj_Human* pHuman = pGamePlayer->GetHuman() ;
	Assert( pHuman ) ;

	Scene* pScene = pHuman->getScene() ;
	if( pScene==NULL )
	{
		Assert(FALSE) ;
		return PACKET_EXE_ERROR ;
	}

	//检查线程执行资源是否正确
	Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;


	HUMAN_EQUIP		EquipPoint = (HUMAN_EQUIP)pPacket->GetEquipPoint();

	//Assert( pHuman->GetDB()->GetEquipDB()->IsSet(EquipPoint)) ;

	Item*		pEquip	=	HumanItemLogic::GetEquip(pHuman,EquipPoint);
	
	if(!pEquip)
	{
		Assert(pEquip);
		return PACKET_EXE_CONTINUE;
	}
	
	GCDiscardEquipResult	Msg;

	if(pEquip->IsEmpty())
	{
		Msg.SetResult(DISCARDEQUIP_NO_SUCH_EQUIP);

	}
	
	if(pEquip->IsRuler(IRL_DISCARD))
	{
		Msg.SetItemTableIndex(pEquip->GetItemTableIndex());
		ITEM_LOG_PARAM	ItemLogParam;
		ItemLogParam.OpType		=	ITEM_DISCARD_EQUIP;
		ItemLogParam.CharGUID	=	pHuman->GetGUID();
		ItemLogParam.BagPos		=	EquipPoint;
		ItemLogParam.XPos		=	pHuman->getWorldPos()->m_fX;
		ItemLogParam.ZPos		=	pHuman->getWorldPos()->m_fZ;
		ItemLogParam.SceneID	=	pHuman->getScene()->SceneID();	

		BOOL bRet =	g_ItemOperator.EraseItem(pHuman->GetEquipContain(),EquipPoint);

		if(bRet) SaveItemLog(&ItemLogParam);

		pHuman->SetEquipVer(pHuman->GetEquipVer()+1);
		pHuman->ItemEffectFlush();
		Msg.SetResult(DISCARDEQUIP_SUCCESS);
		Msg.SetEquipPoint(EquipPoint);
		//如果可见
		if(pHuman->IsVisualPart(EquipPoint))
		{	
			GCCharEquipment OtherMsg;
			OtherMsg.setObjID(pHuman->GetID());
			OtherMsg.setID(EquipPoint,-1, -1);
			pScene->BroadCast(&OtherMsg,pHuman,TRUE);
		}
		
	}
	else
	{
		Msg.SetResult(DISCARDEQUIP_CANNT_DISCARD);

	}
	

	pGamePlayer->SendPacket(&Msg);	

	g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardEquipHandler: ok EquipPoint=%d", 
		EquipPoint ) ;
	
	
	return PACKET_EXE_CONTINUE;

	__LEAVE_FUNCTION

		return PACKET_EXE_ERROR;
}
Esempio n. 5
0
UINT CGUseEquipHandler::Execute(CGUseEquip* pPacket, Player* pPlayer )
{
	__ENTER_FUNCTION
	
	GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
	Assert( pGamePlayer ) ;

	Obj_Human* pHuman = pGamePlayer->GetHuman() ;
	Assert( pHuman ) ;
	
	Scene* pScene = pHuman->getScene() ;
	if( pScene==NULL )
	{
		Assert(FALSE) ;
		return PACKET_EXE_ERROR ;
	}

	//检查线程执行资源是否正确
	Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;

	//切场景时丢弃换装消息
	if(pGamePlayer->GetPlayerStatus()!=PS_SERVER_NORMAL ||
		!pHuman->IsActiveObj() )
	{
		g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: change scene") ;
		return PACKET_EXE_CONTINUE;
	}

	BYTE  BagIndex = pPacket->getBagIndex();

	if( BagIndex == INVALID_BAG_INDEX )
	{
		Assert(FALSE) ; //包发错了
		return PACKET_EXE_CONTINUE ;
	}
		
	Item* pUseItem = HumanItemLogic::GetItem(pHuman,BagIndex);
	
	GCUseEquipResult Msg;

	//////////////////////////////////////////////////////////////////////////
	//装配条件判断
	UCHAR	itemClass = pUseItem->GetItemClass();

	if(itemClass == ICLASS_EQUIP)
	{
		//需求等级判断
		if(pUseItem->GetRequireLevel()>pHuman->GetLevel())
		{
			Msg.setResult(USEEQUIP_IDENT_FAIL);
			pGamePlayer->SendPacket( &Msg ) ;
		}
		//鉴定判断
		else if(pUseItem->GetItemQual() == EQUALITY_BLUE && pUseItem->GetItemIdent() == FALSE)
		{
			Msg.setResult(USEEQUIP_LEVEL_FAIL);
			pGamePlayer->SendPacket( &Msg ) ;
		}
		else
		{
			
			HUMAN_EQUIP		Equip_Point =(HUMAN_EQUIP)pUseItem->GetEquipPoint();
			//const	_ITEM*			pEquip = pHuman->GetEquip(Equip_Point);
			ItemContainer*	pEquipContainer = pHuman->GetEquipContain();
			
			if(!pEquipContainer)
			{
				Assert(pEquipContainer);
				return PACKET_EXE_CONTINUE;
			}

			Item*	pEquipItem = pEquipContainer->GetItem((UINT)Equip_Point);

			if(!pEquipItem)
			{
				Assert(pEquipItem);
				return PACKET_EXE_CONTINUE;

			}
			
			BOOL			bEquipStatus = (!pEquipItem->IsEmpty());

			ItemContainer*	pBagContainer =
				HumanItemLogic::GetContainer(pHuman,BagIndex);

			if(bEquipStatus)
			{
				//装备上物品,替换下来装备点数据
				
				g_ItemOperator.ExchangeItem(pBagContainer,
											pBagContainer->BagIndex2ConIndex(BagIndex),
											pEquipContainer,
											(UINT)Equip_Point);


			}
			else
			{ 
				//pHuman->GetDB()->OverWriteBag2Equip(BagIndex,Equip_Point);
				g_ItemOperator.MoveItem(pBagContainer,
										pBagContainer->BagIndex2ConIndex(BagIndex),
										pEquipContainer,
										(UINT)Equip_Point);

							
			}
			
			Item* pEquip = pEquipContainer->GetItem((UINT)Equip_Point);
			
			if(pEquip&&pEquip->IsCanEquipBind())
			{
				g_ItemOperator.SetItemBind(pEquipContainer,(UINT)Equip_Point);	
			}

			

			Msg.setBagIndex(BagIndex);
			Msg.setEquipPoint(Equip_Point);
			Msg.setEquipID(pEquipItem->GetGUID());
			Msg.setEquipResID(pEquipItem->GetItemTableIndex());
			Msg.setItemResID(pUseItem->GetItemTableIndex());
			Msg.setBagItemId(pUseItem->GetGUID());
			Msg.setResult(USEEQUIP_SUCCESS);
			
			pGamePlayer->SendPacket( &Msg ) ;
			pHuman->SetEquipVer(pHuman->GetEquipVer()+1);
			//刷新装备对人物的属性影响

			pHuman->ItemEffectFlush();

			//如果可见
			if(pHuman->IsVisualPart(Equip_Point))
			{	
				GCCharEquipment OtherMsg;
				OtherMsg.setObjID(pHuman->GetID());
				if(Equip_Point == HEQUIP_WEAPON)
				{
					UINT uGemID = GetEquipmentMaxLevelGemID(pEquip);
					OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), uGemID);
				}
				else
				{
					OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), -1);
				}
				pScene->BroadCast(&OtherMsg,pHuman,TRUE);

			}


			WORD RetPart = 0;
			GCDetailEquipList	SelfMsg;
			SelfMsg.setObjID( pHuman->GetID() );
			pEquipItem = HumanItemLogic::GetEquip(pHuman,Equip_Point);
			if(!pEquipItem)
			{
				Assert(FALSE);
				return PACKET_EXE_CONTINUE;
			}
			if(pEquipItem->IsEmpty()) 
			{
				g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: Equip_Point =%d Fail", Equip_Point ) ;
				return PACKET_EXE_CONTINUE;
			}
				
			pEquipItem->SaveValueTo(SelfMsg.GetEquipData(Equip_Point));
			RetPart|=(1<<((INT)Equip_Point));
			SelfMsg.SetAskPart(RetPart);
			pGamePlayer->SendPacket( &SelfMsg ) ;
		}
		
		
		
		
		
	}
	else
	{
		Msg.setResult(USEEQUIP_TYPE_FAIL);
		Msg.setBagIndex(0);
		Msg.setEquipPoint(0);
		pGamePlayer->SendPacket( &Msg ) ;
		
	}
	
	

	
	

	g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: BagIndex=%d", BagIndex ) ;

	return PACKET_EXE_CONTINUE ;

	__LEAVE_FUNCTION

		return PACKET_EXE_ERROR ;
}
VOID Obj_Human::SendMsg_RefeshAttrib( VOID )
{
__ENTER_FUNCTION
	INT nAttr = 0;

	BOOL bPublicAttrModified, bEquipmentModified, bDetailAttrModified;
	bPublicAttrModified		= FALSE;
	bEquipmentModified		= FALSE;
	bDetailAttrModified		= FALSE;

	GCCharBaseAttrib msgPublicAttr;
	GCCharEquipment msgEquipment;
	GCDetailAttrib msgDetail;

	msgPublicAttr.setObjID( GetID() );
	msgDetail.SetObjID( GetID() );

	if ( m_AttrBackUp.m_bNameModified )
	{
		bPublicAttrModified = TRUE;
		msgPublicAttr.setName( GetName() );
		m_AttrBackUp.m_bNameModified = FALSE;
	}

	if ( m_AttrBackUp.m_bTitleModified )
	{
		bPublicAttrModified = TRUE;
		msgPublicAttr.setTitle( GetTitle() );
		msgPublicAttr.setTitleType( GetTitleType() );

		m_AttrBackUp.m_bTitleModified = FALSE;
	}

	if(m_AttrBackUp.m_MaxHp != GetMaxHP())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_MaxHp = GetMaxHP();

		BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0);
		msgPublicAttr.setHPPercent( yHPPercent );
		msgDetail.SetMAXHP( GetMaxHP() );
	}

	if(m_AttrBackUp.m_HP != GetHP())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_HP = GetHP();

		BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0);
		msgPublicAttr.setHPPercent( yHPPercent );
		msgDetail.SetHP( GetHP() );
	}


	if(m_AttrBackUp.m_MaxMp != GetMaxMP())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_MaxMp = GetMaxMP();

		BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0);
		msgPublicAttr.setMPPercent( yMPPercent );
		msgDetail.SetMAXMP( GetMaxMP() );
	}

	if(m_AttrBackUp.m_MP != GetMP())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_MP = GetMP();

		BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0);
		msgPublicAttr.setMPPercent( yMPPercent );
		msgDetail.SetMP( GetMP() );
	}



	if(m_AttrBackUp.m_nRage != GetRage())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nRage = GetRage();

		msgPublicAttr.setRage( GetRage() );
		msgDetail.SetRage( GetRage() );
	}

	if(fabs(m_AttrBackUp.m_MoveSpeed-GetMoveSpeed()) > 0.001f)
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_MoveSpeed = GetMoveSpeed();

		msgPublicAttr.setMoveSpeed( GetMoveSpeed() );
		msgDetail.SetMoveSpeed( GetMoveSpeed() );
	}

	const _CAMP_DATA *pCampData = GetCampData();
	if ( pCampData != NULL )
	{
		if(m_AttrBackUp.m_CampData != *pCampData)
		{
			bPublicAttrModified = TRUE;
			m_AttrBackUp.m_CampData = *pCampData;

			msgPublicAttr.setCampData( pCampData );
			msgDetail.SetCampData( pCampData );
		}
	}
	//if( m_AttrBackUp.m_nCampType != m_nCampType )
	//{
	//	bPublicAttrModified = TRUE;
	//	m_AttrBackUp.m_nCampType = m_nCampType;
	//	msgPublicAttr.setCampType( m_nCampType );
	//	msgDetail.SetCampType( m_nCampType );
	//}

	if(m_AttrBackUp.m_nOwnerID != GetOwnerID())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nOwnerID = GetOwnerID();

		msgPublicAttr.setOwnerID( GetOwnerID() );
		//msgDetail.SetOwnerID( GetOwnerID() );
	}

	if(m_AttrBackUp.m_guidCurrentPet != GetCurrentPetGUID())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_guidCurrentPet = GetCurrentPetGUID();

		msgDetail.SetCurrentPetGUID( GetCurrentPetGUID() );
	}

	if(m_AttrBackUp.m_RMBMoney != GetRMB())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_RMBMoney = GetRMB() ;

		msgDetail.SetRMB( GetRMB() ) ;
	}

	if(m_AttrBackUp.m_BankRMB != GetBankRMB())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_BankRMB = GetBankRMB() ;

		msgDetail.SetBankRMB( GetBankRMB() ) ;
	}

	if(m_AttrBackUp.m_DoubleExpTime_Num != GetDoubleExpTime_Num())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_DoubleExpTime_Num = GetDoubleExpTime_Num() ;

		msgDetail.SetDoubleExpTime_Num( GetDoubleExpTime_Num() ) ;
	}

	/*if(m_AttrBackUp.m_GmRight != GetGmRight())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_GmRight = GetGmRight() ;

		msgDetail.SetGmRight( GetGmRight() ) ;
	}*/

	if(m_AttrBackUp.m_nDataID != GetDataID())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nDataID = GetDataID();

		msgPublicAttr.setDataID( GetDataID() );
		msgDetail.SetDataID( GetDataID() );
	}
	
	if(m_AttrBackUp.m_nPortraitID != GetPortraitID())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nPortraitID = GetPortraitID();

		msgPublicAttr.setPortraitID( GetPortraitID() );
		msgDetail.SetPortraitID( GetPortraitID() );
	}
	
	if(m_AttrBackUp.m_nModelID != GetModelID())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nModelID = GetModelID();

		msgPublicAttr.setModelID( GetModelID() );
		msgDetail.SetModelID( GetModelID() );
	}
	
	if(m_AttrBackUp.m_nMountID != GetMountID())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nMountID = GetMountID();

		msgPublicAttr.setMountID( GetMountID() );
		msgDetail.SetMountID( GetMountID() );
	}

	if(m_AttrBackUp.m_uHairMeshID != __GetHairModel()
		|| m_AttrBackUp.m_uHairColor != __GetHairColor()
		|| m_AttrBackUp.m_uFaceMeshID != __GetFaceModel())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_uHairMeshID = __GetHairModel();
		m_AttrBackUp.m_uFaceMeshID = __GetFaceModel();
		m_AttrBackUp.m_uHairColor = __GetHairColor();

		msgPublicAttr.setFaceMeshID( __GetFaceModel() );
		msgPublicAttr.setHairMeshID( __GetHairModel() );
		msgPublicAttr.setHairMatrixID( __GetHairColor() );
	}

	if(m_AttrBackUp.m_nStealthLevel != GetStealthLevel())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nStealthLevel = GetStealthLevel();

		msgPublicAttr.setStealthLevel( GetStealthLevel() );
	}

	if(m_AttrBackUp.m_nMoodState != GetMoodState())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_nMoodState = GetMoodState();

		msgPublicAttr.setMoodState( GetMoodState() );
	}

	if(m_AttrBackUp.m_Level != GetLevel())
	{
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_Level = GetLevel();

		msgPublicAttr.setLevel( GetLevel() );
		msgDetail.SetLevel( GetLevel() );
	}

	if ( m_AttrBackUp.m_bStallIsOpen != m_StallBox.GetStallIsOpen() )
	{//摊位状态发生变化
		bPublicAttrModified = TRUE;
		m_AttrBackUp.m_bStallIsOpen = m_StallBox.GetStallIsOpen();

		msgPublicAttr.setIsOpen(m_AttrBackUp.m_bStallIsOpen);
	}

	if ( m_AttrBackUp.m_bStallNameChanged )
	{//摊位名发生变化
		m_AttrBackUp.m_bStallNameChanged = FALSE;
		if(m_StallBox.GetStallIsOpen())
		{
			bPublicAttrModified = TRUE;
			msgPublicAttr.setStallName( m_StallBox.GetStallName() );
		}
	}

	if(m_AttrBackUp.m_bLimitMove != IsLimitMove())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_bLimitMove = IsLimitMove();

		//msgPublicAttr.SetLimitMove( IsLimitMove() );
		//msgPublicAttrAndLevel.SetLimitMove( IsLimitMove() );
		//msgProtectedAttr.SetLimitMove( IsLimitMove() );
		msgDetail.SetLimitMove( IsLimitMove() );
	}

	if(m_AttrBackUp.m_bCanActionFlag1 != CanActionFlag1())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_bCanActionFlag1 = CanActionFlag1();

		msgDetail.SetCanActionFlag1(CanActionFlag1());
	}
	
	if(m_AttrBackUp.m_bCanActionFlag2 != CanActionFlag2())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_bCanActionFlag2 = CanActionFlag2();

		msgDetail.SetCanActionFlag2(CanActionFlag1());
	}

	if(m_AttrBackUp.m_Exp != GetExp())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_Exp = GetExp();

		msgDetail.SetExp( GetExp() );
	}

	if(m_AttrBackUp.m_Money != GetMoney())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_Money = GetMoney();

		msgDetail.SetMoney( GetMoney() );
	}

	if(m_AttrBackUp.m_RMBMoney != GetRMB())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_RMBMoney = GetRMB();

		msgDetail.SetRMB( GetRMB() );
	}

	if(m_AttrBackUp.m_nMenpai != GetMenPai())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nMenpai = GetMenPai();

		msgDetail.SetMenpai(GetMenPai());
	}

	if(m_AttrBackUp.m_GuildID != GetGuildID())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_GuildID = GetGuildID();

		msgDetail.SetGuild(GetGuildID());
	}

	if(m_AttrBackUp.m_nStr != GetStr())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nStr = GetStr();

		msgDetail.SetStr(GetStr());
	}

	if(m_AttrBackUp.m_nSpr != GetSpr())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nSpr = GetSpr();

		msgDetail.SetSpr(GetSpr());
	}

	if(m_AttrBackUp.m_nCon != GetCon())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nCon = GetCon();

		msgDetail.SetCon(GetCon());
	}

	if(m_AttrBackUp.m_nInt != GetInt())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nInt = GetInt();

		msgDetail.SetInt(GetInt());
	}

	if(m_AttrBackUp.m_nDex != GetDex())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDex = GetDex();

		msgDetail.SetDex(GetDex());
	}

	if(m_AttrBackUp.m_nPointRemain != Get_RemainPoints())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nPointRemain = Get_RemainPoints();

		msgDetail.SetPoint_Remain( Get_RemainPoints() );
	}

	if(m_AttrBackUp.m_nReHpSpeed != GetHPRegenerate())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nReHpSpeed = GetHPRegenerate();

		msgDetail.SetHP_ReSpeed( GetHPRegenerate() );
	}

	if(m_AttrBackUp.m_nReMpSpeed !=	GetMPRegenerate())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nReMpSpeed = GetMPRegenerate();

		msgDetail.SetMP_ReSpeed( GetMPRegenerate() );
	}

	nAttr = Attr_VerifyGeneralAttack(GetAttackPhysics());
	if(m_AttrBackUp.m_nAttPhysics != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttPhysics = nAttr;
		msgDetail.SetAtt_Physics(nAttr);
	}

	nAttr = Attr_VerifyGeneralAttack(GetAttackMagic());
	if(m_AttrBackUp.m_nAttMagic != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttMagic = nAttr;
		msgDetail.SetAtt_Magic(nAttr);
	}

	nAttr = Attr_VerifyDefence(GetDefencePhysics());
	if(m_AttrBackUp.m_nDefPhysics != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefPhysics = nAttr;
		msgDetail.SetDef_Physics(nAttr);
	}

	nAttr = Attr_VerifyDefence(GetDefenceMagic());
	if(m_AttrBackUp.m_nDefMagic != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefMagic = nAttr;
		msgDetail.SetDef_Magic(nAttr);
	}

	nAttr = Attr_VerifyHitMiss(GetHit());
	if(m_AttrBackUp.m_nHit != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nHit = nAttr;

		msgDetail.SetHit(nAttr);
	}

	nAttr = Attr_VerifyHitMiss(GetMiss());
	if(m_AttrBackUp.m_nMiss != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nMiss = nAttr;

		msgDetail.SetMiss(nAttr);
	}

	nAttr = Attr_VerifyCritical(GetCritical());
	if(m_AttrBackUp.m_nCritic != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nCritic = nAttr;

		msgDetail.SetCritic(nAttr);
	}

	if(m_AttrBackUp.m_nStrikePoint != GetStrikePoint())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nStrikePoint = GetStrikePoint();

		msgDetail.SetStrikePoint( GetStrikePoint() );
	}

	if(m_AttrBackUp.m_nAttSpeed != GetAttackSpeed())
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttSpeed = GetAttackSpeed();

		msgDetail.SetAttSpeed( GetAttackSpeed() );
	}

	nAttr = Attr_VerifyTraitAttack(GetAttackCold());
	if(m_AttrBackUp.m_nAttCold != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttCold = nAttr;

		msgDetail.SetAttCold(nAttr);
	}
	
	nAttr = Attr_VerifyResist(GetDefenceCold());
	if(m_AttrBackUp.m_nDefCold != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefCold = nAttr;

		msgDetail.SetDefCold(nAttr);
	}	

	nAttr = Attr_VerifyTraitAttack(GetAttackFire());
	if(m_AttrBackUp.m_nAttFire != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttFire = nAttr;

		msgDetail.SetAttFire(nAttr);
	}

	nAttr = Attr_VerifyResist(GetDefenceFire());
	if(m_AttrBackUp.m_nDefFire != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefFire = nAttr;

		msgDetail.SetDefFire(nAttr);
	}

	nAttr = Attr_VerifyTraitAttack(GetAttackLight());
	if(m_AttrBackUp.m_nAttLight != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttLight = nAttr;

		msgDetail.SetAttLight(nAttr);
	}
	
	nAttr = Attr_VerifyResist(GetDefenceLight());
	if(m_AttrBackUp.m_nDefLight != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefLight = nAttr;

		msgDetail.SetDefLight(nAttr);
	}

	nAttr = Attr_VerifyTraitAttack(GetAttackPoison());
	if(m_AttrBackUp.m_nAttPoison != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nAttPoison = nAttr;

		msgDetail.SetAttPoison(nAttr);
	}
	nAttr = Attr_VerifyResist(GetDefencePoison());
	if(m_AttrBackUp.m_nDefPoison != nAttr)
	{
		bDetailAttrModified = TRUE;
		m_AttrBackUp.m_nDefPoison = nAttr;

		msgDetail.SetDefPoison(nAttr);
	}

	// 装备刷新
	if ( m_AttrBackUp.m_bWeaponModified )
	{
		bEquipmentModified = TRUE;
		msgEquipment.setWeaponID( GetEquipID( HEQUIP_WEAPON ) );
		Item *pWeaponItem = GetEquipContain()->GetItem(HEQUIP_WEAPON);
		UINT uGemID = INVALID_ID;
		if(pWeaponItem != NULL)
		{
			uGemID = GetEquipmentMaxLevelGemID(pWeaponItem);
		}
		msgEquipment.setWeaponGemID(uGemID);
		m_AttrBackUp.m_bWeaponModified = FALSE;
	}

	if ( m_AttrBackUp.m_bCapModified )
	{
		bEquipmentModified = TRUE;
		msgEquipment.setCapID( GetEquipID( HEQUIP_CAP ) );
		Item *pCapItem = GetEquipContain()->GetItem(HEQUIP_CAP);
		UINT uGemID = INVALID_ID;
		if(pCapItem != NULL)
		{
			uGemID = GetEquipmentMaxLevelGemID(pCapItem);
		}
		msgEquipment.setCapGemID( uGemID );
		m_AttrBackUp.m_bCapModified = FALSE;
	}

	if ( m_AttrBackUp.m_bArmorModified )
	{
		bEquipmentModified = TRUE;
		msgEquipment.setArmourID( GetEquipID( HEQUIP_ARMOR ) );
		Item *pArmorItem = GetEquipContain()->GetItem(HEQUIP_ARMOR);
		UINT uGemID = INVALID_ID;
		if(pArmorItem != NULL)
		{
			uGemID = GetEquipmentMaxLevelGemID(pArmorItem);
		}
		msgEquipment.setArmourGemID( uGemID );
		m_AttrBackUp.m_bArmorModified = FALSE;
	}

	if ( m_AttrBackUp.m_bCuffModified )
	{
		bEquipmentModified = TRUE;
		msgEquipment.setCuffID( GetEquipID( HEQUIP_CUFF ) );
		Item *pCuffItem = GetEquipContain()->GetItem(HEQUIP_CUFF);
		UINT uGemID = INVALID_ID;
		if(pCuffItem != NULL)
		{
			uGemID = GetEquipmentMaxLevelGemID(pCuffItem);
		}
		msgEquipment.setCuffGemID( uGemID );
		m_AttrBackUp.m_bCuffModified = FALSE;
	}

	if ( m_AttrBackUp.m_bBootModified )
	{
		bEquipmentModified = TRUE;
		msgEquipment.setBootID( GetEquipID( HEQUIP_BOOT ) );
		Item *pBootItem = GetEquipContain()->GetItem(HEQUIP_BOOT);
		UINT uGemID = INVALID_ID;
		if(pBootItem != NULL)
		{
			uGemID = GetEquipmentMaxLevelGemID(pBootItem);
		}
		msgEquipment.setBootGemID( uGemID );
		m_AttrBackUp.m_bBootModified = FALSE;
	}

	if ( m_AttrBackUp.m_bSashModified )
	{
		bEquipmentModified = TRUE;
		//msgEquipment.setSashID( GetEquipID( HEQUIP_SASH ) );
		m_AttrBackUp.m_bSashModified = FALSE;
	}

	if ( bPublicAttrModified )
	{
		if ( bPublicAttrModified )
		{
			m_PublicAttrVersion++;
		}

		if ( bEquipmentModified )
		{
			m_EquipVer++;
		}

		HUMANLIST listHuman;
		getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) );

		BOOL bSendPublicMsg				= bPublicAttrModified;
		BYTE i;
		for ( i = 0; i < listHuman.m_Count; i++ )
		{
			Obj_Human *pTargetHuman = listHuman.m_aHuman[i];
			if ( IsCanViewMe( pTargetHuman ) )
			{
				pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr );

				if ( bEquipmentModified )
				{
					pTargetHuman->GetPlayer()->SendPacket( &msgEquipment );
				}
			}
		}
	}

	bDetailAttrModified |= bPublicAttrModified;
	if ( bDetailAttrModified )
	{
		GetPlayer()->SendPacket(&msgDetail); //发送给自己的详细消息
	}
__LEAVE_FUNCTION
}