Exemplo n.º 1
0
uint CGModifySettingHandler::Execute( CGModifySetting* 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 ) ;


	pHuman->GetDB()->SetSettingData( pPacket->GetType(), pPacket->GetValue() ) ;

	if ( (SETTING_TYPE)pPacket->GetType() == SETTING_TYPE_GAME )
	{
		GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
		GW_RELATION* pRelation = pMsg->GetRelation();
		pRelation->CleanUp();
		pRelation->m_Type = REQ_MODIFYSETTINGS;
		pRelation->SetGUID( pHuman->GetGUID() );
		pRelation->m_Settings.SetSettings( pPacket->GetValue()->m_SettingData & 0xffff );

		g_pServerManager->SendPacket( pMsg, INVALID_ID );
	}

	g_pLog->FastSaveLog( LOG_FILE_1, "CGModifySettingHandler::SOCKET=%d Type=%d Value_Type=%d Value_Data=%d OK!",
		pPlayer->GetSocket()->getSOCKET(),
		pPacket->GetType(),
		pPacket->GetValue()->m_SettingType,
		pPacket->GetValue()->m_SettingData ) ;

	return PACKET_EXE_CONTINUE ;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR ;
}
Exemplo n.º 2
0
uint CGRelationHandler::Execute( CGRelation* 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 );

	CG_RELATION* pRelationPacket = pPacket->GetRelation();
	GCRelation Msg;
	Msg.GetRelation()->CleanUp();
	INT nErr = 0;

	switch( pRelationPacket->m_Type )
	{
	case REQ_RELATIONLIST:
		{
			GC_RELATIONLIST& RelationList = Msg.GetRelation()->m_RelationList;

			RelationList.CleanUp();

			pHuman->GetHumanRelation()->FillRelationList(RelationList);
			Msg.GetRelation()->m_Type = RET_RELATIONLIST;

			RelationList.SetMood( pHuman->GetHumanRelation()->GetMood() );

			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X get relation list.",
				pHuman->GetGUID() );

			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);

			GW_RELATION* pRelation = pMsg->GetRelation();
			pRelation->CleanUp();
			pRelation->m_Type = REQ_RELATIONONLINE;
			pRelation->SetGUID( pHuman->GetGUID() );

			g_pServerManager->SendPacket( pMsg, INVALID_ID );
			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X inform online message.",
				pHuman->GetGUID() );
		}
		break;
	case REQ_RELATIONINFO:
		{ // 直接发给 World
			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			GW_RELATION* pRelation = pMsg->GetRelation();
			pRelation->CleanUp();
			pRelation->m_Type = REQ_RELATIONINFO;
			pRelation->SetGUID( pHuman->GetGUID() );
			pRelation->m_RequestInfo.CleanUp();
			pRelation->m_RequestInfo.SetTargetGUID(pRelationPacket->m_RequestInfo.GetTargetGUID());

			if( pRelationPacket->m_RequestInfo.m_uNameSize > 0 )
			{
				pRelation->m_RequestInfo.SetTargetName(pRelationPacket->m_RequestInfo.GetTargetName());
			}

			g_pServerManager->SendPacket( pMsg, INVALID_ID );
			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X get relation infomation of GUID=%X.",
				pHuman->GetGUID(), pRelationPacket->m_RequestInfo.GetTargetGUID() );

			return PACKET_EXE_CONTINUE;
		}
		break;
	case REQ_REJECTADDFRIEND:
		{ //拒绝好友邀请信息,直接传给world
			REQUEST_ADD_RELATION_WITH_GROUP* pMyFriend = &(pRelationPacket->m_AddRelationWithGroup);

			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			GW_RELATION* pRelation = pMsg->GetRelation();
			pRelation->CleanUp();
			pRelation->m_Type = REQ_REJECTADDFRIEND;
			pRelation->SetGUID( pHuman->GetGUID() );
			REQUEST_ADD_RELATION_WITH_GROUP& Relation = pRelation->m_AddRelationWithGroup;
			Relation.CleanUp();
			Relation.SetTargetGUID( pMyFriend->GetTargetGUID() );
			Relation.SetTargetName( pMyFriend->GetTargetName() );
			Relation.SetRelationType( pMyFriend->GetRelationType() );
			Relation.SetGroup( pMyFriend->GetGroup() );	
			
			g_pServerManager->SendPacket( pMsg, INVALID_ID );
			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Name=%s reject add friend.",
				pHuman->GetName(), pMyFriend->GetTargetName() );

			return PACKET_EXE_CONTINUE;
		}
		break;
	case REQ_VIEWPLAYER:
		{
			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			GW_RELATION* pSend = pMsg->GetRelation();
			pSend->CleanUp();
			pSend->m_Type = REQ_VIEWPLAYER;
			pSend->SetGUID( pHuman->GetGUID() );
			pSend->m_ViewPlayer.CleanUp();
			pSend->m_ViewPlayer.SetTargetName(pRelationPacket->m_ViewPlayer.GetTargetName());

			g_pServerManager->SendPacket( pMsg, INVALID_ID );
			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X View Player: %s.",
				pHuman->GetGUID(), pRelationPacket->m_ViewPlayer.GetTargetName() );

			return PACKET_EXE_CONTINUE;
		}
		break;
	case REQ_ADDFRIEND:
	//case REQ_TEMPFRIEND_TO_FRIEND:
		{
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			REQUEST_ADD_RELATION_WITH_GROUP* pMyFriend = &(pRelationPacket->m_AddRelationWithGroup);
	
			if( pMyFriend->GetTargetGUID() == INVALID_ID )
			{
				if( strlen(pMyFriend->GetTargetName()) < 1 )
				{
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add a friend without GUID and name.",
						pHuman->GetName() );
					return PACKET_EXE_CONTINUE;
				}
				else if( strcmp(pMyFriend->GetTargetName(), pHuman->GetName()) == 0 )
				{
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self as a friend.",
						pHuman->GetName() );
					return PACKET_EXE_CONTINUE;
				}

			}
			else if( pMyFriend->GetTargetGUID() == pHuman->GetGUID() )
			{
				g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self as a friend.",
					pHuman->GetName() );
				return PACKET_EXE_CONTINUE;
			}

			RELATION_GROUP grp = (RELATION_GROUP)pMyFriend->GetGroup();
			switch( grp )
			{ // 只能是以下分组
			case RELATION_GROUP_FRIEND_ALL:
			case RELATION_GROUP_F1:
			case RELATION_GROUP_F2:
			case RELATION_GROUP_F3:
			case RELATION_GROUP_F4:
			case RELATION_GROUP_F5:
				break;
			default:
				AssertEx( FALSE, "Invalid Friend Group.");
				return PACKET_EXE_CONTINUE;
			}

			// 看看是否还有空位
			if( pMyRelation->IsGroupFull( grp ) )
			{ // 没有空位了
				nErr = RET_ERR_FRIENDGROUPISFULL;
				break;
			}

			// 看看目前关系表中已经有该玩家(不管是朋友还是黑名单)
			RELATION_TYPE RelationType;


			if ( pMyFriend->GetTargetGUID() == INVALID_ID )
			{
				const _OWN_RELATION* mRel = pMyRelation->GetRelationInfo( pMyFriend->GetTargetName() ); 
				
				//如果在关系列表中没有找到,那可能是第一次加为好友
				if ( NULL == mRel )
				{
					RelationType = RELATION_TYPE_STRANGER;
				}
				else
				{
					RelationType = pMyRelation->GetRelationType( mRel->m_Member.m_MemberGUID );
				}
			}
			else
			{
				RelationType = pMyRelation->GetRelationType( pMyFriend->GetTargetGUID() );
			}

			
			switch( RelationType )
			{
			case RELATION_TYPE_FRIEND:
				nErr = RET_ERR_ISFRIEND;
				break;
			case RELATION_TYPE_BLACKNAME:
				//nErr = RET_ERR_ISBLACKNAME;
				return PACKET_EXE_CONTINUE;
				//在这需要判断被邀请的玩家是否在自己的黑名单中,如果在自己的黑名单中,直接移动好友列表中,不需要对方做任何的验证
				//这是一个正确的移动组的过程,现在不需要调用,以后可能用的到
				/*{
					GUID_t TargetGUID;
					if ( pMyFriend->GetTargetGUID() == INVALID_ID )
					{
						const _OWN_RELATION* mRelation = pMyRelation->GetRelationInfo( pMyFriend->GetTargetName() ); 
						TargetGUID = mRelation->m_Member.m_MemberGUID;
					}
					else
					{
						TargetGUID = pMyFriend->GetTargetGUID();
					}
					
					// 用转换
					if( pMyRelation->RelationTransition( RELATION_TYPE_FRIEND, TargetGUID ) != TRUE )
					{
						nErr = RET_ERR_RELATIONUNKNOWN;
					}
					else
					{
						Msg.GetRelation()->m_Type = RET_TRANSITION;
						Msg.GetRelation()->m_RelationGUIDUCHARUCHAR.CleanUp();
						Msg.GetRelation()->m_RelationGUIDUCHARUCHAR.SetTargetGUID( TargetGUID );
						Msg.GetRelation()->m_RelationGUIDUCHARUCHAR.SetRelationType( RELATION_TYPE_FRIEND );
						Msg.GetRelation()->m_RelationGUIDUCHARUCHAR.SetGroup( RELATION_GROUP_FRIEND_ALL );

						GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
						GW_RELATION* pRelation = pMsg->GetRelation();
						pRelation->CleanUp();
						pRelation->m_Type = REQ_TRANSITION;
						pRelation->SetGUID( pHuman->GetGUID() );
						RELATION_GUID_UCHAR& Relation = pRelation->m_TransitionRelation;
						Relation.CleanUp();
						Relation.SetTargetGUID( TargetGUID );
						Relation.SetRelationType( RELATION_GROUP_BLACK );

						g_pServerManager->SendPacket( pMsg, INVALID_ID );
						
					}
				}*/
				break;

			case RELATION_TYPE_ENEMY:
			case RELATION_TYPE_STRANGER:
				{ // 正确关系
					GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);

					GW_RELATION* pRelation = pMsg->GetRelation();
					pRelation->CleanUp();
					pRelation->m_Type = pRelationPacket->m_Type;
					pRelation->SetGUID( pHuman->GetGUID() );
					REQUEST_ADD_RELATION_WITH_GROUP& Relation = pRelation->m_AddRelationWithGroup;
					Relation.CleanUp();
					Relation.SetTargetGUID( pMyFriend->GetTargetGUID() );
					Relation.SetTargetName( pMyFriend->GetTargetName() );
					Relation.SetRelationType( pMyFriend->GetRelationType() );
					Relation.SetGroup( pMyFriend->GetGroup() );

					g_pServerManager->SendPacket( pMsg, INVALID_ID );
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Name=%s as a new friend.",
						pHuman->GetName(), pMyFriend->GetTargetName() );

					return PACKET_EXE_CONTINUE;
				}
				break;
			default:
				nErr = RET_ERR_RELATIONUNKNOWN;
				Assert(FALSE);
				break;
			}
		}
		break;
	//case REQ_ADDTOBLACKLIST:
	//case REQ_TEMPFRIEND_ADDTO_BLACKLIST:
	//	{
			//HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			//REQUEST_ADD_RELATION* pNewBlackName = &(pRelationPacket->m_AddRelation);

			//if( pNewBlackName->GetTargetGUID() == INVALID_ID )
			//{
			//	if( strlen(pNewBlackName->GetTargetName()) < 1 )
			//	{
			//		g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add a blackname without GUID and name.",
			//			pHuman->GetName() );
			//		return PACKET_EXE_CONTINUE;
			//	}
			//	else if( strcmp(pNewBlackName->GetTargetName(), pHuman->GetName()) == 0 )
			//	{
			//		g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self into blacklist.",
			//			pHuman->GetName() );
			//		return PACKET_EXE_CONTINUE;
			//	}

			//}
			//else if( pNewBlackName->GetTargetGUID() == pHuman->GetGUID() )
			//{
			//	g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self into blacklist.",
			//		pHuman->GetName() );
			//	return PACKET_EXE_CONTINUE;
			//}

			//// 看看黑名单内是否还有空位
			//if( pMyRelation->IsGroupFull( RELATION_GROUP_BLACK ) )
			//{ // 没有空位了
			//	nErr = RET_ERR_BLACKGROUPISFULL;
			//	break;
			//}


			//// 看看目前关系表中已经有该玩家(不管是朋友还是黑名单)
			//RELATION_TYPE RelationType;

			//if( pNewBlackName->GetTargetGUID() != INVALID_ID )
			//{
			//	RelationType = pMyRelation->GetRelationType( pNewBlackName->GetTargetGUID() );
			//}
			//else
			//{
			//	RelationType = RELATION_TYPE_STRANGER;
			//}

			//switch( RelationType )
			//{
			//case RELATION_TYPE_BLACKNAME:
			//	nErr = RET_ERR_ISBLACKNAME;
			//	break;
			//case RELATION_TYPE_MARRY:
			//	nErr = RET_ERR_SPOUSETOBLACKLIST;
			//	break;
			//case RELATION_TYPE_MASTER:
			//	nErr = RET_ERR_MASTERTOBLACKLIST;
			//	break;
			//case RELATION_TYPE_PRENTICE:
			//	nErr = RET_ERR_PRENTICETOBLACKLIST;
			//	break;
			//case RELATION_TYPE_BROTHER:
			//	nErr = RET_ERR_BROTHERTOBLACKLIST;
			//	break;
			//case RELATION_TYPE_FRIEND:
			//	{ // 用转换
			//		if( pMyRelation->RelationTransition( RELATION_TYPE_BLACKNAME, pNewBlackName->GetTargetGUID() ) != TRUE )
			//		{
			//			nErr = RET_ERR_RELATIONUNKNOWN;
			//		}
			//		else
			//		{
			//			Msg.GetRelation()->m_Type = RET_TRANSITION;

			//			RELATION_GUID_UCHAR_UCHAR& RelationInfo = Msg.GetRelation()->m_RelationGUIDUCHARUCHAR;
			//			RelationInfo.CleanUp();
			//			RelationInfo.SetTargetGUID( pNewBlackName->GetTargetGUID() );
			//			RelationInfo.SetRelationType( RELATION_TYPE_BLACKNAME );
			//			RelationInfo.SetGroup( RELATION_GROUP_BLACK );

			//			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add GUID=%X to black list.",
			//				pHuman->GetName(), pNewBlackName->GetTargetGUID() );
			//		}
			//	}
			//	break;
			//case RELATION_TYPE_STRANGER:
			//	{ // 正确关系
			//		GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			//		GW_RELATION* pRelation = pMsg->GetRelation();
			//		pRelation->CleanUp();
			//		pRelation->m_Type = pRelationPacket->m_Type;
			//		pRelation->SetGUID( pHuman->GetGUID() );
			//		REQUEST_ADD_RELATION& Relation = pRelation->m_AddRelation;
			//		Relation.CleanUp();
			//		Relation.SetTargetGUID( pNewBlackName->GetTargetGUID() );
			//		Relation.SetTargetName( pNewBlackName->GetTargetName() );
			//		Relation.SetRelationType( pNewBlackName->GetRelationType() );

			//		g_pServerManager->SendPacket( pMsg, INVALID_ID );
			//		g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Name=%s to black list.",
			//			pHuman->GetName(), pNewBlackName->GetTargetName() );

			//		return PACKET_EXE_CONTINUE;
			//	}
			//	break;
			//default:
			//	nErr = RET_ERR_RELATIONUNKNOWN;
			//	Assert(FALSE);
			//	break;
			//}
		//}
		//break;
	case REQ_ADDTOENEMY:
		{
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			REQUEST_ADD_RELATION* pNewEnemyName = &(pRelationPacket->m_AddRelation);

			if( pNewEnemyName->GetTargetGUID() == INVALID_ID )
			{
				if( strlen(pNewEnemyName->GetTargetName()) < 1 )
				{
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add a enemyname without GUID and name.",
						pHuman->GetName() );
					return PACKET_EXE_CONTINUE;
				}
				else if( strcmp(pNewEnemyName->GetTargetName(), pHuman->GetName()) == 0 )
				{
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self into enemylist.",
						pHuman->GetName() );
					return PACKET_EXE_CONTINUE;
				}

			}
			else if( pNewEnemyName->GetTargetGUID() == pHuman->GetGUID() )
			{
				g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self into enemylist.",
					pHuman->GetName() );
				return PACKET_EXE_CONTINUE;
			}

			// 看看目前关系表中已经有该玩家(不管是朋友还是黑名单)
			RELATION_TYPE RelationType;

			if ( pNewEnemyName->GetTargetGUID() == INVALID_ID )
			{
				const _OWN_RELATION* mRel = pMyRelation->GetRelationInfo( pNewEnemyName->GetTargetName() ); 

				//如果在关系列表中没有找到,那可能是第一次加为好友
				if ( NULL == mRel )
				{
					RelationType = RELATION_TYPE_STRANGER;
				}
				else
				{
					RelationType = pMyRelation->GetRelationType( mRel->m_Member.m_MemberGUID );
				}
			}
			else
			{
				RelationType = pMyRelation->GetRelationType( pNewEnemyName->GetTargetGUID() );
			}


			switch( RelationType )
			{
			case RELATION_TYPE_ENEMY:// 如果已经是仇人,则不做任何操作
				{
					return PACKET_EXE_CONTINUE;
				}
				break;
			case RELATION_TYPE_BLACKNAME:
			case RELATION_TYPE_MARRY:
			case RELATION_TYPE_MASTER:
			case RELATION_TYPE_PRENTICE:
			case RELATION_TYPE_BROTHER:
			case RELATION_TYPE_FRIEND:
				//以现在的策划案,仇人组与所有组都不冲突,所以加入仇人的时候只是加入,而不是移动
				//{ // 用转换
				//	if( pMyRelation->RelationTransition( RELATION_TYPE_ENEMY, pNewEnemyName->GetTargetGUID() ) != TRUE )
				//	{
				//		nErr = RET_ERR_RELATIONUNKNOWN;
				//	}
				//	else
				//	{
				//		Msg.GetRelation()->m_Type = RET_TRANSITION;

				//		RELATION_GUID_UCHAR_UCHAR& RelationInfo = Msg.GetRelation()->m_RelationGUIDUCHARUCHAR;
				//		RelationInfo.CleanUp();
				//		RelationInfo.SetTargetGUID( pNewEnemyName->GetTargetGUID() );
				//		RelationInfo.SetRelationType( RELATION_TYPE_ENEMY );
				//		RelationInfo.SetGroup( RELATION_GROUP_BLACK );

				//		g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add GUID=%X to black list.",
				//			pHuman->GetName(), pNewEnemyName->GetTargetGUID() );
				//	}
				//}
				//break;
			case RELATION_TYPE_STRANGER:
				{ // 正确关系
					GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
					GW_RELATION* pRelation = pMsg->GetRelation();
					pRelation->CleanUp();
					pRelation->m_Type = pRelationPacket->m_Type;
					pRelation->SetGUID( pHuman->GetGUID() );
					REQUEST_ADD_RELATION& Relation = pRelation->m_AddRelation;
					Relation.CleanUp();
					Relation.SetTargetGUID( pNewEnemyName->GetTargetGUID() );
					Relation.SetTargetName( pNewEnemyName->GetTargetName() );
					Relation.SetRelationType( pNewEnemyName->GetRelationType() );

					g_pServerManager->SendPacket( pMsg, INVALID_ID );
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Name=%s to black list.",
						pHuman->GetName(), pNewEnemyName->GetTargetName() );

					return PACKET_EXE_CONTINUE;
				}
				break;
			default:
				nErr = RET_ERR_RELATIONUNKNOWN;
				Assert(FALSE);
				break;
			}
		}

		break;
	case REQ_TRANSITION:
		{
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			RELATION_GUID_UCHAR_UCHAR* pTrans = &(pRelationPacket->m_RelationGUIDUCHARUCHAR);
			GUID_t guid = pTrans->GetTargetGUID();

			// 先判断是否好友的各个组之间的转换
			RELATION_TYPE oldRelationType = pMyRelation->GetRelationType( guid );

			if( pMyRelation->IsFriend( guid )
			 && oldRelationType == (RELATION_TYPE)pTrans->GetRelationType()
			 ) // 好友换组,包括配偶,师徒,结拜兄弟等等
			{
				RELATION_GROUP grp = (RELATION_GROUP)pTrans->GetGroup();
				switch( grp )
				{ // 只能是以下分组
				case RELATION_GROUP_FRIEND_ALL:
				case RELATION_GROUP_F1:
				case RELATION_GROUP_F2:
				case RELATION_GROUP_F3:
				case RELATION_GROUP_F4:
				case RELATION_GROUP_F5:
					break;
				default:
					AssertEx( FALSE, "Invalid Friend Group.");
					return PACKET_EXE_CONTINUE;
				}

				// 看看是否还有空位
				if( pMyRelation->IsGroupFull( grp ) )
				{ // 没有空位了
					nErr = RET_ERR_FRIENDGROUPISFULL;
				}
				else
				{
					pMyRelation->SetFriendGroup( guid, grp );

					Msg.GetRelation()->m_Type = RET_TRANSITION;
					Msg.GetRelation()->m_RelationGUIDUCHARUCHAR = *pTrans;

					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X transition GUID=%X to friend group %d.",
						pHuman->GetGUID(), guid, grp );
				}
			}
			else
			{ // 其他的转换情况
				
				//如果是向黑名单组转换情况,则也需要对黑名单是否满员进行验证
				//如果向黑名单转换情况,还需要添加两个验证
				if( (RELATION_TYPE)pTrans->GetRelationType() == RELATION_TYPE_BLACKNAME )
				{
					// 看看是否还有空位
					if( pMyRelation->IsGroupFull( RELATION_GROUP_BLACK ) )
					{ // 没有空位了
						nErr = RET_ERR_BLACKGROUPISFULL;
						break;
					}

					// 看看对方是不是我的好友,如果不是,不能添加到黑名单中
					if ( !pMyRelation->IsFriend( guid ) )
					{
						nErr = RET_ERR_ISNOTFRIEND;
						break;
					}

					// 看看对方是否已经在黑名单里了
					if ( pMyRelation->IsBlackName( guid ) )
					{
						nErr = RET_ERR_ISBLACKNAME;
						break;
					}
				}
				//如果是从黑名单向好友转换情况
				else if ( (RELATION_TYPE)pTrans->GetRelationType() == RELATION_TYPE_FRIEND )
				{
					// 看看好友组是否还有空位
					if( pMyRelation->IsGroupFull( RELATION_GROUP_FRIEND_ALL ) )
					{ 
						nErr = RET_ERR_FRIENDGROUPISFULL;
						break;
					}

					// 看看对方是不是在我的黑名单中,如果不是,不能添加到好友列表中
					if ( !pMyRelation->IsBlackName( guid ) )
					{
						nErr = RET_ERR_ISNOTINBLACKLIST;
						break;
					}

					// 看看对方是否已经在黑名单里了
					if ( pMyRelation->IsFriend( guid ) )
					{
						nErr = RET_ERR_ISBLACKNAME;
						break;
					}
				}

				if( pMyRelation->CanTransition( oldRelationType, (RELATION_TYPE)pTrans->GetRelationType() ) != TRUE )
				{
					nErr = RET_ERR_CANNOTTRANSITION;
				}
				else if( pMyRelation->RelationTransition((RELATION_TYPE)pTrans->GetRelationType(), guid) != TRUE )	
				{
					nErr = RET_ERR_RELATIONUNKNOWN;
				}
				else
				{
					Msg.GetRelation()->m_Type = RET_TRANSITION;
					Msg.GetRelation()->m_RelationGUIDUCHARUCHAR = *pTrans;

					GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
					GW_RELATION* pRelation = pMsg->GetRelation();
					pRelation->CleanUp();
					pRelation->m_Type = pRelationPacket->m_Type;
					pRelation->SetGUID( pHuman->GetGUID() );
					RELATION_GUID_UCHAR& Relation = pRelation->m_TransitionRelation;
					Relation.CleanUp();
					Relation.SetTargetGUID( guid );
					Relation.SetRelationType( pTrans->GetRelationType() );

					g_pServerManager->SendPacket( pMsg, INVALID_ID );

					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X transition GUID=%X from %d to %d.",
						pHuman->GetGUID(), guid, oldRelationType, pTrans->GetRelationType() );
				}
			}
		}
		break;
	case REQ_DELFRIEND:
		{
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			GUID_t guid = pRelationPacket->m_DelFriend.GetGUID();
			const CHAR* name = pRelationPacket->m_DelFriend.GetName();

			// 看是否有这么个朋友
			RELATION_TYPE RelationType = pMyRelation->GetRelationType( guid );

			switch( RelationType )
			{
				// 暂时还没有这些关系,暂时不用对这些关系进行验证,但是以后有这些关系之后,在这就有可能进行验证,代码还是有用的。
			//case RELATION_TYPE_MARRY:
			//	nErr = RET_ERR_DELSPOUSE;
			//	break;
			//case RELATION_TYPE_MASTER:
			//	nErr = RET_ERR_DELMASTER;
			//	break;
			//case RELATION_TYPE_PRENTICE:
			//	nErr = RET_ERR_DELPRENTICE;
			//	break;
			//case RELATION_TYPE_BROTHER:
			//	nErr = RET_ERR_DELBROTHER;
			//	break;
			case RELATION_TYPE_FRIEND: // 正常情况
				break;
			default:
				nErr = RET_ERR_ISNOTFRIEND;
				break;
			}

			if ( nErr )
			{ // 如果有问题,马上退出
				break;
			}

			// 玩家对被删除好友的好友度
			//INT nMyPoint = pMyRelation->GetFriendPoint( guid );

			// 如果被删除的人不在线在这就不好处理了
			// 不在线的话就无法找到Obj_Human
			/*Obj_Human* pTargetHuman = (Obj_Human*)(g_pGUIDManager->Get( guid ));
				Assert( pTargetHuman );

			HumanRelation* pTargetRelation = pTargetHuman->GetHumanRelation();
				Assert( pTargetRelation );*/
				
			// 被删除好友对玩家的好友度
			//INT nTargetPoint = pTargetRelation->GetFriendPoint( pHuman->GetGUID() );

			if( pMyRelation->GetRelationInfo( guid )->m_FriendPoint >= g_Config.m_ConfigInfo.m_nPasswdPoint
			 && (pHuman->__IsPasswordSetup() && pHuman->__IsPasswordUnlock() != TRUE)
			 )
			{ // 看是否需要对比二级密码
				nErr = RET_ERR_PASSWDMISMATCH;
			}
			else if( pMyRelation->DelRelation( RELATION_TYPE_FRIEND, guid ) != TRUE )
			{ // 删掉它
				nErr = RET_ERR_RELATIONUNKNOWN;
			}
			else
			{
				Msg.GetRelation()->m_Type = RET_DELFRIEND;
				Msg.GetRelation()->m_RelationGUID.CleanUp();
				Msg.GetRelation()->m_RelationGUID.SetTargetGUID( guid );

				

				// 在这里向word发送的是删除好友信息
				{
					GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
					GW_RELATION* pRelation = pMsg->GetRelation();
					pRelation->CleanUp();
					pRelation->m_Type = pRelationPacket->m_Type;
					pRelation->SetGUID( pHuman->GetGUID() );
					REQUEST_DEL_FRIEND& Relation = pRelation->m_DelFriend;
					Relation.CleanUp();
					Relation.SetGUID( guid );
					Relation.SetName( name );

					g_pServerManager->SendPacket( pMsg, INVALID_ID );

					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X del GUID=%X from friend list.",
						pHuman->GetGUID(), guid );
				}
			}
		}
		break;
	//case REQ_DELFROMBLACKLIST:
	//	{
			//HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			//GUID_t guid = pRelationPacket->m_RelationGUID.GetTargetGUID();

			//// 看是否存在于黑名单
			//if( pMyRelation->HaveRelation( RELATION_TYPE_BLACKNAME, guid ) != TRUE )
			//{
			//	nErr = RET_ERR_ISNOTINBLACKLIST;
			//}
			//else if( pMyRelation->DelRelation( RELATION_TYPE_BLACKNAME, guid ) != TRUE )
			//{ // 删掉它
			//	nErr = RET_ERR_RELATIONUNKNOWN;
			//}
			//else
			//{
			//	Msg.GetRelation()->m_Type = RET_DELFROMBLACKLIST;
			//	Msg.GetRelation()->m_RelationGUID.CleanUp();
			//	Msg.GetRelation()->m_RelationGUID.SetTargetGUID( guid );

			//	GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			//	GW_RELATION* pRelation = pMsg->GetRelation();
			//	pRelation->CleanUp();
			//	pRelation->m_Type = pRelationPacket->m_Type;
			//	pRelation->SetGUID( pHuman->GetGUID() );
			//	RELATION_GUID& Relation = pRelation->m_RelationGUID;
			//	Relation.CleanUp();
			//	Relation.SetTargetGUID( guid );

			//	g_pServerManager->SendPacket( pMsg, INVALID_ID );

			//	g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X del GUID=%X from black list.",
			//		pHuman->GetGUID(), guid );
			//}
	//	}
	//	break;
	case REQ_DELFROMENEMY:
		{
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			GUID_t guid = pRelationPacket->m_RelationGUID.GetTargetGUID();

			// 看看是否存在于仇人列表里
			if ( pMyRelation->HaveRelation( RELATION_TYPE_ENEMY, guid )!= TRUE )
			{
				// 如果没有在仇人列表中,直接返回,不做任何操作
				return PACKET_EXE_CONTINUE;
			}
			else if ( pMyRelation->DelRelation( RELATION_TYPE_ENEMY, guid )!=TRUE )
			{	
				// 把server端的玩家数据删除
				nErr = RET_ERR_RELATIONUNKNOWN;
			}
			else
			{
				Msg.GetRelation()->m_Type = RET_DELFROMENEMY;
				Msg.GetRelation()->m_RelationGUID.CleanUp();
				Msg.GetRelation()->m_RelationGUID.SetTargetGUID( guid );

				GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
				GW_RELATION* pRelation = pMsg->GetRelation();
				pRelation->CleanUp();
				pRelation->m_Type = pRelationPacket->m_Type;
				pRelation->SetGUID( pHuman->GetGUID() );
				RELATION_GUID& Relation = pRelation->m_RelationGUID;
				Relation.CleanUp();
				Relation.SetTargetGUID( guid );
				g_pServerManager->SendPacket( pMsg, INVALID_ID );

				g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X del GUID=%X from enemy list.",
					pHuman->GetGUID(), guid );
			}
		}
		break;
	case REQ_MODIFYMOOD:
		{
			pHuman->GetHumanRelation()->SetMood( pRelationPacket->m_ModifyMood.GetMood() );
			Msg.GetRelation()->m_Type = RET_NEWMOOD;
			Msg.GetRelation()->m_NewMood.SetMood( pHuman->GetHumanRelation()->GetMood() );

			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			GW_RELATION* pRelation = pMsg->GetRelation();
			pRelation->CleanUp();
			pRelation->m_Type = pRelationPacket->m_Type;
			pRelation->SetGUID( pHuman->GetGUID() );
			REQUEST_MODIFY_MOOD& Relation = pRelation->m_ModifyMood;
			Relation.CleanUp();
			Relation.SetMood( pHuman->GetHumanRelation()->GetMood() );

            //ModifyBy Amos   称号系统已修改,这里的功能不明先注释了,有问题找我
			//如果当前显示的心情被置为称号,那么同事更新当前称号 Add by hongyu ,如果有不合适,请找我
			//if( pHuman->GetTitleType() == _TITLE::MOOD_TITLE )
			//{
			//	pHuman->SetTitleType(_TITLE::MOOD_TITLE);
			//	pHuman->SetTitle(pHuman->GetHumanRelation()->GetMood());
			//}

			g_pServerManager->SendPacket( pMsg, INVALID_ID );
			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: %s modify mood.", pHuman->GetName() );
		}
		break;
	case REQ_NOTIFY_ADDTEMPFRIEND:
		{
			GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);
			GW_RELATION* pRelation = pMsg->GetRelation();
			pRelation->CleanUp();
			pRelation->m_Type = pRelationPacket->m_Type;
			pRelation->SetGUID( pHuman->GetGUID() );
			REQUEST_VIEW_PLAYER& Relation = pRelation->m_ViewPlayer;
			Relation.CleanUp();
			Relation.SetTargetName( pRelationPacket->m_ViewPlayer.GetTargetName() );

			g_pServerManager->SendPacket( pMsg, INVALID_ID );

			g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X add Name=%s from black list.",
				pHuman->GetGUID(), Relation.GetTargetName() );
		}
		break;
	//case REQ_ADD_NEW_GROUP:
	//	{
			//REQUEST_ADD_NEW_GROUP& NewGroup = pRelationPacket->m_AddNewGroup;
			//int len = (int)strlen( NewGroup.GetGroupName() );
			//if ( len <= 0 )
			//{
			//	g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GroupName is NULL .",
			//		pRelationPacket->m_AddNewGroup.GetGroupName() );
			//	return PACKET_EXE_CONTINUE;			
			//}

			//const _RELATION_DB_LOAD     *pRelation = pHuman->GetDB()->GetRelationDB();

			////检查玩家自定义组情况
			//int i=0;
			//for( i=0;i<RELATION_GROUP_F5;i++)
			//{
			//	int len = (int)strlen(pRelation->m_szName[i] );
			//	if ( len > 0 )
			//	{
			//		//判断是否同名
			//		if ( strcmp(pRelation->m_szName[i],NewGroup.GetGroupName()) == 0 )
			//		{
			//			//Assert( FALSE && "组同名,不能新建" );
			//			return PACKET_EXE_CONTINUE;						
			//		}

			//		continue;
			//	}

			//	//更新玩家组名,组ID
			//	pHuman->GetDB()->SetName(i,NewGroup.GetGroupName());
			//	NewGroup.m_uGroupID = i + RELATION_GROUP_F1;
			//	g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Group=%s .",
			//		pHuman->GetName(),NewGroup.GetGroupName() );

			//	//返回玩家消息
			//	GCRelation Msg;
			//	Msg.GetRelation()->CleanUp();
			//	Msg.GetRelation()->m_Type = RET_NEW_GROUP;
			//	Msg.GetRelation()->m_AddNewGroup.m_uGroupID = NewGroup.m_uGroupID;
			//	Msg.GetRelation()->m_AddNewGroup.SetGroupName(NewGroup.GetGroupName());

			//	pGamePlayer->SendPacket( &Msg );

			//	g_pLog->FastSaveLog( LOG_FILE_1, "WGRelationHandler: Name=%s add New Group=%s .",
			//		pHuman->GetName(),NewGroup.GetGroupName());

			//	return PACKET_EXE_CONTINUE;

			//}

			//if ( i >= RELATION_GROUP_F5 )
			//{
			//	Log::SaveLog( WORLD_LOGFILE, "GWRelationHandler...User Add New Group=%s  failed!",
			//		pRelationPacket->m_AddNewGroup.GetGroupName());
			//	Assert( FALSE && "组太多,不能新建" );
			//	return PACKET_EXE_CONTINUE;
			//}

			//return PACKET_EXE_CONTINUE;
	//	}
	//	break;
	case REQ_SUREADDFRIEND:
		{//确定加为好友
			HumanRelation* pMyRelation = pHuman->GetHumanRelation();
			REQUEST_ADD_RELATION_WITH_GROUP* pMyFriend = &(pRelationPacket->m_AddRelationWithGroup);

			if( strlen(pMyFriend->GetTargetName())<=0 )
			{
				g_pLog->FastSaveLog( LOG_FILE_1,"CGRelationHandler: Name=%s attempt to add a friend without GUID.", pHuman->GetName() );
				return PACKET_EXE_CONTINUE;
			}
			else if ( strcmp(pHuman->GetName(), pMyFriend->GetTargetName()) == 0)
			{
				g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s attempt to add self as a friend.", pHuman->GetName() );	
				return PACKET_EXE_CONTINUE;
			}

			RELATION_GROUP grp = (RELATION_GROUP)pMyFriend->GetGroup();
			switch( grp )
			{ // 只能是以下分组
			case RELATION_GROUP_FRIEND_ALL:
			case RELATION_GROUP_F1:
			case RELATION_GROUP_F2:
			case RELATION_GROUP_F3:
			case RELATION_GROUP_F4:
			case RELATION_GROUP_F5:
				break;
			default:
				AssertEx( FALSE, "Invalid Friend Group.");
				return PACKET_EXE_CONTINUE;
			}

			// 看看是否还有空位
			if( pMyRelation->IsGroupFull( grp ) )
			{ 
				nErr = RET_ERR_FRIENDGROUPISFULL;
				break;
			}

			// 看看目前关系表中已经有该玩家(不管是朋友还是黑名单)
			RELATION_TYPE RelationType;

			if ( pMyFriend->GetTargetGUID() == INVALID_ID )
			{
				const _OWN_RELATION* mRel = pMyRelation->GetRelationInfo( pMyFriend->GetTargetName() ); 

				//如果在关系列表中没有找到,那可能是第一次加为好友
				if ( NULL == mRel )
				{
					RelationType = RELATION_TYPE_STRANGER;
				}
				else
				{
					RelationType = pMyRelation->GetRelationType( mRel->m_Member.m_MemberGUID );
				}
			}
			else
			{
				RelationType = pMyRelation->GetRelationType( pMyFriend->GetTargetGUID() );
			}

			switch( RelationType )
			{
			case RELATION_TYPE_FRIEND:
				nErr = RET_ERR_ISFRIEND;
				break;
			case RELATION_TYPE_BLACKNAME:
				{
					return PACKET_EXE_CONTINUE;
					//nErr = RET_ERR_ISBLACKNAME;
				}
				break;
			case RELATION_TYPE_ENEMY:
			case RELATION_TYPE_STRANGER:
				{ // 正确关系
					GWRelation* pMsg = (GWRelation*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_RELATION);

					GW_RELATION* pRelation = pMsg->GetRelation();
					pRelation->CleanUp();
					pRelation->m_Type = pRelationPacket->m_Type;
					pRelation->SetGUID( pHuman->GetGUID() );
					REQUEST_ADD_RELATION_WITH_GROUP& Relation = pRelation->m_AddRelationWithGroup;
					Relation.CleanUp();
					Relation.SetTargetGUID( pMyFriend->GetTargetGUID() );
					Relation.SetTargetName( pMyFriend->GetTargetName() );
					Relation.SetRelationType( pMyFriend->GetRelationType() );
					Relation.SetGroup( pMyFriend->GetGroup() );

					g_pServerManager->SendPacket( pMsg, INVALID_ID );
					g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: Name=%s add Name=%s as a new friend.",
						pHuman->GetName(), pMyFriend->GetTargetName() );

					return PACKET_EXE_CONTINUE;
				}
				break;
			default:
				nErr = RET_ERR_RELATIONUNKNOWN;
				Assert(FALSE);
				break;
			}
		}
		break;

	default :
		{
			Assert(FALSE);
			return PACKET_EXE_CONTINUE;
		}
		break;
	}

	if ( nErr )
	{
		Msg.GetRelation()->m_Type = nErr;

		g_pLog->FastSaveLog( LOG_FILE_1, "CGRelationHandler: GUID=%X Error code %d.",
			pHuman->GetGUID(), nErr );
	}

	pGamePlayer->SendPacket( &Msg );

	return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR;
}