UINT WGTeamListHandler::Execute( WGTeamList* 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, "WGTeamListHandler::Execute pGamePlayer==NULL" ); return PACKET_EXE_CONTINUE; } if (pGamePlayer->m_HumanGUID != pPacket->GetGUID()) { g_pLog->FastSaveLog( LOG_FILE_3, "WGTeamListHandler::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, "WGTeamListHandler::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, "WGTeamListHandler: ServerPlayer (GUID=%X, TeamID=%d) ", pHuman->GetGUID(), pPacket->GetTeamID() ); return PACKET_EXE_NOTREMOVE; } else if( pPlayer->IsGamePlayer() ) {//场景收到Cache里的消息 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ); TeamInfo* pTeamInfo = pHuman->GetTeamInfo(); if ( pTeamInfo->HasTeam() ) { // 只要客户端请求完成的队伍信息,就清空服务器端的队伍列表 pTeamInfo->DisMiss(); } pTeamInfo->SetTeamID( pPacket->GetTeamID() ); pHuman->GetDB()->SetDBTeamID( pPacket->GetTeamID() ) ; pTeamInfo->SetMySceneID( pScene->SceneID() ); GCTeamList Msg; Msg.SetTeamID( pPacket->GetTeamID() ); for( UINT i=0; i<pPacket->GetMemberCount(); ++i ) { const TEAM_LIST_ENTRY& entry = pPacket->GetTeamMember( i ); TEAM_LIST_ENTRY newEntry; TEAMMEMBER Member; Member.m_GUID = entry.GetGUID(); Member.m_SceneID = entry.GetSceneID(); if ( Member.m_GUID == pGamePlayer->m_HumanGUID ) { Member.m_ObjID = pHuman->GetID(); } else if ( Member.m_SceneID == pScene->SceneID() ) { GamePlayer* ptempGamePlayer = g_pPlayerPool->GetPlayer( entry.GetExtraID() ); Obj_Human* ptempHuman; if ( ptempGamePlayer == NULL ) { Assert(FALSE && "队友失去了连接。"); Member.m_ObjID = INVALID_ID; } else if ( (ptempHuman = ptempGamePlayer->GetHuman()) == NULL ) { Assert(FALSE && "队友找不到了……"); Member.m_ObjID = INVALID_ID; } else { Member.m_ObjID = ptempHuman->GetID(); } } else { Member.m_ObjID = INVALID_ID; } newEntry = entry; newEntry.SetExtraID( Member.m_ObjID ); pTeamInfo->AddMember( &Member ); Msg.AddTeamMember( newEntry ); } pGamePlayer->SendPacket( &Msg ); GCNotifyTeamInfo notifyMsg; notifyMsg.SetObjID( pHuman->GetID() ); notifyMsg.SetHaveTeamFlag( pTeamInfo->HasTeam() ); if ( pTeamInfo->HasTeam() ) { notifyMsg.SetTeamLeaderFlag( pTeamInfo->IsLeader() ); notifyMsg.SetTeamFullFlag( pTeamInfo->IsFull() ); } else { notifyMsg.SetTeamLeaderFlag( FALSE ); notifyMsg.SetTeamFullFlag( FALSE ); } if ( pHuman->getZoneID() != INVALID_ID ) { pScene->BroadCast( ¬ifyMsg, pHuman ); } g_pLog->FastSaveLog( LOG_FILE_1, "WGTeamListHandler: GamePlayer (to:%d, GUID=%ld, TeamID=%d) ", pPacket->GetPlayerID(), pHuman->GetGUID(), pPacket->GetTeamID() ); } else { Assert(FALSE); } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint GWAskTeamInfoHandler::Execute( GWAskTeamInfo* pPacket, Player* pPlayer ) { __ENTER_FUNCTION ServerPlayer* pServerPlayer = (ServerPlayer*)pPlayer; GUID_t guid = pPacket->GetGUID(); // 被请求信息的玩家的 GUID USER* pUser = g_pOnlineUser->FindUser( guid ); if( pUser == NULL ) { Log::SaveLog( WORLD_LOGFILE, "GWAskTeamInfoHandler...User GUID=%X not find!", guid ); return PACKET_EXE_CONTINUE; } if( pUser->GetTeamID() == INVALID_ID ) { return PACKET_EXE_CONTINUE; } Team* pTeam = g_pTeamList->GetTeam( pUser->GetTeamID() ); if( pTeam==NULL ) { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } else { TEAMMEMBER Member; Member.m_Member = pUser->GetGUID(); if ( pTeam->IsMember( &Member ) == FALSE ) { // 某些情况下,玩家保存了过期的队伍号 AssertEx( FALSE, "过期队伍号,忽略。" ); return PACKET_EXE_CONTINUE; } } WGTeamList Msg; Msg.SetPlayerID(pPacket->GetPlayerID()); Msg.SetTeamID( pUser->GetTeamID() ); Msg.SetGUID( guid ); WGTeamResult MsgtoEveryMember; // 通知其他队员某人进入新场景了 MsgtoEveryMember.SetReturn( TEAM_RESULT_ENTERSCENE ); MsgtoEveryMember.SetTeamID( pTeam->GetTeamID() ); MsgtoEveryMember.SetGUID( pUser->GetGUID() ); MsgtoEveryMember.SetGUIDEx( pUser->GetPlayerID() ); MsgtoEveryMember.SetIcon( pUser->GetPortrait() ); MsgtoEveryMember.SetSceneID( pUser->GetSceneID() ); for(int i=0; i<pTeam->MemberCount(); ++i) { TEAMMEMBER* pMember = pTeam->Member( i ); if( pMember==NULL ) { Assert(FALSE); continue; } USER* pDestUser = g_pOnlineUser->FindUser( pMember->m_Member ); if( pDestUser==NULL ) { Assert(FALSE); continue; } ID_t ServerID = pDestUser->GetServerID() ; ServerPlayer* pDestServerPlayer = g_pServerManager->GetServerPlayer( ServerID ) ; if( pDestServerPlayer==NULL ) { Assert(FALSE) ; continue ; } if( pUser->GetGUID() != pDestUser->GetGUID() ) { MsgtoEveryMember.SetPlayerID( pDestUser->GetPlayerID() ) ; pDestServerPlayer->SendPacket( &MsgtoEveryMember ); } TEAM_LIST_ENTRY entry; entry.SetGUID( pDestUser->GetGUID() ); entry.SetSceneID( pDestUser->GetSceneID() ); entry.SetExtraID( pDestUser->GetPlayerID() ); entry.SetName( pDestUser->GetName() ); entry.SetIcon( pDestUser->GetPortrait() ); entry.SetDataID( pDestUser->GetSex() ); Msg.AddTeamMember( entry ); } pServerPlayer->SendPacket( &Msg ); if ( pTeam->GetFollowedmemberCount()>0 ) { GUID_t* FollowedMembers = pTeam->GetFollowedMembers(); BOOL flag; flag = FALSE; for( INT i=0; i<pTeam->GetFollowedmemberCount(); ++i ) { if ( FollowedMembers[i] == guid ) { // 如果身处组队跟随状态则发送组队列表 flag = TRUE; break; } } if ( flag == TRUE ) { WGTeamFollowList FollowListMsg; FollowListMsg.SetPlayerID(pPacket->GetPlayerID()); FollowListMsg.SetGUID( pPacket->GetGUID() ); for( INT i=0; i<pTeam->GetFollowedmemberCount(); ++i ) { FollowListMsg.AddFollowMember(FollowedMembers[i]); } pServerPlayer->SendPacket( &FollowListMsg ); } } Log::SaveLog( WORLD_LOGFILE, "GWAskTeamInfoHandler...Success! GUID=%X", guid ); return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }