UINT GWCountryInfoRequestHandler::Execute( GWCountryInfoRequest* pPacket, Player* pPlayer ) { __ENTER_FUNCTION ServerPlayer* pServerPlayer = (ServerPlayer*)pPlayer; GUID_t guid = pPacket->GetGuid(); USER* pUser = g_pOnlineUser->FindUser( guid ); if( pUser == NULL ) { Log::SaveLog( WORLD_LOGFILE, "GWCountryInfoRequestHandler...User GUID=%X not find!", guid ); return PACKET_EXE_CONTINUE; } _COUNTRY country; g_pCountryManager->GetCountryInfo(pUser->GetCountry(), country); WGCountryInfoConfirm Msg; Msg.SetPlayerID( pUser->GetPlayerID() ); COUNTRY_CGW_COUNTRY_INFO info; info.m_CountryID = pUser->GetCountry(); memcpy(&info.m_CountryInfo, &country, sizeof(_COUNTRY)); Msg.SetCountryInfo( &info ); pServerPlayer->SendPacket( &Msg ); Log::SaveLog( WORLD_LOGFILE, "GWCountryInfoRequestHandler...User GUID=%X send CountryInfo!", guid ); return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT GWCountryAPHandler::Execute( GWCountryAP* pPacket, Player* pPlayer ) { __ENTER_FUNCTION ServerPlayer* pServerPlayer = (ServerPlayer*)pPlayer; GUID_t guid = pPacket->GetGuid(); USER* pUser = g_pOnlineUser->FindUser( guid ); if( pUser == NULL ) { Log::SaveLog( WORLD_LOGFILE, "GWCountryAPHandler...User GUID=%X not find!", guid ); return PACKET_EXE_CONTINUE; } INT nCountry = pUser->GetCountry(); Country *pCountry = g_pCountryManager->GetCountry(nCountry); if (pCountry) { if (pUser->GetGUID() == pCountry->GetCountryInfo()->m_GuoWang) { BYTE cType = pPacket->GetType(); INT nAP = pPacket->GetAP(); switch (cType) { case 0: pCountry->AddActionPoint(nAP); break; case 1: pCountry->SubActionPoint(nAP); break; } Log::SaveLog( WORLD_LOGFILE, "GWCountryAPHandler...User GUID=%X ChangeAP = %d", guid, nAP); } } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT GWCountryFetchHandler::Execute( GWCountryFetch* pPacket, Player* pPlayer ) { __ENTER_FUNCTION ServerPlayer* pServerPlayer = (ServerPlayer*)pPlayer; GUID_t guid = pPacket->GetGuid(); USER* pUser = g_pOnlineUser->FindUser( guid ); if( pUser == NULL ) { Log::SaveLog( WORLD_LOGFILE, "GWCountryFetchHandler...User GUID=%X not find!", guid ); return PACKET_EXE_CONTINUE; } INT nCountry = pUser->GetCountry(); _COUNTRY *pCountry = g_pCountryManager->GetCountryInfo(nCountry); if (pCountry) { pCountry->SubGold(pPacket->GetGold()); Log::SaveLog( WORLD_LOGFILE, "GWCountryFetchHandler...User GUID=%X FetchGold = %d", guid, pPacket->GetGold()); WGCountryFetch Msg; Msg.SetPlayerID( pUser->GetPlayerID() ); Msg.SetGold( pPacket->GetGold() ); pServerPlayer->SendPacket( &Msg ); } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint GWAskUserDataHandler::Execute( GWAskUserData* pPacket, Player* pPlayer ) { __ENTER_FUNCTION ServerPlayer* pServerPlayer = (ServerPlayer*)pPlayer ; USER* pUser = g_pOnlineUser->FindUser( pPacket->GetGUID() ) ; WGRetUserData Msg ; if( pUser==NULL ) {//没有发现在“在线用户列表”里对应此GUID的用户 Log::SaveLog( WORLD_LOGFILE, "GWAskUserDataHandler...User GUID=%X not find!", pPacket->GetGUID() ) ; //如果是完整的Login 模式 if( g_Config.m_WorldInfo.m_EnableShareMem ) { Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_NOTFINDUSERDATA ) ; pServerPlayer->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } //不是完整的login 模式 //测试数据 pUser = g_pOnlineUser->LoadUser( pPacket->GetGUID(), pPacket->GetCountry(), pPacket->GetProfession(),pPacket->GetAccount()) ; if( pUser ) { _HUMAN_DB_LOAD* pDBHuman = &(pUser->GetFullUserData()->m_Human); pUser->SetTeamID( pUser->GetFullUserData()->m_Human.m_TeamID ); //临时测试数据 strncpy( pDBHuman->m_Name, pPacket->GetAccount(), MAX_CHARACTER_NAME-1 ) ; pDBHuman->m_Sex = (BOOL)(pPacket->GetGender()) ; pDBHuman->m_nCountry = pPacket->GetCountry(); pDBHuman->m_MenPai = pPacket->GetProfession(); pDBHuman->m_FaceModel = pPacket->GetFaceModel(); pUser->SetKey( pPacket->GetKey() ); //临时测试数据 g_pOnlineUser->OnUserLogin( pUser ) ; g_pCountryManager->AddCountryUser((COUNTRY_ATTRIBUTE)pUser->GetCountry(), pUser->GetGUID()); Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_USERDATA ) ; Msg.SetUserData( pUser->GetFullUserData() ) ; //回收数据块, 设置用户状态 g_pOnlineUser->DelData( pUser->GetFullUserData() ) ; //modified by wuwenbin pUser->SetFullUserData( NULL ); //为什么置空,随后FindUser时造成FULLUSERDATA结构为空 pUser->SetUserStatus( US_NORMAL ); pUser->ResetKickTime(); //将用户所在服务器的PlayerID记录到用户数据里 pUser->SetPlayerID( pPacket->GetPlayerID() ); pServerPlayer->SendPacket( &Msg ) ; Log::SaveLog( WORLD_LOGFILE, "GWAskUserDataHandler...Load GUID=%X OK!", pPacket->GetGUID() ) ; } else { Log::SaveLog( WORLD_LOGFILE, "ERROR:GWAskUserDataHandler...Load GUID=%X false!", pPacket->GetGUID() ) ; } //测试数据 // return PACKET_EXE_CONTINUE ; } int iUserStatus = pUser->UserStatus() ; if( pUser->GetKey() != pPacket->GetKey() ) {//验证码错误,警报,也许受到攻击 Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_KEYERROR ) ; pServerPlayer->SendPacket( &Msg ) ; Log::SaveLog( WORLD_LOGFILE, "GWAskUserDataHandler.Key Error..User GUID=%X Status=%d", pPacket->GetGUID(), iUserStatus ) ; return PACKET_EXE_CONTINUE ; } //将用户所在服务器的PlayerID记录到用户数据里 pUser->SetPlayerID( pPacket->GetPlayerID() ); switch( iUserStatus ) { case US_NONE: { Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_NOTFINDUSERDATA ) ; pServerPlayer->SendPacket( &Msg ) ; } break ; case US_HOLDUSERDATA: { Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_USERDATA ) ; Msg.SetUserData( pUser->GetFullUserData() ) ; g_pOnlineUser->DelData( pUser->GetFullUserData() ) ;//回收数据块 // modified by wuwenbin pUser->SetFullUserData( NULL ); //为什么置空,随后FindUser时造成FULLUSERDATA结构为空 pUser->SetUserStatus( US_NORMAL ); pUser->ResetKickTime(); pServerPlayer->SendPacket( &Msg ) ; } break ; case US_NORMAL: case US_OFFLINE: { Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_USERDATALIVING ) ; pUser->SetUserStatus( US_NORMAL ); pUser->ResetKickTime(); pServerPlayer->SendPacket( &Msg ) ; } break ; case US_CRASH_DOWN://取消对这种情况处理,由其他方式保证这种情况不会出现 { Assert(FALSE); /* WGRetUserData Msg ; Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_USERSERVERCRASH ) ; pServerPlayer->SendPacket( &Msg ) ; */ } break; case US_WAIT_SHUTDOWN: { Msg.SetPlayerID( pPacket->GetPlayerID() ) ; Msg.SetReturn( UDR_USERSERVERCRASH ) ; pServerPlayer->SendPacket( &Msg ) ; } break ; default : { Assert(FALSE) ; } break ; }; Log::SaveLog( WORLD_LOGFILE, "GWAskUserDataHandler...User GUID=%X Status=%d", pPacket->GetGUID(), iUserStatus ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint GWRegisterTeamRecruitHandler::Execute( GWRegisterTeamRecruit* 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, "GWRegisterTeamRecruit...User GUID=%X not find!", guid ) ; return PACKET_EXE_CONTINUE; } if ( pPacket->GetType() == LEADER_RECRUIT ) { //队长发布征兵请示 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 ; } if ( pTeam->Leader()->m_Member != guid ) { //Assert(FALSE&&"不是队长不可以申请招收队员!") ; return PACKET_EXE_CONTINUE ; } LEADER_RECRUIT_ATTRIB* pRecruit = pPacket->GetLeaderRecruit(); LEADER_INFO_NODE *pData = g_pTeamRecruitManager->GetLeaderNullNode(); pData->m_OwnerInfo.m_Level = pUser->GetLevel() ; pData->m_OwnerInfo.m_ManPai = pUser->GetMenpai(); pData->m_OwnerInfo.m_Country = pUser->GetCountry(); pData->m_OwnerInfo.m_NameLen = (UCHAR)strlen( pUser->GetName() ); strncpy((char*)pData->m_OwnerInfo.m_szUserName,(char*)pUser->GetName(),pData->m_OwnerInfo.m_NameLen) ; pData->SetRecruitData(*pRecruit); g_pTeamRecruitManager->Remove(guid,LEADER_RECRUIT); g_pTeamRecruitManager->Add(guid,pData,LEADER_RECRUIT); } else if ( pPacket->GetType() == MEMBER_RECRUIT ) { //队员发布征兵请示 MEMBER_RECRUIT_ATTRIB* pRecruit = pPacket->GetMemberRecruit(); MEMBER_INFO_NODE *pData = g_pTeamRecruitManager->GetMemberNullNode(); pData->m_OwnerInfo.m_Level = pUser->GetLevel() ; pData->m_OwnerInfo.m_ManPai = pUser->GetMenpai(); pData->m_OwnerInfo.m_Country = pUser->GetCountry(); pData->m_OwnerInfo.m_NameLen = (UCHAR)strlen( pUser->GetName() ); strncpy((char*)pData->m_OwnerInfo.m_szUserName,(char*)pUser->GetName(),pData->m_OwnerInfo.m_NameLen) ; pData->SetRecruitData(*pRecruit); g_pTeamRecruitManager->Remove(guid,MEMBER_RECRUIT); g_pTeamRecruitManager->Add(guid,pData,MEMBER_RECRUIT); } else { //Assert(FALSE&&"组队征兵时类型错误"); } Log::SaveLog( WORLD_LOGFILE, "GWRegisterTeamRecruit...Success! GUID=%X", guid ); return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
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; }