uint WGTeamMemberInfoHandler::Execute( WGTeamMemberInfo* pPacket, Player* pPlayer ) { __ENTER_FUNCTION PlayerID_t PlayerID = pPacket->GetPlayerID(); GamePlayer* pGamePlayer = g_pPlayerPool->GetPlayer(PlayerID); if( pGamePlayer==NULL ) { g_pLog->FastSaveLog( LOG_FILE_3, "WGTeamMemberInfoHandler::Execute pGamePlayer==NULL" ); return PACKET_EXE_CONTINUE; } if (pGamePlayer->m_HumanGUID != pPacket->GetGUID()) { g_pLog->FastSaveLog( LOG_FILE_3, "WGTeamMemberInfoHandler::Execute pGamePlayer->m_HumanGUID[%d] != pPacket->GetGUID()[%d]",pGamePlayer->m_HumanGUID, pPacket->GetGUID()); return PACKET_EXE_CONTINUE; } Obj_Human* pHuman = pGamePlayer->GetHuman(); Assert( pHuman ); Scene* pScene = pHuman->getScene(); if( !pScene ) { g_pLog->FastSaveLog( LOG_FILE_3, "WGTeamMemberInfoHandler::Execute pHuman->getScene() == NULL" ); return PACKET_EXE_CONTINUE; } if( pPlayer->IsServerPlayer() ) {//服务器收到世界服务器发来的数据 Assert( MyGetCurrentThreadID()==g_pServerManager->m_ThreadID ); pScene->SendPacket( pPacket, PlayerID ); g_pLog->FastSaveLog( LOG_FILE_1, "WGTeamMemberInfoHandler: ServerPlayer (GUID=%X) ", pPacket->GetGUID() ); return PACKET_EXE_NOTREMOVE; } else if( pPlayer->IsGamePlayer() ) {//场景收到Cache里的消息 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ); GCTeamMemberInfo Msg; Msg.setGUID( pPacket->GetGUID() ); Msg.SetFamily( pPacket->GetFamily() ); Msg.SetLevel( pPacket->GetLevel() ); Msg.SetDead( FALSE ); // 不在同一个场景则默认是活的 Msg.SetDeadLink( pPacket->GetDeadLinkFlag() ); pGamePlayer->SendPacket( &Msg ); g_pLog->FastSaveLog( LOG_FILE_1, "WGTeamMemberInfoHandler: GamePlayer (GUID=%X) ", pPacket->GetGUID() ); } else { Assert(FALSE); } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
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 }