uint GWTeamKickHandler::Execute( GWTeamKick* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION

	ServerPlayer* pSourServerPlayer = (ServerPlayer*)pPlayer;

	GUID_t sGuid = pPacket->GetSourGUID(); // 队长
	GUID_t dGuid = pPacket->GetDestGUID(); // 倒霉蛋

	USER* pSourUser = g_pOnlineUser->FindUser( sGuid );
	if( pSourUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamKickHandler...User Sour GUID=%X not find!", 
			sGuid );

		return PACKET_EXE_CONTINUE;
	}

	TeamID_t tid = pSourUser->GetTeamID();
	Team* pTeam = g_pTeamList->GetTeam( tid );
	if( pTeam==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamKickHandler...User sGUID=%X TeamID=%d not find team!", 
			sGuid, tid );

		return PACKET_EXE_CONTINUE;
	}

	INT nMemberCount = pTeam->MemberCount();
	INT i;
	for( i=0; i<nMemberCount; ++i )
	{
		if ( pTeam->Member(i)->m_Member == dGuid )
		{
			break;
		}
	}

	if( i >= nMemberCount )
	{ // 被踢者不在队伍里
		Log::SaveLog( WORLD_LOGFILE, "GWTeamKickHandler...User dGUID=%X not in sTeamID=%d(sGUID=%X)!", 
			dGuid, tid, sGuid );

		return PACKET_EXE_CONTINUE;
	}

	if( pTeam->Leader()->m_Member != sGuid )
	{ // 踢人者不是队长
		WGTeamError Msg;
		Msg.SetPlayerID( pSourUser->GetPlayerID() );
		Msg.SetGUID( pSourUser->GetGUID() );
		Msg.SetErrorCode( TEAM_ERROR_KICKNOTLEADER );

		pSourServerPlayer->SendPacket( &Msg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamKickHandler...User sGUID=%X TeamID=%d not leader!", 
			sGuid, tid );

		return PACKET_EXE_CONTINUE;
	}

	WGTeamResult Msg;
	Msg.SetReturn( TEAM_RESULT_TEAMKICK );
	Msg.SetGUID( dGuid );
	Msg.SetTeamID( tid );

	//通知所有组内的玩家
	for( int i=0; i<pTeam->MemberCount(); i++ )
	{
		TEAMMEMBER* pMember = pTeam->Member( i );
		if( pMember==NULL )
		{
			Assert(FALSE);
			continue;
		}

		USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
		if( pUser==NULL )
		{//如果队员离线,则用户数据是空
			continue;
		}
		
		ID_t ServerID = pUser->GetServerID();
		ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID );
		if( pServerPlayer==NULL )
		{
			Assert(FALSE);
			continue;
		}

		Msg.SetPlayerID( pUser->GetPlayerID() );

		pServerPlayer->SendPacket( &Msg );
	}

	//剔除队员
	TEAMMEMBER Member;
	Member.m_Member = dGuid;
	pTeam->DelMember( &Member );

	//设置被踢者的队伍信息
	USER* pDestUser = g_pOnlineUser->FindUser( dGuid );
	if ( pDestUser!=NULL )
	{
		pDestUser->SetTeamID( INVALID_ID );
	}

	Log::SaveLog( WORLD_LOGFILE, "GWTeamKickHandler...User sGUID=%X TeamID=%d Success!", 
		sGuid, tid );

	return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR;
}
예제 #2
0
UINT GWTeamRetInviteHandler::Execute( GWTeamRetInvite* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION

    GUID_t sGuid = pPacket->GetSourGUID();//邀请人的GUID
    GUID_t dGuid = pPacket->GetDestGUID();//被邀请人的GUID

    USER* pDestUser = g_pOnlineUser->FindUser( dGuid );
    if( pDestUser==NULL )
    {
        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...User Dest GUID=%X not find!", 
            dGuid );

        return PACKET_EXE_CONTINUE;
    }

    ServerPlayer* pDestServerPlayer = (ServerPlayer*)pPlayer;

    USER* pSourUser = g_pOnlineUser->FindUser( sGuid );
    if( pSourUser==NULL )
    {
        if( pPacket->GetReturn()==TRUE )
        {
            WGTeamError dMsg;
            dMsg.SetPlayerID( pDestUser->GetPlayerID() );
            dMsg.SetGUID( pDestUser->GetGUID() );
            dMsg.SetErrorCode( TEAM_ERROR_TARGETNOTONLINE );
            pDestServerPlayer->SendPacket( &dMsg );
        }

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...User Sour GUID=%X not find!", 
            sGuid );
        return PACKET_EXE_CONTINUE;
    }

    if( pSourUser->IsEnemy( pDestUser->GetUserCampData() ) )
    {
        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...Sour Name=%X, Dest Name=%s are enemy!", 
            pSourUser->GetName(), pDestUser->GetName() );

        return PACKET_EXE_CONTINUE;
    }

    ID_t SourServerID = pSourUser->GetServerID();
    ServerPlayer* pSourServerPlayer = g_pServerManager->GetServerPlayer( SourServerID );
    if( pSourServerPlayer==NULL )
    {
        Assert(FALSE);
        return PACKET_EXE_CONTINUE;
    }

    USER* pLeader = NULL;
    ServerPlayer* pLeaderServerPlayer;

    if ( pSourUser->GetTeamID() != INVALID_ID )
    {
        Team* pTeam = g_pTeamList->GetTeam( pSourUser->GetTeamID() );

        if ( pTeam == NULL )
        {
            Assert( pTeam );
            pSourUser->SetTeamID( INVALID_ID );
        }
        else if ( pTeam->Leader()->m_Member != sGuid )
        { // 邀请人不是队长
            pLeader = g_pOnlineUser->FindUser( pTeam->Leader()->m_Member );

            pLeaderServerPlayer = g_pServerManager->GetServerPlayer( pLeader->GetServerID() );
            if ( pLeaderServerPlayer == NULL )
            {
                Assert( FALSE );
                pLeader = NULL;
            }
        }
    }


    if( pPacket->GetReturn()==FALSE )
    {//被邀请人不同意加入队伍
        WGTeamError Msg;
        Msg.SetPlayerID( pSourUser->GetPlayerID() );
        Msg.SetGUID( pDestUser->GetGUID() );
        Msg.SetErrorCode( TEAM_ERROR_INVITEREFUSE );

        pSourServerPlayer->SendPacket( &Msg );

        if ( pLeader != NULL )
        {
            Msg.SetPlayerID( pLeader->GetPlayerID() );
            pLeaderServerPlayer->SendPacket( &Msg );
        }

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...Invite Refuse SourGUID=%X DestGUID=%X", 
            sGuid, dGuid );
    }
    else if( pDestUser->GetTeamID() != INVALID_ID )
    {//被邀请人已经有队伍
        WGTeamError Msg;
        Msg.SetPlayerID( pSourUser->GetPlayerID() );
        Msg.SetGUID( pDestUser->GetGUID() );
        Msg.SetErrorCode(TEAM_ERROR_INVITEDESTHASTEAM);

        pSourServerPlayer->SendPacket( &Msg );

        if ( pLeader != NULL )
        {
            Msg.SetPlayerID( pLeader->GetPlayerID() );
            pLeaderServerPlayer->SendPacket( &Msg );
        }

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...DestInTeam SourGUID=%X DestGUID=%X", 
            sGuid, dGuid );
    }
    else if( pSourUser->GetTeamID()==INVALID_ID )
    {//邀请人和被邀请人都无队伍
        TeamID_t tid = g_pTeamList->CreateTeam( );
        Assert( tid!=INVALID_ID );
        Team* pTeam = g_pTeamList->GetTeam( tid );
        Assert( pTeam );

        if ( pSourUser->GetGUID() == pDestUser->GetGUID() )
        {

            //将玩家加入队伍中
            TEAMMEMBER Member;
            Member.m_Member = sGuid;
            pTeam->AddMember( &Member );

            //设置玩家队伍数据
            pSourUser->SetTeamID( tid );

            //返回结果
            WGTeamResult Msg;
            Msg.SetPlayerID( pSourUser->GetPlayerID() );
            Msg.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
            Msg.SetGUID( sGuid );
            Msg.SetTeamID( tid );
            Msg.SetGUIDEx( pSourUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            Msg.SetIcon( pSourUser->GetPortrait() );
            Msg.SetSceneID( pSourUser->GetSceneID() );
            Msg.SetDataID( pSourUser->GetSex() );


            pSourServerPlayer->SendPacket( &Msg );

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...CreateTeam GUID=%X TeamID=%d", 
                sGuid, tid );
        }
        else
        {
            //将玩家加入队伍中
            TEAMMEMBER sMember;
            sMember.m_Member = sGuid;
            pTeam->AddMember( &sMember );
            TEAMMEMBER dMember;
            dMember.m_Member = dGuid;
            pTeam->AddMember( &dMember );

            //设置玩家队伍数据
            pSourUser->SetTeamID( tid );
            pDestUser->SetTeamID( tid );

            //返回结果
            WGTeamResult sMsg1;
            sMsg1.SetPlayerID( pSourUser->GetPlayerID() );
            sMsg1.SetReturn( TEAM_RESULT_TEAMREFRESH );
            sMsg1.SetGUID( sGuid );
            sMsg1.SetTeamID( tid );
            sMsg1.SetGUIDEx( pSourUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            sMsg1.SetSceneID( pSourUser->GetSceneID() );
            pSourServerPlayer->SendPacket( &sMsg1 );

            WGTeamResult sMsg2;
            sMsg2.SetPlayerID( pSourUser->GetPlayerID() );
            sMsg2.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
            sMsg2.SetGUID( dGuid );
            sMsg2.SetTeamID( tid );
            sMsg2.SetGUIDEx( pDestUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            sMsg2.SetSceneID( pDestUser->GetSceneID() );
            sMsg2.SetName( pDestUser->GetName() );
            sMsg2.SetIcon( pDestUser->GetPortrait() );
            sMsg2.SetDataID( pDestUser->GetSex() );
            pSourServerPlayer->SendPacket( &sMsg2 );

            WGTeamResult dMsg1;
            dMsg1.SetPlayerID( pDestUser->GetPlayerID() );
            dMsg1.SetReturn( TEAM_RESULT_TEAMREFRESH );
            dMsg1.SetGUID( sGuid );
            dMsg1.SetTeamID( tid );
            dMsg1.SetGUIDEx( pSourUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            dMsg1.SetSceneID( pSourUser->GetSceneID() );
            dMsg1.SetName( pSourUser->GetName() );
            dMsg1.SetIcon( pSourUser->GetPortrait() );
            dMsg1.SetDataID( pSourUser->GetSex() );
            pDestServerPlayer->SendPacket( &dMsg1 );

            WGTeamResult dMsg2;
            dMsg2.SetPlayerID( pDestUser->GetPlayerID() );
            dMsg2.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
            dMsg2.SetGUID( dGuid );
            dMsg2.SetTeamID( tid );
            dMsg2.SetGUIDEx( pDestUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            dMsg2.SetSceneID( pDestUser->GetSceneID() );
            pDestServerPlayer->SendPacket( &dMsg2 );

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...CreateTeam sGUID=%X dGUID=%X TeamID=%d", 
                sGuid, dGuid, tid );
        }

    }
    else
    {//邀请人有队伍, 被邀请人无队伍
        TeamID_t tid = pSourUser->GetTeamID();
        Team* pTeam = g_pTeamList->GetTeam( tid );
        Assert( pTeam );
        if( pTeam->IsFull() )
        {//队伍人数已经满了
            WGTeamError sMsg;
            sMsg.SetPlayerID( pSourUser->GetPlayerID() );
            sMsg.SetGUID( pDestUser->GetGUID() );
            sMsg.SetErrorCode( TEAM_ERROR_INVITETEAMFULL );
            pSourServerPlayer->SendPacket( &sMsg );

            WGTeamError dMsg;
            dMsg.SetPlayerID( pDestUser->GetPlayerID() );
            dMsg.SetGUID( pDestUser->GetGUID() );
            dMsg.SetErrorCode( TEAM_ERROR_APPLYTEAMFULL );
            pDestServerPlayer->SendPacket( &dMsg );
    
            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...Team Full sGUID=%X dGUID=%X TeamID=%d", 
                sGuid, dGuid, tid );
        }
        else
        { //将玩家加入队伍
            TEAMMEMBER Member;
            Member.m_Member = dGuid;
            pTeam->AddMember( &Member );

            //设置玩家队伍信息
            pDestUser->SetTeamID( pTeam->GetTeamID() );
            WGTeamResult Msg1; // 发给新队员的
            Msg1.SetPlayerID( pDestUser->GetPlayerID() );
            Msg1.SetTeamID( tid );
            WGTeamResult Msg2; // 发给每个队员的
            Msg2.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
            Msg2.SetTeamID( tid );
            Msg2.SetGUID( dGuid );
            Msg2.SetGUIDEx( pDestUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            Msg2.SetSceneID( pDestUser->GetSceneID() );
            Msg2.SetName( pDestUser->GetName() );
            Msg2.SetIcon( pDestUser->GetPortrait() );
            Msg2.SetDataID( pDestUser->GetSex() );

            //通知所有组内的玩家
            for( int i=0; i<pTeam->MemberCount(); i++ )
            {
                TEAMMEMBER* pMember = pTeam->Member( i );
                if( pMember==NULL )
                {
                    Assert(FALSE);
                    continue;
                }

                USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
                if( pUser==NULL )
                {//如果队员离线,则用户数据是空
                    continue;
                }
                
                ID_t ServerID = pUser->GetServerID();
                ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID );
                if( pServerPlayer==NULL )
                {
                    Assert(FALSE);
                    continue;
                }

                Msg2.SetPlayerID( pUser->GetPlayerID() );
                pServerPlayer->SendPacket( &Msg2 );

                if( pMember->m_Member != dGuid )
                { // 将自己以外的玩家传给新玩家
                    Msg1.SetReturn( TEAM_RESULT_TEAMREFRESH );
                    Msg1.SetName( pUser->GetName() );
                    Msg1.SetIcon( pUser->GetPortrait() );
                    Msg1.SetDataID( pUser->GetSex() );

                    Msg1.SetGUID( pMember->m_Member );
                    Msg1.SetGUIDEx( pUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
                    Msg1.SetSceneID( pUser->GetSceneID() );

                    pDestServerPlayer->SendPacket( &Msg1 );
                }

            }

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetInviteHandler...Success! sGUID=%X dGUID=%X TeamID=%d", 
                sGuid, dGuid, tid );
        }
    }

    return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

    return PACKET_EXE_ERROR;
}
uint GWTeamRetApplyHandler::Execute( GWTeamRetApply* pPacket, Player* pPlayer )
{
    __ENTER_FUNCTION

    GUID_t sGuid = pPacket->GetSourGUID();//申请人的GUID
    GUID_t lGuid = pPacket->GetLeaderGUID();//队长的GUID

    USER* pLeaderUser = g_pOnlineUser->FindUser( lGuid );
    if( pLeaderUser==NULL )
    {
        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...User Leader GUID=%X not find!",
                      lGuid );

        return PACKET_EXE_CONTINUE;
    }

    ServerPlayer* pLeaderServerPlayer = (ServerPlayer*)pPlayer;

    USER* pSourUser = g_pOnlineUser->FindUser( sGuid );
    if( pSourUser==NULL )
    {
        if( pPacket->GetReturn()==TRUE )
        {
            WGTeamError dMsg;
            dMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
            dMsg.SetGUID( pLeaderUser->GetGUID() );
            dMsg.SetErrorCode( TEAM_ERROR_TARGETNOTONLINE );
            pLeaderServerPlayer->SendPacket( &dMsg );
        }

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...User Sour GUID=%X not find!",
                      sGuid );

        return PACKET_EXE_CONTINUE;
    }

    ID_t SourServerID = pSourUser->GetServerID();
    ServerPlayer* pSourServerPlayer = g_pServerManager->GetServerPlayer( SourServerID );
    if( pSourServerPlayer==NULL )
    {
        Assert(FALSE);
        return PACKET_EXE_CONTINUE;
    }

    if( pLeaderUser->IsEnemy( pSourUser->GetUserCampData() ) )
    {
        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Lead Name=%s, Invite Name=%s are enemy!",
                      pLeaderUser->GetName(), pSourUser->GetName() );

        return PACKET_EXE_CONTINUE;
    }

    if( pPacket->GetReturn()==FALSE )
    {   //队长不同意
        WGTeamError sMsg;
        sMsg.SetPlayerID( pSourUser->GetPlayerID() );
        sMsg.SetGUID( pLeaderUser->GetGUID() );
        sMsg.SetErrorCode( TEAM_ERROR_APPLYLEADERREFUSE );
        pSourServerPlayer->SendPacket( &sMsg );

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Leader lGUID=%X Refuse sGUID=%X join team!",
                      lGuid, sGuid );
    }
    else if( pSourUser->GetTeamID() != INVALID_ID )
    {   //申请人已经属于某个队伍
        //WGTeamError sMsg;
        //sMsg.SetPlayerID( pSourUser->m_PlayerID );
        //sMsg.SetErrorCode( TEAM_ERROR_APPLYSOURHASTEAM );
        //pSourServerPlayer->SendPacket( &sMsg );

        WGTeamError lMsg;
        lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
        lMsg.SetGUID( pLeaderUser->GetGUID() );
        lMsg.SetErrorCode( TEAM_ERROR_APPLYSOURHASTEAM );
        pLeaderServerPlayer->SendPacket( &lMsg );

        Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Leader lGUID=%X, sGUID=%X has team!",
                      lGuid, sGuid );
    }
    else
    {   //队伍存在
        TeamID_t tid = pLeaderUser->GetTeamID();
        Team* pTeam = g_pTeamList->GetTeam( tid );
        Assert( pTeam );

        if( pTeam->IsFull() )
        {   //队伍人数已经满了
            WGTeamError sMsg;
            sMsg.SetPlayerID( pSourUser->GetPlayerID() );
            sMsg.SetGUID( pLeaderUser->GetGUID() );
            sMsg.SetErrorCode( TEAM_ERROR_APPLYTEAMFULL );
            pSourServerPlayer->SendPacket( &sMsg );

            WGTeamError lMsg;
            lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
            lMsg.SetGUID( pLeaderUser->GetGUID() );
            lMsg.SetErrorCode( TEAM_ERROR_TEAMFULL );
            pLeaderServerPlayer->SendPacket( &lMsg );

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Team Full  sGUID=%X lGUID=%X",
                          sGuid, lGuid );
        }
        else if( pTeam->Leader()->m_Member != lGuid )
        {   //队长GUID和队伍中记录的队长GUID不符
            WGTeamError sMsg;
            sMsg.SetPlayerID( pSourUser->GetPlayerID() );
            sMsg.SetGUID( pLeaderUser->GetGUID() );
            sMsg.SetErrorCode( TEAM_ERROR_APPLYLEADERGUIDERROR );
            pSourServerPlayer->SendPacket( &sMsg );

            WGTeamError lMsg;
            lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
            lMsg.SetGUID( pLeaderUser->GetGUID() );
            lMsg.SetErrorCode( TEAM_ERROR_APPLYLEADERGUIDERROR );
            pLeaderServerPlayer->SendPacket( &lMsg );

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Team Full  sGUID=%X lGUID=%X",
                          sGuid, lGuid );
        }
        else
        {   //加入
            //将玩家加入队伍
            TEAMMEMBER Member;
            Member.m_Member = sGuid;
            pTeam->AddMember( &Member );

            //设置玩家队伍信息
            pSourUser->SetTeamID( pTeam->GetTeamID() );
            WGTeamResult Msg1; // 发给新队员的
            Msg1.SetPlayerID( pSourUser->GetPlayerID() );
            Msg1.SetTeamID( tid );
            WGTeamResult Msg2; // 发给每个队员的
            Msg2.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
            Msg2.SetTeamID( tid );
            Msg2.SetGUID( sGuid );
            Msg2.SetGUIDEx( pSourUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
            Msg2.SetSceneID( pSourUser->GetSceneID() );
            Msg2.SetName( pSourUser->GetName() );
            Msg2.SetIcon( pSourUser->GetPortrait() );
            Msg2.SetDataID( pSourUser->GetSex() );

            //通知所有组内的玩家
            for( int i=0; i<pTeam->MemberCount(); i++ )
            {
                TEAMMEMBER* pMember = pTeam->Member( i );
                if( pMember==NULL )
                {
                    Assert(FALSE);
                    continue;
                }

                USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
                if( pUser==NULL )
                {
                    Assert(FALSE);
                    continue;
                }

                ID_t ServerID = pUser->GetServerID();
                ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID );
                if( pServerPlayer==NULL )
                {
                    Assert(FALSE);
                    continue;
                }

                Msg2.SetPlayerID( pUser->GetPlayerID() );
                pServerPlayer->SendPacket( &Msg2 );

                if( pMember->m_Member != sGuid )
                {   // 将自己以外的玩家传给新玩家
                    Msg1.SetReturn( TEAM_RESULT_TEAMREFRESH );
                    Msg1.SetName( pUser->GetName() );
                    Msg1.SetIcon( pUser->GetPortrait() );
                    Msg1.SetDataID( pUser->GetSex() );

                    Msg1.SetGUID( pMember->m_Member );
                    Msg1.SetGUIDEx( pUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
                    Msg1.SetSceneID( pUser->GetSceneID() );

                    pSourServerPlayer->SendPacket( &Msg1 );
                }
            }//end for

            Log::SaveLog( WORLD_LOGFILE, "GWTeamRetApplyHandler...Success!  sGUID=%X lGUID=%X",
                          sGuid, lGuid );
        }

    }




    return PACKET_EXE_CONTINUE;

    __LEAVE_FUNCTION

    return PACKET_EXE_ERROR;
}
예제 #4
0
uint GWChatHandler::Execute( GWChat* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION

	ServerPlayer* pSourServerPlayer = (ServerPlayer*)pPlayer ;

	GUID_t SourGUID = pPacket->GetSourGUID() ;

	USER* pSourUser = g_pOnlineUser->FindUser( SourGUID ) ;
	if( pSourUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWChatHandler...User Sour GUID=%X not find!", 
			SourGUID ) ;
		return PACKET_EXE_CONTINUE ;
	}

	WGChat Msg ;
	Msg.SetChatType( pPacket->GetChatType() ) ;
	Msg.SetContexSize( pPacket->GetContexSize() ) ;
	Msg.SetContex( pPacket->GetContex() ) ;
	Msg.SetSourNameSize( (BYTE)(strlen(pSourUser->GetName())) ) ;
	Msg.SetSourName( pSourUser->GetName() ) ;
	Msg.SetCampID( pSourUser->GetUserCampData()->m_nCampID );
	Msg.SetWorldChatID( g_pChatCenter->NextWorldChatID() ) ;

	switch( pPacket->GetChatType() )
	{
	case CHAT_TYPE_NORMAL:
		{
			Assert(FALSE) ;
		}
		break ;
	case CHAT_TYPE_GUILD:
		{
			Msg.SetGuildID( pPacket->GetGuildID() ) ;
			g_pServerManager->BroadCastServer( &Msg ) ;
		}
		break ;
	case CHAT_TYPE_MENPAI:
		{
			Msg.SetMenpaiID( pPacket->GetMenpaiID() ) ;
			g_pServerManager->BroadCastServer( &Msg ) ;
		}
		break ;
	case CHAT_TYPE_SYSTEM:
	case CHAT_TYPE_SCENE:
		{
			g_pServerManager->BroadCastServer( &Msg ) ;
		}
		break ;
	case CHAT_TYPE_TEAM:
		{
			Team* pTeam = g_pTeamList->GetTeam( pSourUser->GetTeamID() ) ;
			if( pTeam==NULL )
				break ;

			for( int i=0; i<pTeam->MemberCount(); i++ )
			{
				TEAMMEMBER* pMember = pTeam->Member( i ) ;
				if( pMember==NULL )
				{
					Assert(FALSE) ;
					continue ;
				}

				USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member ) ;
				if( pUser==NULL )
				{//如果队员离线,则用户数据是空
					continue ;
				}
				
				ID_t ServerID = pUser->GetServerID() ;
				ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID ) ;
				if( pServerPlayer==NULL )
				{
					Assert(FALSE) ;
					continue ;
				}

				Msg.SetPlayerID( pUser->GetPlayerID() ) ;

				pServerPlayer->SendPacket( &Msg ) ;
			}
		}
		break ;
	case CHAT_TYPE_TELL:
		{
			USER* pUser = g_pOnlineUser->FindUser( pPacket->GetTargetName() ) ;

			if( pUser )
			{
				if( pSourUser->IsEnemy( pUser->GetUserCampData() ) )
					pUser = NULL;	//如果是敌对阵营,处理方法跟查无此人相同!!
									//按道理说是不能密的哦~~
			}

			if( pUser==NULL )
			{//如果队员离线,则用户数据是空
				CHAR* szName="system" ;
				CHAR szContex[32] ;
				sprintf( szContex, "@@%s", pPacket->GetTargetName() ) ;

				WGChat MsgR ;
				MsgR.SetPlayerID( pSourUser->GetPlayerID() ) ;
				MsgR.SetChatType( CHAT_TYPE_SELF ) ;
				MsgR.SetContexSize( sizeof(szContex) ) ;
				MsgR.SetContex( szContex ) ;
				MsgR.SetSourNameSize( (BYTE)(strlen(szName)) ) ;
				MsgR.SetSourName( szName ) ;
				MsgR.SetWorldChatID( g_pChatCenter->NextWorldChatID() ) ;
				MsgR.SetCampID( pSourUser->GetUserCampData()->m_nCampID );
				
				pSourServerPlayer->SendPacket( &MsgR ) ;

				break ;
			}
				
			ID_t ServerID = pUser->GetServerID() ;
			ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID ) ;
			if( pServerPlayer==NULL )
			{
				Assert(FALSE) ;
				break ;
			}

			Msg.SetPlayerID( pUser->GetPlayerID() ) ;

			pServerPlayer->SendPacket( &Msg ) ;
		}
		break ;
	case CHAT_TYPE_CHANNEL:
		{
			ChatChannel* pChannel = g_pChatCenter->GetChatChannel( pPacket->GetChannelID() ) ;
			if( pChannel==NULL )
				break ;

			for( int i=0; i<pChannel->MemberCount(); i++ )
			{
				GUID_t memberguid = pChannel->Member(i) ;
				if( memberguid==INVALID_ID )
				{
					Assert(FALSE) ;
					continue ;
				}

				USER* pUser = g_pOnlineUser->FindUser( memberguid ) ;
				if( pUser==NULL )
				{//如果队员离线,则用户数据是空
					continue ;
				}
				
				ID_t ServerID = pUser->GetServerID() ;
				ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID ) ;
				if( pServerPlayer==NULL )
				{
					Assert(FALSE) ;
					continue ;
				}

				Msg.SetPlayerID( pUser->GetPlayerID() ) ;

				pServerPlayer->SendPacket( &Msg ) ;
			}
		}
		break ;
	default :
		{
			Assert(FALSE) ;
		}
		break ;
	};

	g_pChatCenter->PushChatPacket( pPacket ) ;

	Log::SaveLog( WORLD_LOGFILE, "GWChatHandler...GUID=%X ChatType=%d Contex=%s", 
		SourGUID, pPacket->GetChatType(), pPacket->GetContex() ) ;

	return PACKET_EXE_NOTREMOVE ;//不能删除pPacket, 已经放入预存管道

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR ;
}
예제 #5
0
uint GWTeamLeaderRetInviteHandler::Execute( GWTeamLeaderRetInvite* pPacket, Player* pPlayer )
{
	__ENTER_FUNCTION

	GUID_t sGuid = pPacket->GetSourGUID();//邀请人的GUID
	GUID_t dGuid = pPacket->GetDestGUID();//被邀请人的GUID
	GUID_t lGuid = pPacket->GetLeaderGUID();//队长的GUID


	USER* pSourUser = g_pOnlineUser->FindUser( sGuid );
	if( pSourUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...User Sour GUID=%X not find!", 
			sGuid );

		return PACKET_EXE_CONTINUE;
	}

	USER* pDestUser = g_pOnlineUser->FindUser( dGuid );
	if( pDestUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...User Dest GUID=%X not find!", 
			dGuid );

		return PACKET_EXE_CONTINUE;
	}

	USER* pLeaderUser = g_pOnlineUser->FindUser( lGuid );
	if( pLeaderUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...User Leader GUID=%X not find!", 
			lGuid );

		return PACKET_EXE_CONTINUE;
	}

	ID_t SourServerID = pSourUser->GetServerID();
	ServerPlayer* pSourServerPlayer = g_pServerManager->GetServerPlayer( SourServerID );
	if( pSourServerPlayer==NULL )
	{
		Assert(FALSE);
		return PACKET_EXE_CONTINUE;
	}

	ID_t DestServerID = pDestUser->GetServerID();
	ServerPlayer* pDestServerPlayer = g_pServerManager->GetServerPlayer( DestServerID );
	if( pDestServerPlayer==NULL )
	{
		Assert(FALSE);
		return PACKET_EXE_CONTINUE;
	}

	ServerPlayer* pLeaderServerPlayer = (ServerPlayer*)pPlayer;

	if( pSourUser->GetTeamID() != pLeaderUser->GetTeamID() )
	{ // 邀请人和队长已经不在一个队伍了
		WGTeamError lMsg;
		lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
		lMsg.SetErrorCode( TEAM_ERROR_INVITERNOTINTEAM );
		pLeaderServerPlayer->SendPacket( &lMsg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...Inviter(sGUID=%X) invited dGUID=%X not in Leader's(lGUID=%X) team.", 
			sGuid, dGuid, lGuid );
	}

	//判断双方是否同一国家,不同国家不能组队
	INT SourCountry = pSourUser->GetCountry();
	INT DestCountry = pDestUser->GetCountry();

	//国家不同
	if ( SourCountry != DestCountry ) 
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...SourCountry %d != DestCountry %d. ", 
			SourCountry,DestCountry );
		return PACKET_EXE_CONTINUE;	
	}


	else if( pPacket->GetReturn()==FALSE )
	{//队长不同意
		WGTeamError sMsg;
		sMsg.SetPlayerID( pSourUser->GetPlayerID() );
		sMsg.SetErrorCode( TEAM_ERROR_INVITELEADERREFUSE );
		pSourServerPlayer->SendPacket( &sMsg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...Invite Leader Refuse sGUID=%X dGUID=%X lGUID=%X", 
			sGuid, dGuid, lGuid );
	}
	else if( pDestUser->GetTeamID() != INVALID_ID )
	{//被邀请人已有队伍了
		WGTeamError sMsg;
		sMsg.SetPlayerID( pSourUser->GetPlayerID() );
		sMsg.SetErrorCode( TEAM_ERROR_INVITEDESTHASTEAM );
		pSourServerPlayer->SendPacket( &sMsg );

		WGTeamError lMsg;
		lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
		lMsg.SetErrorCode( TEAM_ERROR_INVITEDESTHASTEAM );
		pLeaderServerPlayer->SendPacket( &lMsg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...DestInTeam  sGUID=%X dGUID=%X lGUID=%X", 
			sGuid, dGuid, lGuid );
	}
	else
	{//队伍存在
		TeamID_t tid = pLeaderUser->GetTeamID();
		Team* pTeam = g_pTeamList->GetTeam( tid );
		Assert( pTeam );
		if( pTeam->IsFull() )
		{//队伍人数已经满了
			WGTeamError sMsg;
			sMsg.SetPlayerID( pSourUser->GetPlayerID() );
			sMsg.SetErrorCode( TEAM_ERROR_INVITETEAMFULL );
			pSourServerPlayer->SendPacket( &sMsg );

			WGTeamError lMsg;
			lMsg.SetPlayerID( pLeaderUser->GetPlayerID() );
			lMsg.SetErrorCode( TEAM_ERROR_INVITETEAMFULL );
			pLeaderServerPlayer->SendPacket( &lMsg );

			Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...Team Full  sGUID=%X dGUID=%X lGUID=%X", 
				sGuid, dGuid, lGuid );
		}
		else
		//{//同意被邀请人加入队伍
		//	//将玩家加入队伍
		//	TEAMMEMBER Member;
		//	Member.m_Member = dGuid;
		//	Member.m_GUIDEx = pDestUser->GetPlayerID();
		//	Member.m_SceneID = pDestUser->GetSceneID();
		//	strncpy((char*)Member.m_Name,(char*)pDestUser->GetName(),MAX_CHARACTER_NAME-1);
		//	Member.m_nPortrait = pDestUser->GetPortrait();
		//	Member.m_uDataID = pDestUser->GetSex();
		//	Member.m_uFamily = pDestUser->GetMenpai();
		//	Member.m_Level   = pDestUser->GetLevel();
		//	pTeam->AddMember( &Member );

		//	//设置玩家队伍信息
		//	pDestUser->SetTeamID( pTeam->GetTeamID() );
		//	WGTeamResult Msg1; // 发给新队员的
		//	Msg1.SetPlayerID( pDestUser->GetPlayerID() );
		//	Msg1.SetTeamID( tid );
		//	WGTeamResult Msg2; // 发给每个队员的
		//	Msg2.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
		//	Msg2.SetTeamID( tid );
		//	Msg2.SetGUID( dGuid );
		//	Msg2.SetGUIDEx( pDestUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
		//	Msg2.SetSceneID( pDestUser->GetSceneID() );
		//	Msg2.SetName( pDestUser->GetName() );
		//	Msg2.SetIcon( pDestUser->GetPortrait() );
		//	Msg2.SetDataID( pDestUser->GetSex() );
		//	Msg2.SetFamily( pDestUser->GetMenpai() );
		//	Msg2.SetLevel( pDestUser->GetLevel() );

		//	//通知所有组内的玩家
		//	for( int i=0; i<pTeam->MemberCount(); i++ )
		//	{
		//		TEAMMEMBER* pMember = pTeam->Member( i );
		//		if( pMember==NULL )
		//		{
		//			Assert(FALSE);
		//			continue;
		//		}

		//		if( pMember->m_Member != dGuid )
		//		{ // 将自己以外的玩家传给新玩家
		//			Msg1.SetReturn( TEAM_RESULT_TEAMREFRESH );
		//			Msg1.SetName( pMember->m_Name );
		//			Msg1.SetIcon( pMember->m_nPortrait );
		//			Msg1.SetDataID( pMember->m_uDataID );
		//			Msg1.SetFamily( pMember->m_uFamily );

		//			Msg1.SetGUID( pMember->m_Member );
		//			Msg1.SetGUIDEx( pMember->m_GUIDEx ); // 将玩家的 PlayerID 传回
		//			Msg1.SetSceneID( pMember->m_SceneID );
		//			Msg1.SetLevel( pMember->m_Level );

		//			pDestServerPlayer->SendPacket( &Msg1 );
		//		}

		//		USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
		//		if( pUser==NULL )
		//		{//如果队员离线,则用户数据是空
		//			continue;
		//		}

		//		ID_t ServerID = pUser->GetServerID();
		//		ServerPlayer* pServerPlayer = g_pServerManager->GetServerPlayer( ServerID );
		//		if( pServerPlayer==NULL )
		//		{
		//			Assert(FALSE);
		//			continue;
		//		}

		//		Msg2.SetPlayerID( pUser->GetPlayerID() );
		//		pServerPlayer->SendPacket( &Msg2 );
		//	}


		//	Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...AgreeAndInvite!  sGUID=%X dGUID=%X lGUID=%X", 
		//		sGuid, dGuid, lGuid );
		//}
		{
			//原先是不用被邀请者同意,直接添加到队伍中,现在得被邀请者同意才能添加到队伍中
			ID_t DestServerID = pDestUser->GetServerID();
			ServerPlayer* pDestServerPlayer = g_pServerManager->GetServerPlayer( DestServerID );
			if( pDestServerPlayer )
			{
				//向被邀请人发送邀请消息
				WGTeamAskInvite Msg;
				Msg.SetPlayerID( pDestUser->GetPlayerID() );
				Msg.SetGUID( lGuid );//在这得改成队长的ID否则又是队员邀请,进入了死循环

				if ( pSourUser->GetTeamID() != INVALID_ID )
				{
					Team* pTeam = g_pTeamList->GetTeam( pSourUser->GetTeamID() );
					Assert( pTeam );

					for( INT i=0; i<pTeam->MemberCount(); ++i )
					{
						WGTeamAskInvite::InviterInfo info;
						TEAMMEMBER* pMember = pTeam->Member( i );
						if( pMember == NULL )
						{
							Assert(FALSE);
							continue ;
						}

						USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
						if( pUser == NULL )
						{//如果队员离线,则用户数据是空
							info.m_PlayerID = INVALID_ID;
							//continue ;
						}
						else
							info.m_PlayerID = pUser->GetPlayerID();

						info.m_NickSize = (UCHAR)strlen(pMember->m_Name);
						strncpy( (CHAR*)info.m_szNick, pMember->m_Name, info.m_NickSize );
						info.m_uFamily = pMember->m_uFamily;
						info.m_Scene = pMember->m_SceneID;
						info.m_Level = pMember->m_Level;
						info.m_uDataID = pMember->m_uDataID;

						Msg.AddInviterInfo( info );
					}
				}
				else
				{
					//	Msg.SetMemberCount( 1 );
					WGTeamAskInvite::InviterInfo info;
					info.m_PlayerID = pSourUser->GetPlayerID();
					info.m_NickSize = (UCHAR)strlen(pSourUser->GetName());
					strncpy( (CHAR*)info.m_szNick, pSourUser->GetName(), info.m_NickSize );
					info.m_uFamily = pSourUser->GetMenpai();
					info.m_Scene = pSourUser->GetSceneID();
					info.m_Level = pSourUser->GetLevel();
					info.m_uDataID = pSourUser->GetSex();

					Msg.AddInviterInfo( info );
				}

				pDestServerPlayer->SendPacket( &Msg );
			}
			else
			{
				Assert(FALSE);
			}

			Log::SaveLog( WORLD_LOGFILE, "GWTeamLeaderRetInviteHandler...AskInvite SourGUID=%X DestGUID=%X", 
				sGuid, dGuid );

		}
	}

	return PACKET_EXE_CONTINUE;

	__LEAVE_FUNCTION

		return PACKET_EXE_ERROR;
}
uint GWTeamInviteHandler::Execute( GWTeamInvite* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION

	ServerPlayer* pSourServerPlayer = (ServerPlayer*)pPlayer;

	GUID_t sGuid = pPacket->GetSourGUID();

	USER* pSourUser = g_pOnlineUser->FindUser( sGuid );
	if( pSourUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...User Sour GUID=%X not find!", 
			sGuid );

		return PACKET_EXE_CONTINUE;
	}

	USER* pDestUser = g_pOnlineUser->FindUser( pPacket->GetDestName() );
	if( pDestUser==NULL )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...User Dest Name=%s not find!", 
			pPacket->GetDestName() );

		return PACKET_EXE_CONTINUE;
	}

	GUID_t dGuid = pDestUser->GetGUID();

	if( pSourUser->IsEnemy( pDestUser->GetUserCampData() ) )
	{
		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...Sour Name=%s, Dest Name=%s are enemy!", 
			pSourUser->GetName(), pDestUser->GetName() );

		return PACKET_EXE_CONTINUE;
	}

	// 设置了拒绝被邀请
	if( pDestUser->IsRefuseTeamInvite() )
	{
		WGTeamError Msg;
		Msg.SetPlayerID( pSourUser->GetPlayerID() );
		Msg.SetGUID(sGuid);
		Msg.SetErrorCode(TEAM_ERROR_REFUSEINVITESETTING);
		pSourServerPlayer->SendPacket( &Msg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...DestGUID=%X refuse to be invited. ", 
			dGuid );
		return PACKET_EXE_CONTINUE;
	}

	if( pDestUser->GetTeamID() != INVALID_ID )
	{//被邀请人已经属于某个队伍了
		WGTeamError Msg;
		Msg.SetPlayerID( pSourUser->GetPlayerID() );
		Msg.SetGUID(sGuid);
		Msg.SetErrorCode(TEAM_ERROR_INVITEDESTHASTEAM);
		pSourServerPlayer->SendPacket( &Msg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...DestInTeam SourGUID=%X DestGUID=%X", 
			sGuid, dGuid );
	}
	else if( sGuid==dGuid && pSourUser->GetTeamID()==INVALID_ID )
	{//邀请人和被邀请人属于同一个人, 且不属于某个队伍
		//自建队伍
		TeamID_t tid = g_pTeamList->CreateTeam( );
		Assert( tid!=INVALID_ID );
		Team* pTeam = g_pTeamList->GetTeam( tid );
		Assert( pTeam );

		//将玩家加入队伍中
		TEAMMEMBER Member;
		Member.m_Member = sGuid;
		pTeam->AddMember( &Member );

		//设置玩家队伍数据
		pSourUser->SetTeamID( tid );

		//返回结果
		WGTeamResult Msg;
		Msg.SetPlayerID( pSourUser->GetPlayerID() );
		Msg.SetReturn( TEAM_RESULT_MEMBERENTERTEAM );
		Msg.SetGUID( sGuid );
		Msg.SetTeamID( tid );
		Msg.SetGUIDEx( pSourUser->GetPlayerID() ); // 将玩家的 PlayerID 传回
		Msg.SetSceneID( pSourUser->GetSceneID() );
		Msg.SetDataID( pSourUser->GetSex() );
		Msg.SetIcon( pSourUser->GetPortrait() );

		pSourServerPlayer->SendPacket( &Msg );

		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...CreateTeam GUID=%X TeamID=%d", 
			sGuid, tid );
	}
	else
	{
		if ( pSourUser->GetTeamID() != INVALID_ID )
		{
			//邀请人已经有一个队伍
			Team* pTeam = g_pTeamList->GetTeam( pSourUser->GetTeamID() );
			Assert( pTeam );

			GUID_t tlGUID = pTeam->Leader()->m_Member; // 队长GUID

			//邀请人不是队长,要给队长发送请求
			if ( tlGUID != sGuid )
			{ // 不是队长的情况
				USER* pLeaderUser = g_pOnlineUser->FindUser( tlGUID );
				if( pLeaderUser == NULL )
				{
					Assert(FALSE);
				}

				ID_t LeaderServerID = pLeaderUser->GetServerID();
				ServerPlayer* pLeaderServerPlayer = g_pServerManager->GetServerPlayer( LeaderServerID );
				if( pLeaderServerPlayer==NULL )
				{
					Assert(FALSE);
				}

				WGTeamLeaderAskInvite Msg;
				Msg.SetPlayerID( pLeaderUser->GetPlayerID() );//队长的Player_t
				Msg.SetSourGUID( sGuid );		//邀请人
				Msg.SetDestGUID( dGuid );		//被要请人
				Msg.SetSourName( pSourUser->GetName() );
				Msg.SetDestName( pDestUser->GetName() );
				Msg.SetGUID(tlGUID);

				pLeaderServerPlayer->SendPacket( &Msg );

				Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...TeamLeaderAskInvite SourGUID=%X DestGUID=%X", 
					sGuid, dGuid );
				return PACKET_EXE_CONTINUE;
			}
		}

		ID_t DestServerID = pDestUser->GetServerID();
		ServerPlayer* pDestServerPlayer = g_pServerManager->GetServerPlayer( DestServerID );
		if( pDestServerPlayer )
		{//向被邀请人发送邀请消息
			WGTeamAskInvite Msg;
			Msg.SetPlayerID( pDestUser->GetPlayerID() );
			Msg.SetdGUID( dGuid );
			Msg.SetsGUID( sGuid );

			if ( pSourUser->GetTeamID() != INVALID_ID )
			{
				Team* pTeam = g_pTeamList->GetTeam( pSourUser->GetTeamID() );
				Assert( pTeam );

			//	Msg.SetMemberCount( pTeam->MemberCount() );

				for( INT i=0; i<pTeam->MemberCount(); ++i )
				{
					WGTeamAskInvite::InviterInfo info;
					TEAMMEMBER* pMember = pTeam->Member( i );
					if( pMember == NULL )
					{
						Assert(FALSE);
						continue ;
					}

					USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
					if( pUser == NULL )
					{//如果队员离线,则用户数据是空
						continue ;
					}

					info.m_PlayerID = pUser->GetPlayerID();
					info.m_NickSize = (UCHAR)strlen(pUser->GetName());
					strncpy( (CHAR*)info.m_szNick, pUser->GetName(), info.m_NickSize );
					info.m_uFamily = pUser->GetMenpai();
					info.m_Scene = pUser->GetSceneID();
					info.m_Level = pUser->GetLevel();
					info.m_uDataID = pUser->GetSex();

					Msg.AddInviterInfo( info );
				}
			}
			else
			{
			//	Msg.SetMemberCount( 1 );
				WGTeamAskInvite::InviterInfo info;
				info.m_PlayerID = pSourUser->GetPlayerID();
				info.m_NickSize = (UCHAR)strlen(pSourUser->GetName());
				strncpy( (CHAR*)info.m_szNick, pSourUser->GetName(), info.m_NickSize );
				info.m_uFamily = pSourUser->GetMenpai();
				info.m_Scene = pSourUser->GetSceneID();
				info.m_Level = pSourUser->GetLevel();
				info.m_uDataID = pSourUser->GetSex();

				Msg.AddInviterInfo( info );
			}

			pDestServerPlayer->SendPacket( &Msg );
		}
		else
		{
			Assert(FALSE);
		}

		Log::SaveLog( WORLD_LOGFILE, "GWTeamInviteHandler...AskInvite SourGUID=%X DestGUID=%X", 
			sGuid, dGuid );

	}


	return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR;
}
uint GWTeamMemberEnterSceneHandler::Execute( GWTeamMemberEnterScene* 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, "GWTeamMemberEnterScene...User GUID=%X not find!", 
			guid ) ;
		return PACKET_EXE_CONTINUE;
	}

	if( pUser->GetTeamID() == INVALID_ID )
	{ // 这里以后要加上回馈信息,删除服务器端错误的队伍信息
		Assert( FALSE && "该玩家没有队伍!" );
		return PACKET_EXE_CONTINUE;
	}

	Team* pTeam = g_pTeamList->GetTeam( pUser->GetTeamID() );
	if( pTeam==NULL )
	{
		Assert(FALSE) ;
		return PACKET_EXE_CONTINUE ;
	}

	WGTeamResult Msg;
	Msg.SetReturn( TEAM_RESULT_ENTERSCENE );
	Msg.SetTeamID( pUser->GetTeamID() );
	Msg.SetGUID( pPacket->GetGUID() );
	Msg.SetSceneID( pPacket->GetSceneID() );
	Msg.SetGUIDEx( pPacket->GetPlayerID() );
	Msg.SetIcon( pUser->GetPortrait() );
	Msg.SetFamily( pUser->GetMenpai() );
	Msg.SetDataID( pUser->GetSex() );
	Msg.SetLevel( pUser->GetLevel() );

	for(int i=0; i<pTeam->MemberCount(); ++i)
	{
		TEAMMEMBER* pMember = pTeam->Member( i );
		if( pMember==NULL )
		{
			Assert(FALSE);
			continue;
		}

		USER* pUser = g_pOnlineUser->FindUser( pMember->m_Member );
		if( pUser==NULL )
		{
			Assert(FALSE);
			continue;
		}

		pServerPlayer = g_pServerManager->GetServerPlayer( pUser->GetServerID() );
		if( pServerPlayer == NULL )
		{
			Assert(FALSE);
			continue;
		}

		Msg.SetPlayerID( pUser->GetServerID() );
		pServerPlayer->SendPacket( &Msg );
	}

	Log::SaveLog( WORLD_LOGFILE, "GWTeamMemberEnterScene...Success!  GUID=%X", guid );

	return PACKET_EXE_CONTINUE;

__LEAVE_FUNCTION

	return PACKET_EXE_ERROR;
}
예제 #8
0
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;
}