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

	Obj_Human* pDestHuman = pScene->GetHumanManager()->GetHuman( pPacket->getObjID() );
	if( (pDestHuman != NULL) && (pDestHuman->GetGUID() == pPacket->GetGUID()) )
	{
		GCTeamMemberInfo Msg;

		const _HUMAN_DB_LOAD* pDB = pDestHuman->GetDB()->GetHumanDB();

		Msg.setGUID(pPacket->GetGUID());
		Msg.SetFamily(pDestHuman->GetMenPai());
		Msg.SetLevel(pDestHuman->GetLevel());
		Msg.SetWorldPos(pDestHuman->getWorldPos());
		Msg.SetHP(pDestHuman->GetHP());
		Msg.SetMaxHP(pDestHuman->GetMaxHP());
		Msg.SetMP(pDestHuman->GetMP());
		Msg.SetMaxMP(pDestHuman->GetMaxMP());
		Msg.SetAnger(pDestHuman->GetRage());

		Msg.SetWeaponID( pDestHuman->GetEquipID(HEQUIP_MAINHAND) );
		Msg.SetAssihandID( pDestHuman->GetEquipID(HEQUIP_ASSIHAND) );

		Msg.SetScapularID( pDestHuman->GetEquipID(HEQUIP_SHOULDER) );
		Msg.SetCapID( pDestHuman->GetEquipID(HEQUIP_HEAD) );
		Msg.SetArmourID( pDestHuman->GetEquipID(HEQUIP_BACK) );
		Msg.SetCuffID( pDestHuman->GetEquipID(HEQUIP_HAND) );
		Msg.SetFootID( pDestHuman->GetEquipID(HEQUIP_FEET) );

		/*Msg.SetWeaponID( pDestHuman->GetEquipID(HEQUIP_WEAPON) );
		Msg.SetCapID( pDestHuman->GetEquipID(HEQUIP_CAP) );
		Msg.SetArmourID( pDestHuman->GetEquipID(HEQUIP_ARMOR) );
		Msg.SetCuffID( pDestHuman->GetEquipID(HEQUIP_CUFF) );
		Msg.SetFootID( pDestHuman->GetEquipID(HEQUIP_BOOT) );*/

		if( pDestHuman->GetPlayer()->IsDisconnect() )
		{
			Msg.SetDeadLink( TRUE );
		}
		else
		{
			Msg.SetDeadLink( FALSE );
		}

		if( pDestHuman->IsActiveObj() != TRUE )
		{
			Msg.SetDead( TRUE );
		}
		else
		{
			Msg.SetDead( FALSE );
		}

		Msg.SetFaceModel( pDestHuman->__GetFaceModel() );
		Msg.SetHairModel( pDestHuman->__GetHairModel() );
		Msg.SetHairColor( pDestHuman->__GetHairColor() );

		pGamePlayer->SendPacket( &Msg );

		g_pLog->FastSaveLog( LOG_FILE_1, "CGAskTeamMemberInfoHandler dealt: sObjID=%X dObjID=%X", 
			pHuman->GetID(), pPacket->getObjID() );

		return PACKET_EXE_CONTINUE;
	}

	// 从服务器请求具体数据,数据项包括玩家的 GUID、昵称、门派、等级、头像(在线、死亡状态)
	// 从这传回来的只有门派,等级,和在线状态
	GWAskTeamMemberInfo* pMsg = (GWAskTeamMemberInfo*)(g_pPacketFactoryManager->CreatePacket(PACKET_GW_ASKTEAMMEMBERINFO));

	pMsg->SetObjID( pGamePlayer->PlayerID() );
	pMsg->SetGUID( pPacket->GetGUID() );

	g_pServerManager->SendPacket( pMsg, INVALID_ID );

	g_pLog->FastSaveLog( LOG_FILE_1, "CGAskTeamMemberInfoHandler transmit to world: sObjID=%X dGUID=%X, wait get message from world.", 
		pHuman->GetID(), pPacket->GetGUID() );

	return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR;
}
VOID Obj_Human::SyncTeamMemberInfo( )
{
__ENTER_FUNCTION

	const TeamInfo* pTeamInfo;

	pTeamInfo = GetTeamInfo();
	if ( pTeamInfo == NULL )
	{ // 出问题了
		Assert(FALSE);
		return;
	}

	if ( pTeamInfo->HasTeam() == FALSE )
	{ // 没有组队
		return;
	}

	if ( pTeamInfo->GetSceneMemberCount() < 1 )
	{ // 没有队友在同场景
		return;
	}

	GCTeamMemberInfo msgTeamMember;

	msgTeamMember.setGUID( GetGUID() );

	if ( m_SyncTeamMemberInfo.m_uFamily != GetMenPai())
	{
		m_SyncTeamMemberInfo.m_uFamily = GetMenPai();
		msgTeamMember.SetFamily( GetMenPai() );
	}

	if ( m_SyncTeamMemberInfo.m_uLevel != GetLevel() )
	{
		m_SyncTeamMemberInfo.m_uLevel = GetLevel();
		msgTeamMember.SetLevel( GetLevel() );
	}

	if ( m_SyncTeamMemberInfo.m_WorldPos.m_fX != getWorldPos()->m_fX
	  || m_SyncTeamMemberInfo.m_WorldPos.m_fZ != getWorldPos()->m_fZ
	  )
	{
		m_SyncTeamMemberInfo.m_WorldPos.m_fX = getWorldPos()->m_fX;
		m_SyncTeamMemberInfo.m_WorldPos.m_fZ = getWorldPos()->m_fZ;

		msgTeamMember.SetWorldPos( &(m_SyncTeamMemberInfo.m_WorldPos) );
	}

	if ( m_SyncTeamMemberInfo.m_uMaxHP != GetMaxHP() )
	{
		m_SyncTeamMemberInfo.m_uMaxHP = GetMaxHP();
		msgTeamMember.SetMaxHP( GetMaxHP() );
	}

	if ( m_SyncTeamMemberInfo.m_nHP != GetHP() )
	{
		m_SyncTeamMemberInfo.m_nHP = GetHP();
		msgTeamMember.SetHP( GetHP() );
	}

	if ( m_SyncTeamMemberInfo.m_uMaxMP != GetMaxMP() )
	{
		m_SyncTeamMemberInfo.m_uMaxMP = GetMaxMP();
		msgTeamMember.SetMaxMP( GetMaxMP() );
	}

	if ( m_SyncTeamMemberInfo.m_nMP != GetMP() )
	{
		m_SyncTeamMemberInfo.m_nMP = GetMP();
		msgTeamMember.SetMP( GetMP() );
	}

	if ( m_SyncTeamMemberInfo.m_nAnger != GetRage() )
	{
		m_SyncTeamMemberInfo.m_nAnger = GetRage();
		msgTeamMember.SetAnger( GetRage() );
	}

	// 装备刷新
	UINT uWeaponID = GetEquipID( HEQUIP_WEAPON );
	if ( m_SyncTeamMemberInfo.m_WeaponID != uWeaponID )
	{
		m_SyncTeamMemberInfo.m_WeaponID = uWeaponID;
		msgTeamMember.SetWeaponID( uWeaponID );
	}

	UINT uCapID = GetEquipID( HEQUIP_CAP );
	if ( m_SyncTeamMemberInfo.m_CapID != uCapID )
	{
		m_SyncTeamMemberInfo.m_CapID = uCapID;
		msgTeamMember.SetCapID( uCapID );
	}

	UINT uArmourID = GetEquipID( HEQUIP_ARMOR );
	if ( m_SyncTeamMemberInfo.m_ArmourID != uArmourID )
	{
		m_SyncTeamMemberInfo.m_ArmourID = uArmourID;
		msgTeamMember.SetArmourID( uArmourID );
	}

	UINT uCuffID = GetEquipID( HEQUIP_CUFF );
	if ( m_SyncTeamMemberInfo.m_CuffID != uCuffID )
	{
		m_SyncTeamMemberInfo.m_CuffID = uCuffID;
		msgTeamMember.SetCuffID( uCuffID );
	}

	UINT uBootID = GetEquipID( HEQUIP_BOOT );
	if ( m_SyncTeamMemberInfo.m_FootID != uBootID )
	{
		m_SyncTeamMemberInfo.m_FootID = uBootID;
		msgTeamMember.SetFootID( GetEquipID( HEQUIP_BOOT ) );
	}

	BOOL bDeadFlag = IsDie();
	if ( m_SyncTeamMemberInfo.m_bDeadFlag != bDeadFlag )
	{
		m_SyncTeamMemberInfo.m_bDeadFlag = bDeadFlag;
		msgTeamMember.SetDead( bDeadFlag );
	}

	if ( m_SyncTeamMemberInfo.m_uFaceMeshID != __GetFaceModel() )
	{
		m_SyncTeamMemberInfo.m_uFaceMeshID = __GetFaceModel();
		msgTeamMember.SetFaceModel( __GetFaceModel() );
	}

	if ( m_SyncTeamMemberInfo.m_uHairMeshID != __GetHairModel() )
	{
		m_SyncTeamMemberInfo.m_uHairMeshID = __GetHairModel();
		msgTeamMember.SetHairModel( __GetHairModel() );
	}

	if ( m_SyncTeamMemberInfo.m_uHairColor != __GetHairColor() )
	{
		m_SyncTeamMemberInfo.m_uHairColor = __GetHairColor();
		msgTeamMember.SetHairColor( __GetHairColor() );
	}

	BOOL bMemberInfo = FALSE;
	BOOL bImpactInfo = FALSE;

	if ( msgTeamMember.GetFlags() != 0 )
	{ // 没有需要更新的信息
		bMemberInfo = TRUE;
	}

	// BUFF
	GCCharImpactListUpdate msgMemberImpactList;
	_IMPACT_LIST& rList = Impact_GetImpactList();

	if ( m_SyncTeamMemberInfo.m_SimpleImpactList != rList )
	{
		bImpactInfo = TRUE;
	}

	if ( bImpactInfo )
	{
		m_SyncTeamMemberInfo.m_SimpleImpactList.SetImpactList( &rList );

		msgMemberImpactList.SetOwnerID( GetID() );
		msgMemberImpactList.SetImpactList( rList );
	}


	if ( !bMemberInfo && !bImpactInfo )
	{ // 没有任何需要更新的信息
		return;
	}

	for( INT i=0; i<pTeamInfo->GetSceneMemberCount(); ++i )
	{
		Obj_Human* pRecvHuman;

		pRecvHuman = getScene()->GetHumanManager()->GetHuman( pTeamInfo->GetSceneMemberObjID(i) );

		if ( pRecvHuman != NULL )
		{
			Player* pRecvPlayer = pRecvHuman->GetPlayer();

			if ( pRecvPlayer != NULL )
			{
				if ( bMemberInfo )
				{
					pRecvPlayer->SendPacket( &msgTeamMember );
				}

				if ( bImpactInfo )
				{
					pRecvPlayer->SendPacket( &msgMemberImpactList );
				}
			}
		}
	}

__LEAVE_FUNCTION
}