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; }
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 WGTeamResultHandler::Execute( WGTeamResult* 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, "WGTeamResultHandler::Execute pGamePlayer==NULL" ); return PACKET_EXE_CONTINUE; } Obj_Human* pHuman = pGamePlayer->GetHuman(); Assert( pHuman ); Scene* pScene = pHuman->getScene(); if( !pScene ) { g_pLog->FastSaveLog( LOG_FILE_3, "WGTeamResultHandler::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, "WGTeamResultHandler: ServerPlayer (Return=%d, GUID=%X, TeamID=%d) ", pPacket->GetReturn(), pPacket->GetGUID(), pPacket->GetTeamID() ); return PACKET_EXE_NOTREMOVE; } else if( pPlayer->IsGamePlayer() ) {//场景收到Cache里的消息 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ); TeamInfo* pTeamInfo = pHuman->GetTeamInfo(); GCTeamResult tMsg; BOOL bNotifyTeamInfoFlag = FALSE; tMsg.SetReturn( pPacket->GetReturn() ); tMsg.SetGUID( pPacket->GetGUID() ); tMsg.SetTeamID( pPacket->GetTeamID() ); tMsg.SetGUIDEx( pPacket->GetGUIDEx() ); tMsg.SetSceneID( pPacket->GetSceneID() ); tMsg.SetIcon( pPacket->GetIcon() ); tMsg.SetName( pPacket->GetName() ); tMsg.SetDataID( pPacket->GetDataID() ); switch( pPacket->GetReturn() ) { case TEAM_RESULT_TEAMREFRESH: case TEAM_RESULT_MEMBERENTERTEAM: { if( !pTeamInfo->HasTeam() ) { pTeamInfo->SetTeamID( pPacket->GetTeamID() ); pHuman->GetDB()->SetDBTeamID( pPacket->GetTeamID() ) ; pTeamInfo->SetMySceneID( pScene->SceneID() ); bNotifyTeamInfoFlag = TRUE; } TEAMMEMBER Member; Member.m_GUID = pPacket->GetGUID(); Member.m_SceneID = pPacket->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(pPacket->GetGUIDEx()); Obj_Human* ptempHuman; if ( ptempGamePlayer == NULL ) { Assert(FALSE && "队友失去了连接。"); } else if ( (ptempHuman = ptempGamePlayer->GetHuman()) == NULL ) { Assert(FALSE && "队友找不到了……"); } else { Member.m_ObjID = ptempHuman->GetID(); } } else { Member.m_ObjID = INVALID_ID; } tMsg.SetGUIDEx( Member.m_ObjID ); // 将队友的 ObjID 发出去 pTeamInfo->AddMember( &Member ); if ( pTeamInfo->IsFull() ) { bNotifyTeamInfoFlag = TRUE; } } break; case TEAM_RESULT_MEMBERLEAVETEAM: case TEAM_RESULT_TEAMKICK: case TEAM_RESULT_LEADERLEAVETEAM: { if ( pTeamInfo->IsFull() ) { // 队伍不再满 bNotifyTeamInfoFlag = TRUE; } if ( pGamePlayer->m_HumanGUID == pPacket->GetGUID() ) { // 自己主动离队 if ( pHuman->__GetTeamFollowFlag() ) { pHuman->__StopTeamFollow(FALSE); } pTeamInfo->DisMiss(); pHuman->GetDB()->SetDBTeamID( INVALID_ID ) ; bNotifyTeamInfoFlag = TRUE; } else { pTeamInfo->DelMember( pPacket->GetGUID() ); if ( pPacket->GetReturn() == TEAM_RESULT_LEADERLEAVETEAM && pTeamInfo->IsLeader() // 队长退队后,自己变成新队长 ) { GCReturnTeamFollow Msg; Msg.SetReturn(TF_RESULT_STOP_FOLLOW); Msg.SetGUID(pHuman->GetGUID()); pGamePlayer->SendPacket(&Msg); bNotifyTeamInfoFlag = TRUE; } } } break; case TEAM_RESULT_TEAMDISMISS: { if ( pTeamInfo->IsLeader() ) { // 自己是队长 if ( pHuman->__GetTeamFollowFlag() ) { pHuman->__StopTeamFollow(FALSE); } } pTeamInfo->DisMiss(); pHuman->GetDB()->SetDBTeamID( INVALID_ID ) ; bNotifyTeamInfoFlag = TRUE; } break; case TEAM_RESULT_TEAMAPPOINT: { if ( pTeamInfo->IsLeader() ) { // 自己是队长 if ( pHuman->__GetTeamFollowFlag() ) { pHuman->__StopTeamFollow(); } bNotifyTeamInfoFlag = TRUE; } pTeamInfo->Appoint( pPacket->GetGUIDEx() ); if ( pTeamInfo->IsLeader() ) { // 自己是队长了 bNotifyTeamInfoFlag = TRUE; } } break; case TEAM_RESULT_STARTCHANGESCENE: { pTeamInfo->StartChangeScene( pPacket->GetGUID() ); } break; case TEAM_RESULT_ENTERSCENE: { if ( pPacket->GetGUID() == pGamePlayer->m_HumanGUID ) { // 自己进入 pTeamInfo->EnterScene( pGamePlayer->m_HumanGUID, pScene->SceneID(), pHuman->GetID() ); if ( pHuman->__GetTeamFollowFlag() ) { _FOLLOWEDMEMBER FollowedMember; FollowedMember.m_GUID = pHuman->GetGUID(); FollowedMember.m_pHuman = pHuman; pHuman->__AddFollowedMember( FollowedMember ); } } else { ObjID_t oid; if ( pPacket->GetSceneID() == pScene->SceneID() ) { GamePlayer* ptempGamePlayer = g_pPlayerPool->GetPlayer(pPacket->GetGUIDEx()); Obj_Human* ptempHuman; if ( ptempGamePlayer == NULL ) { Assert(FALSE && "队友失去了连接。"); } else if ( (ptempHuman = ptempGamePlayer->GetHuman()) == NULL ) { Assert(FALSE && "队友找不到了……"); } else { oid = ptempHuman->GetID(); if ( ptempHuman->__GetTeamFollowFlag() ) { _FOLLOWEDMEMBER FollowedMember; FollowedMember.m_GUID = ptempHuman->GetGUID(); FollowedMember.m_pHuman = ptempHuman; pHuman->__AddFollowedMember( FollowedMember ); } } } else { oid = INVALID_ID; } pTeamInfo->EnterScene( pPacket->GetGUID(), pPacket->GetSceneID(), oid ); tMsg.SetGUIDEx( oid ); } } break; case TEAM_RESULT_MEMBEROFFLINE: { pTeamInfo->MemberOffLine( pPacket->GetGUID() ); GCTeamMemberInfo tmInfoMsg; tmInfoMsg.setGUID( pPacket->GetGUID() ); tmInfoMsg.SetDeadLink( TRUE ); pGamePlayer->SendPacket( &tmInfoMsg ); g_pLog->FastSaveLog( LOG_FILE_1, "WGTeamResultHandler: GUID=%X has lost connection.", pPacket->GetGUID() ); return PACKET_EXE_CONTINUE; } break; default : { Assert(FALSE); } break; }; pGamePlayer->SendPacket( &tMsg ); if ( bNotifyTeamInfoFlag == TRUE ) { GCNotifyTeamInfo notifyMsg; TeamInfo* pTeamInfo = pHuman->GetTeamInfo(); notifyMsg.SetObjID( pHuman->GetID() ); notifyMsg.SetHaveTeamFlag( pTeamInfo->HasTeam() ); if ( pTeamInfo->HasTeam() ) { notifyMsg.SetTeamLeaderFlag( pTeamInfo->IsLeader() ); notifyMsg.SetTeamFullFlag( pTeamInfo->IsFull() ); // notifyMsg.SetTeamFollowFlag( pHuman->__GetTeamFollowFlag() ); } else { notifyMsg.SetTeamLeaderFlag( FALSE ); notifyMsg.SetTeamFullFlag( FALSE ); // notifyMsg.SetTeamFollowFlag( FALSE ); } if ( pHuman->getZoneID() != INVALID_ID ) { pScene->BroadCast( ¬ifyMsg, pHuman ); } g_pLog->FastSaveLog( LOG_FILE_1, "BroadCast GCNotifyTeamInfo..............." ); } g_pLog->FastSaveLog( LOG_FILE_1, "WGTeamResultHandler: GamePlayer (Return=%d, to:%d, GUID=%ld, TeamID=%d, GUIDEx=%X, SceneID=%d) ", pPacket->GetReturn(), pPacket->GetPlayerID(), pPacket->GetGUID(), pPacket->GetTeamID(), pPacket->GetGUIDEx(), pPacket->GetSceneID() ); } else { Assert(FALSE); } 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 }